# Attribute system - CRUD Service

**URL:** <https://forum.shopware.com/t/attribute-system-crud-service/43856>\
**Category:** Programmierung\
**Created:** [20. Februar 2017 um 08:06 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856 "2017-02-20T08:06:34Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![zenit](https://avatars.discourse-cdn.com/v4/letter/z/a87d85/32.png) [@zenit](https://forum.shopware.com/u/zenit)\
**Post date:** [20. Februar 2017 um 08:06 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/1 "2017-02-20T08:06:34Z")

</div>

Hallo Community,&nbsp;

in der Shopware Doku zum CRUD Service ist beschrieben, wie ein Attribut zu löschen ist:&nbsp;[Attribute system](https://developers.shopware.com/developers-guide/attribute-system/#delete-an-existing-attribute)

```
container->get('shopware_attribute.crud_service');
        $service->delete('s_articles_attributes', 'my_column');
    }
}

```

&nbsp;

Baut man dies so in ein Plugin ein, kann es unter Umständen passieren, dass sich ein Plugin nicht mehr deinstallieren lässt, sollte das entsprechende Attribut nicht mehr existieren. Das kann meiner Meinung nach in zwei Situationen vorkommen:&nbsp;

1. Es gab einen Fehler bei Update oder Installation, sodass das Attribut&nbsp;nicht angelegt wurde
2. Der Nutzer hat das Attribut entfernt, sofern es bearbeitbar war.

**Wäre es daher nicht sinnvoll vor dem Löschen zu prüfen, ob zu löschendes Attribut existiert? Und wenn nicht einfach die Uninstall-Funktion weiter durchzuführen? Gibt Es hier einen Best-Practice?**

---

<div class="post-metadata">

**Author:** ![zenit](https://avatars.discourse-cdn.com/v4/letter/z/a87d85/32.png) [@zenit](https://forum.shopware.com/u/zenit)\
**Post date:** [22. Februar 2017 um 09:28 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/2 "2017-02-22T09:28:23Z")

</div>

Weiß keiner wie das am besten gemacht wird?

---

<div class="post-metadata">

**Author:** ![Thomas](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomas/32/8167_2.png) [@Thomas](https://forum.shopware.com/u/Thomas)\
**Post date:** [22. Februar 2017 um 12:22 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/3 "2017-02-22T12:22:25Z")

</div>

> [@zenit schrieb:](https://forum.shopware.com/profile/22455/zenit "zenit")
> 
> Weiß keiner wie das am besten gemacht wird?

Welche Shopware Version setzt Du den ein? &nbsp;Weil das prüfen ist ja enthalten:&nbsp;[https://github.com/shopware/shopware/blob/5.2/engine/Shopware/Bundle/AttributeBundle/Service/CrudService.php#L89](https://github.com/shopware/shopware/blob/5.2/engine/Shopware/Bundle/AttributeBundle/Service/CrudService.php#L89)

Du müsstest halt nur mit einem try/catch Block die Exception abfangen.

---

<div class="post-metadata">

**Author:** ![zenit](https://avatars.discourse-cdn.com/v4/letter/z/a87d85/32.png) [@zenit](https://forum.shopware.com/u/zenit)\
**Post date:** [22. Februar 2017 um 13:41 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/4 "2017-02-22T13:41:55Z")

</div>

hm… also in der Entwicklungsumgebung ist schwer zu sagen, welche Version das ist. Die Umgebung wurde im Januar komplett neu aufgesetzt. Wird also irgendwas in Richtung 5.2.16 sein?! Habe in die entsprechende Datei geschaut. Ja die Abfrage ist vorhanden.

Beim Testen ist jedoch der Fall aufgetreten, dass das Plugin nicht mehr deinstalliert werden konnte, weil die Attributfelder nicht vorhanden waren.&nbsp;

---

<div class="post-metadata">

**Author:** ![Thomas](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/thomas/32/8167_2.png) [@Thomas](https://forum.shopware.com/u/Thomas)\
**Post date:** [22. Februar 2017 um 13:43 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/5 "2017-02-22T13:43:28Z")

</div>

> [@zenit schrieb:](https://forum.shopware.com/profile/22455/zenit "zenit")
> 
> hm… also in der Entwicklungsumgebung ist schwer zu sagen, welche Version das ist. Die Umgebung wurde im Januar komplett neu aufgesetzt. Wird also irgendwas in Richtung 5.2.16 sein?! Habe in die entsprechende Datei geschaut. Ja die Abfrage ist vorhanden.
> 
> Beim Testen ist jedoch der Fall aufgetreten, dass das Plugin nicht mehr deinstalliert werden konnte, weil die Attributfelder nicht vorhanden waren.&nbsp;

Weil eine Exception geworfen wird. Wie schon beschrieben mach ein try/catch darum und es funktioniert.&nbsp;

---

<div class="post-metadata">

**Author:** ![zenit](https://avatars.discourse-cdn.com/v4/letter/z/a87d85/32.png) [@zenit](https://forum.shopware.com/u/zenit)\
**Post date:** [22. Februar 2017 um 13:55 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/6 "2017-02-22T13:55:57Z")

</div>

sry hatte den letzten Teil deiner Antwort wohl überlesen. Super klingt nach einer sauberen Methode! danke!

---

<div class="post-metadata">

**Author:** ![wolkenkrieger](https://avatars.discourse-cdn.com/v4/letter/w/85e7bf/32.png) [@wolkenkrieger](https://forum.shopware.com/u/wolkenkrieger)\
**Post date:** [24. März 2018 um 10:16 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/7 "2018-03-24T10:16:33Z")

</div>

Hallo 🙂

Sehe ich das richtig, dass bei einem Löschen der Attribute die entsprechenden Felder in der Tabelle tatsächlich gedropped werden? Sprich: eventuelle Informationen sind danach weg?

---

<div class="post-metadata">

**Author:** ![sschreier](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sschreier/32/23296_2.png) [@sschreier](https://forum.shopware.com/u/sschreier)\
**Post date:** [24. März 2018 um 10:51 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/8 "2018-03-24T10:51:49Z")

</div>

Hallo,

das ist ja der Sinne der Sache des Löschens eines Freitextfeldes ![Grin](https://europe1.discourse-cdn.com/flex013/uploads/shopware/original/1X/70033cde8e8ff79cfa538293ae71318d6f788423.png "Grin"). Also ja. Bei Plugins hat man aber die Möglichkeit, auch das Löschen solcher Freitextfelder beispielsweise bei einer Neuinstallation des Plugins zu verhindern / unterbinden.

Grüße

Sebastian

---

<div class="post-metadata">

**Author:** ![wolkenkrieger](https://avatars.discourse-cdn.com/v4/letter/w/85e7bf/32.png) [@wolkenkrieger](https://forum.shopware.com/u/wolkenkrieger)\
**Post date:** [24. März 2018 um 10:59 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/9 "2018-03-24T10:59:41Z")

</div>

Alles klar, danke 🙂

Dann muss ich das im Plugin tatsächlich absichern 🙂

---

<div class="post-metadata">

**Author:** ![sschreier](https://dub1.discourse-cdn.com/flex013/user_avatar/forum.shopware.com/sschreier/32/23296_2.png) [@sschreier](https://forum.shopware.com/u/sschreier)\
**Post date:** [24. März 2018 um 11:01 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/10 "2018-03-24T11:01:55Z")

</div>

Hallo,

am besten in der uninstall() - Methode vor dem Löschen der Freitextfelder folgendes ergänzen:

```
if($context->keepUserData()){
     return;
}

```

Grüße

Sebastian

---

<div class="post-metadata">

**Author:** ![Shopwareianer](https://avatars.discourse-cdn.com/v4/letter/s/b4bc9f/32.png) [@Shopwareianer](https://forum.shopware.com/u/Shopwareianer)\
**Post date:** [24. März 2018 um 14:46 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/11 "2018-03-24T14:46:55Z")

</div>

Das ist natürlich sinnvoll und sollte auch gemacht werden. Du kannst wie folgt abfragen, ob ein Attribut existiert und wenn es existiert es löschen.

```
    ...

    public function uninstall(UninstallContext $context)
    {
       $this->deleteArticleAttributes();
    }

    ....

     private function deleteArticleAttributes()
    {
        $service = $this->container->get('shopware_attribute.crud_service');
        
        $attributeSubtitleExist = $service->get('s_articles_attributes', 'swi_product_subtitle');
        
        if($attributeSubtitleExist){
            $service->delete(
                's_articles_attributes', 
                'swi_product_subtitle'
            );        
        }
        
        // $context->scheduleClearCache(InstallContext::CASH_LIST_ALL);
    
    }

```

&nbsp;

---

<div class="post-metadata">

**Author:** ![wolkenkrieger](https://avatars.discourse-cdn.com/v4/letter/w/85e7bf/32.png) [@wolkenkrieger](https://forum.shopware.com/u/wolkenkrieger)\
**Post date:** [24. März 2018 um 20:04 UTC](https://forum.shopware.com/t/attribute-system-crud-service/43856/12 "2018-03-24T20:04:57Z")

</div>

Werde ich beachten und so machen.

Ich danke euch 🙂
