Attribute system - CRUD Service

Hallo Community, 

in der Shopware Doku zum CRUD Service ist beschrieben, wie ein Attribut zu löschen ist: Attribute system

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

 

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: 

  1. Es gab einen Fehler bei Update oder Installation, sodass das Attribut 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?

Weiß keiner wie das am besten gemacht wird?

@zenit schrieb:

Weiß keiner wie das am besten gemacht wird?

Welche Shopware Version setzt Du den ein?  Weil das prüfen ist ja enthalten: 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.

1 „Gefällt mir“

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. 

@zenit schrieb:

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. 

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

1 „Gefällt mir“

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

Hallo :slight_smile:

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?

Hallo,

das ist ja der Sinne der Sache des Löschens eines Freitextfeldes 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

Alles klar, danke :slight_smile:

Dann muss ich das im Plugin tatsächlich absichern :slight_smile:

Hallo,

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

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

Grüße

Sebastian

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);
    
    }

 

Werde ich beachten und so machen.

Ich danke euch :slight_smile: