Backend Plugin Controller: Daten für Liste anpassen

Wie in diesem Tutorial zu sehen, kann man im Controller eines Backend Plugins auf die Querys für eine Liste und für die Detail Seite zugreifen und diese anpassen. Da aber das Builder Objekt zurückgegeben werden muss, kann man die Daten in den Funktionen nicht direkt bearbeiten oder neue hinzufügen. Deshalb gibt es für die Detail-Ansicht die Funktion „getAdditionalDetailData(array $data)“, wo man die Daten als Array bekommt und dieses dann beliebig anpassen und erweitern kann. Gibt es sowas für die Listen-Ansicht nicht? Ich habe dazu nichts gefunden.

Konkret geht es darum, dass ich wie in dem oben verlinkten Tutorial beschrieben für mein Model eine ManyToOne Association für Artikel erstellt habe. Die Artikel dürfen aber auch NULL sein, also es muss nicht unbedingt ein Artikel angegeben werden. Bei den Zeilen in meiner Liste, wo kein Artikel ausgewählt ist, steht jetzt einfach nur eine „0“ in der Artikel-Spalte. Dort soll dann einfach gar nichts stehen. Wenn ich auf die Detail Ansicht gehe ist das Select Feld für den Artikel dann leer. So soll es auch sein. Aber wenn ich dann auf „Speichern“ klicke, ohne ein Artikel angegeben zu haben, kommt dieseFehlermeldung in der Konsole:

"You’re trying to decode an invalid JSON String:
Fatal error : Uncaught Doctrine\ORM\ORMInvalidArgumentException: Expected value of type „Shopware\Models\Article\Article“ for association field „MyPlugin\Models\Scheduler#$article“, got „array“ instead. in /project/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php:206 Stack trace: #0 /project/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(844): Doctrine\ORM\ORMInvalidArgumentException::invalidAssociation(Object(Doctrine\ORM\Mapping\ClassMetadata), Array, Array) #1 /project/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(741): Doctrine\ORM\UnitOfWork->computeAssociationChanges(Array, Array) #2 /project/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(803): Doctrine\ORM\UnitOfWork->computeChangeSet(Object(Doctrine\ORM\Mapping\ClassMetadata), Object(MyPlugin\Models\Scheduler)) #3 /project/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php(340): Doctrine\ORM\UnitOfWork->computeChangeSets() #4 /project/shopware/vendor/doctrine/orm in /project/shopware/vendor/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php on line 206
"

Meine Idee war es, das irgendwie beheben zu können, wenn ich nach dem Query die Daten bearbeiten könnte. Oder weiß zufällig jemand, wie ich das noch anders lösen kann?

 

Hallo iNono,

wie sieht denn dein Model aus? Nutzt du die entsprechenden Methoden wie setManyToOne? Diese werden auch in dem von dir verlinkten Tutorial im Model verwendet.

Viele Grüße

Hallo simkli,

wo genau siehst du die Methode setManyToOne? Hier ist mein Model:

Ext.define('Shopware.apps.MyPlugin.model.Scheduler', {
    extend: 'Shopware.data.Model',

    configure: function() {
        return {
            controller: 'MyPlugin',
            detail: 'Shopware.apps.MyPlugin.view.detail.Scheduler'
        };
    },

    fields: [
        { name: 'id', type: 'int', useNull: true },
        { name: 'date', type: 'date', dateFormat: 'd.m.Y' },
        { name: 'articleId', type: 'int' }
    ],

    associations: [
        {
            relation: 'ManyToOne',
            field: 'articleId',

            type: 'hasMany',
            model: 'Shopware.apps.Base.model.Article',
            name: 'getArticle',
            associationKey: 'article'
        }
    ]
});

Danke und viele Grüße

Ah oder meinst du das PHP Model? Also zum Beispiel das im setter von Variants diese setOneToMany Funktion steht? Ich glaube das ist für ManyToOne nicht der Fall. In dem Tutorial wäre die ManyToOne Association nämlich das mit der Tax und da gibt es im setter keine setManyToOne Funktion. Hier ist aber auch nochmal mein PHP Model:

id;
    }

    /**
     * @param \DateTime $date
     */
    public function setDate($date)
    {
        $this->date = $date;
    }

    /**
     * @return \DateTime
     */
    public function getDate()
    {
        return $this->date;
    }

    /**
     * @return mixed
     */
    public function getArticle()
    {
        return $this->article;
    }

    /**
     * @param mixed $article
     */
    public function setArticle($article)
    {
        $this->article = $article;
    }
}

 

Hab für beide Probleme ein Workaround entwickelt:

  1. Wenn kein Artikel angegeben ist, soll in der Liste keine 0 stehen sondern zum Beispiel ein “-”. Dafür habe ich den Renderer des Felds in der entsprechenden ExtJs View angepasst:

    columns: {
    date: { header: ‘{s name=“MyPluginDate”}Datum{/s}’ },
    articleId: {
    header: ‘{s name=“MyPluginArticle”}Artikel{/s}’,
    renderer: function(value, meta, record) {
    if(!value){
    return “-”;
    }
    return record.raw.article.name;
    }
    }
    },

  2. Wenn man beim Bearbeiten eines Elements keinen Artikel angegeben hat und auf Speichern geklickt hat, kam der Fehler, den ich oben schon gepostet habe. Dafür habe ich den Article setter meines PHP Models angepasst:

    /**

    • @param mixed $article
      */
      public function setArticle($article)
      {
      if($article == ){
      $article = null;
      }
      $this->article = $article;
      }

 

  1. Ja ich meine das PHP-Modell

  2. Es gibt eine ManyToOne Methode, die wsl. auch das Problem gelöst hätte.  Wink shopware/ModelEntity.php at 5.3 · shopware/shopware · GitHub

Bei Relationen solltest du immer diese Hilfsmethoden verwenden.

Viele Grüße