Artikelattribute via Plugin erweitern

Hallo,

ich benötige zusätzliche Artikelattribute, die ich via Plugin nachrüste:

public function install(InstallContext $context)
    {
        $service = $this->container->get('shopware_attribute.crud_service');

        $service->update('s_articles_attributes', 'my_column', TypeMapping::TYPE_STRING, [
            'displayInBackend' => true,
            'label' => 'My column default label',
            'supportText' => 'My column default support text',
            'helpText' => 'My column default help text'
        ]);
    }

Beim deinstallieren sollen die Attribute natürlich auch wieder verschwinden, also:

$service->delete( "s_articles_attributes", "my_column" );

Wenn ich im Plugin Manager aber ein Reinstall des Plugins mache, z.B. wegen Änderungen, werden sämtliche Daten in „my-column“ gelöscht. Ich hätte da erwartet, dass die Daten unangetastet bleiben, so wie beispielsweise die Konfigurations-Einstellungen für das Plugin. In der Praxis ist das u.U. sehr schmerzhaft, wenn bei einem Plugin-Update alle Daten aus den zusätzlichen Attributen verschwinden würden.

Gibt es eine Möglichkeit zu verhindern, dass die Daten gelöscht werden?

Ich hätte das in die Update-Funktion gepackt und zusätzlich abgefragt, ob das Attribut schon gesetzt ist oder nicht.

Danke für die Antwort.

Dass es eine Update-Funktion gibt, hatte ich gesehen. Allerdings fehlt mir ein Beispiel, um zu verstehen, wie man dass konkret anwendet.

Der Aufbau ist das selbe wie bei „install“, nur das es eben „update“ heißt :slight_smile:

Okay. Da ich im Moment keine Update-Funktion habe, macht er quasi wieder ein Install ?

Wie kann ich das erneute Anlegen der Attribute in der Update-Funktion verhindern ?

Prinzipiell ist die Update-Funktion genau für solche Sachen gedacht. Diese Funktion wird also nur ausgeführt, wenn das Plugin geupdatet wird, also mit neuer Versionsnummer etc…

Ich würde vorher Abfragen, ob das Attribut in der Tabelle schon vorhanden ist. Falls ja dann nichts tun, falls nein dann updaten.

Danke für den Tipp. Werde ich gleich testen :grinning:.

Bin mir jetzt nicht ganz sicher, ob das bei $service->update(’…) schon automatisch gemacht wird. Ansonsten einfach ausprobieren, siehst ja dann in der Datenbank was passiert :slight_smile:

Da scheint mir jeweils noch ein „generieren der Models“ zu fehlen.
Am Ende von Update und Delete noch ein

$this->container->get('models')->generateAttributeModels(['s_articles_attributes']); 

Bei mir löscht ein „Reinstall“ keine Daten.

Bsp:

/**

     * @param InstallContext $installContext

     */

    public function install(InstallContext $installContext)

    {

        $this->updateAttributes();

    }

    /**

     * @param UninstallContext $context

     */

    public function uninstall(UninstallContext $uninstallContext)

    {

        if ($uninstallContext->keepUserData()) {

            return;

        }

        $this->removeAttributes();        

    }

    /**

    * @param UpdateContext $context

    */

    public function update(UpdateContext $context)

    {

        $this->updateAttributes();
    }

private function removeAttributes()
{
	/** remove Attribute */
	$service = $this->container->get('shopware_attribute.crud_service');
	$service->delete('s_articles_attributes', 'meinattribute');

	$this->container->get('models')->generateAttributeModels(['s_articles_attributes']);   
}
	
private function updateAttributes()
{
	$service = $this->container->get('shopware_attribute.crud_service');
   
	$service->update(
		's_articles_attributes',
		'meinattribute',
		'string',
		[
			'displayInBackend' => true,
			'label' => 'Badgetext',
			'supportText' => 'Alternativer Badgetext',
			'helpText' => 'Alternativer Badgetext. Mit "snippet=" kann auch ein Textbaustein verwendet werden.'
		],                
		null,
		true
	);
	
	$this->container->get('models')->generateAttributeModels(['s_articles_attributes']);
}	

public function uninstall(UninstallContext $uninstallContext)

    {

        if ($uninstallContext->keepUserData()) {

            return;

        }

        $this->removeAttributes();        

    }

Genau das war das Problem. Ich habe im uninstall immer die Attribute weggebügelt. Jetzt klappt es.

Vielen Dank. :wink:

Ja, scheint so. Bei mir klappt es jedenfalls.

… noch eine Ergänzung dazu:

$metaDataCache = Shopware()->Models()->getConfiguration()->getMetadataCacheImpl();
$metaDataCache->deleteAll();

$modelManager->generateAttributeModels( array( "s_articles_attributes" ) );

Wenn ich den Meta-Cache nicht lösche, bekomme ich einen „Upps-Fehler …“ im Shop.

Kenn ich nicht :wink:
Das habe ich bisher noch nie gemacht, und habe auch keine Fehler.
Hängt ggf. von der weiteren Verwendung des Attributes ab?

Macht Shopware übrigens z.B. im PayPal-Plugin auch nicht:

Aber in der Doku ist es auch so:

Wie auch immer: Wenn es sein muss, muss es so sein :wink:

Ja, wirklich merkwürdig. Ich bekomme den „Ups“-Fehler nun trotzdem, wenn ich das Plugin deinstalliert habe. Erst, wenn ich nochmal manuell den Cache lösche, läuft es wieder. :thinking:

Ich habe in activate, deactivate und update auch noch ein

$context->scheduleClearCache(UpdateContext::CACHE_LIST_ALL);

Vielleicht hat das den gleichen Effekt. Wie auch immer, hab gleich mal obiges noch ergänzt.
THX für den Hinweis.

Auf Empfehlung von Shopware bei uninstall:

if ($context->getPlugin()->getActive()) { 
  $context->scheduleClearCache(UninstallContext::CACHE_LIST_ALL); 
}

Als Zusatz.

if ($uninstallContext->getPlugin()->getActive()) { 
            $uninstallContext->scheduleClearCache(UninstallContext::CACHE_LIST_ALL); 
        }

Das hat geholfen. Funktioniert jetzt sauber, ohne Fehler. :grinning: