bonobono MitgliedKommentare: 10 Danke erhalten: 0 Mitglied seit: Dezember 2013 bearbeitet April 2014
Ich habe ein Problem mit einem Backend-Plugin.
Grob gesagt Besitz es zwei MODELS und dann für jedes Model einen eigenen Backendcontroller.

Nun will ich, dass eine mit dem anderen Model verknüpfen. Aber leider erscheint immer nur die ID und es wird nicht automatisch ein SelectionSearchfield erzeugt so wie in dem Beispiel mit dem Steuersatz (taxId -> tax) und dem Produkt Siehe hier

Model 1: Flippingbook
/**
     * @var integer $flippingbookcategoryId
     *
     * @ORM\Column(name="flippingbookcategory_id", type="integer")
     */
    private $flippingbookcategoryId = null;

    /**
     * @var
     * @ORM\ManyToOne(
     *      targetEntity="Shopware\CustomModels\BonoFlippingbook\Flippingbookcategory",
     *      inversedBy="flippingbooks"
     * )
     * @ORM\JoinColumn(name="flippingbookcategory_id", referencedColumnName="id")
     */
    protected $flippingbookcategory;

    /**
     * @return \Shopware\CustomModels\BonoFlippingbook\Flippingbookcategory
     */
    public function getFlippingbookcategory()
    {
        return $this->flippingbookcategory;
    }

    /**
     * @param \Shopware\CustomModels\BonoFlippingbook\Flippingbookcategory $flippingbookcategory
     */
    public function setFlippingbookcategory($flippingbookcategory)
    {
        $this->flippingbookcategory=$flippingbookcategory;
    }
Der einsprechende Teil im Model 2: Flippingbookcategory
/**
     * @var \Shopware\CustomModels\BonoFlippingbook\Flippingbook[]
     *
     * @ORM\OneToMany(
     *      targetEntity="Shopware\CustomModels\BonoFlippingbook\Flippingbook",
     *      mappedBy="flippingbookcategory"
     * )
     */
    protected $flippingbooks;

    public function __construct()
    {
        $this->flippingbooks = new ArrayCollection();
    }

    /**
     * @return \Shopware\CustomModels\BonoFlippingbook\Flippingbook[]
     */
    public function getFlippingbooks()
    {
        return $this->flippingbooks;
    }

    /**
     * @param \Shopware\CustomModels\BonoFlippingbook\Flippingbook[] $flippingbooks
     * @return \Shopware\Components\Model\ModelEntity
     */
    public function setFlippingbooks($flippingbooks)
    {
        return $this->setOneToMany(
            $flippingbooks,
            'Shopware\CustomModels\BonoFlippingbook\Flippingbook',
            'flippingbooks',
            'flippingbookcategory'
        );
    }
ExtJS Model 1:
Ext.define('Shopware.apps.BonoFlippingbook.model.Flippingbook', {
    extend: 'Shopware.data.Model',

    configure: function() {
        return {
            controller: 'BonoFlippingbook',
            detail: 'Shopware.apps.BonoFlippingbook.view.detail.Flippingbook'
        }
    },


    fields: [
        //{block name="backend/bono_flippingbook/model/flippingbook/fields"}{/block}
        { name:'id', type:'int', useNull: true },
        { name:'name', type:'string' },
        ...
        { name:'flippingbookcategoryId', type:'integer'}
    ],
    associations: [{
        relation:'ManyToOne',
        field:'flippingbookcategoryId',
        type:'hasMany',
        model:'Shopware.apps.BonoFlippingbook.model.Flippingbookcategory',
        name:'getFlippingbookcategory',
        associationKey:'flippingbookcategory'
    }]
});
Ext.define('Shopware.apps.BonoFlippingbookcategory.model.Flippingbookcategory', {
    extend: 'Shopware.data.Model',

    configure: function() {
        return {
            controller: 'BonoFlippingbookcategory',
            detail: 'Shopware.apps.BonoFlippingbookcategory.view.detail.Flippingbookcategory'
        }
    },


    fields: [
        //{block name="backend/bono_flippingbookcategory/model/flippingbookcategory/fields"}{/block}
        { name:'id', type:'int', useNull: true },
        { name:'active', type:'boolean', defaultValue: true },
        { name:'name', type:'string' },
        { name:'title', type:'string' },
        { name:'metaTitle', type:'string', useNull: true },
        { name:'description', type:'string', useNull: true },
        { name:'descriptionLong', type:'string', useNull: true },
        { name:'keywords', type:'string', useNull: true },
        { name:'sorting', type:'int' }
    ],
    associations: [
        {
            relation: 'OneToMany',
            storeClass: 'Shopware.apps.BonoFlippingbook.model.Flippingbook',
            loadOnDemand: true,

            type: 'hasMany',
            model: 'Shopware.apps.BonoFlippingbook.model.Flippingbook',
            name: 'getFlippingbooks',
            associationKey: 'flippingbooks'
        }
    ]

});
im Controller hab ich noch folgende Funktion:
protected function getListQuery()
    {
        $builder = parent::getListQuery();

        $builder->leftJoin('flippingbook.flippingbookcategory', 'flippingbookcategory')
                ->addSelect(array('flippingbookcategory'));

        return $builder;
    }
Wenn ich den Controller für das Listig nun direkt anspreche schaut auch soweit alles gut aus:
{
  "success":true,
  "data":[  
    {
      "id":1,
      "name":"14P04",
      "flippingbookcategoryId":4,
      "flippingbookcategory":{
        "id":4,
        "name":"Prospekt",
         "sorting":300
       }
     }
  ],
  "total":1
}
Kann mir da irgendwer helfen wo der Fehler liegt?
Wieso bekomme ich nicht so ein Selection Auswahl angezeigt wie bei dem tax-Beispiel?

Kommentare

  • bonobono MitgliedKommentare: 10 Danke erhalten: 0 Mitglied seit: Dezember 2013
    Hat niemand einen Anhaltspunkt wo der Fehler liegt? :(
  • premsoftpremsoft MitgliedKommentare: 12 Danke erhalten: 3 Mitglied seit: Januar 2015

    Ich weiß nicht ob das Problem noch aktuell ist.
    Bei mir lag es daran, dass eines der Models nicht in der app.js eingetragen war.
    Anhand des Beispiels oben müsste in der app.js also folgendes eingebaut sein:

    models: [ 'Flippingbook', 'Flippingbookcategory' ],

  • DannyDanDannyDan MitgliedKommentare: 30 Danke erhalten: 2 Mitglied seit: Juli 2015

    Moin,

    ich muß das Thema nochmal aufgreifen. Ist zwar schon mehr als 8 Monate alt, aber ich stehe derzeit vor exakt dem selben Problem.

    Kann es sein, dass man den Store vorher auch irgendwie laden muss, damit die ID nicht angezeigt wird, sondern der Name und man die selectbox bekommt? Funktioniert das ganze mit der Tax, weil die Daten schon beim laden des backends verfügbar sind?

    Wenn ich im Backend erst die app zum einen Model lade und im Anschluss das andere, wird alles richtig angezeigt (weil wohl dann der store geladen wurde).

    Bin für jeden Tip und HInweis dankbar.

    Daniel

  • DannyDanDannyDan MitgliedKommentare: 30 Danke erhalten: 2 bearbeitet Oktober 2016 Mitglied seit: Juli 2015

    Nachtrag: ich habe jetzt mal in der main.js der app ein

    Ext.require(Shopware.apps.anderApp);

    eingebaut. So werden zumindest beim zweiten öffnen nicht mehr die IDs angezeigt, sondern die Namen.
    Ich habe auch versucht den Store in der main.js zu laden, aber mein eigener liefert immer undefined zurück. Lade ich einen Shopware Store, wird auch ein Store zugewiesen?!?

    Daniel

  • BeyerBeyer MitgliedKommentare: 31 Danke erhalten: 2 bearbeitet November 2016 Mitglied seit: April 2016

    Hallo,

    habe das selbe Problem. 

    Die Tax funktioniert einwandfrei. Bei Customer und Variant jedoch nicht...

    Im Listing wird nur die Id angezeigt, in der Detail (SelectBox) ist die Anzahl der Einträge korrekt, jedoch kein Wert angezeigt.
    Nur leere Zeilen.

    Danke

    Johannes

  • KMUdoKMUdo MitgliedKommentare: 42 Danke erhalten: 6 bearbeitet 27. April Mitglied seit: Juni 2014

    Hallo,

    habe das selbe Problem. 

    Die Tax funktioniert einwandfrei. Bei Customer und Variant jedoch nicht...

    Im Listing wird nur die Id angezeigt, in der Detail (SelectBox) ist die Anzahl der Einträge korrekt, jedoch kein Wert angezeigt.
    Nur leere Zeilen.

    Danke

    Johannes

    Hallo zusammen

    Wir stehen momentan an genau denselben Problem.
    Laut Dokumentation muss man ja "nur" die Association integrieren und voilà.

    Wir möchten beispielsweise vom Models/Order/Order die Customer anzeigen, jedoch ist im Listing immer noch nur die ID und in der Detailansicht das Feld anzuzeigende leer.
    (Wenn man eines der leeren Felder auswählt und den Eintrag speichert, wird die ID des gewählten Feldes "korrekt" gespeichert.)

    Die Vermutung unsererseits ist, dass nur die Associations einen Text vorhanden haben, die in ihrem Model ein Feld mit "name" besitzen.
    Beispielsweise wird der orderStatus via Association ausgelesen. => Wenn man aber ein eigenes orderStatus erstellt hat, werden diese nicht angezeigt...

    Hat jemand eine Lösungsidee?

    Mit freundlichen Grüssen
    Das KMUdo Team

    Ps: Wäre es möglich diesen Thread zu Shopware 5 zu migrieren?

  • KMUdoKMUdo MitgliedKommentare: 42 Danke erhalten: 6 Mitglied seit: Juni 2014

    Wie es aussieht, wird diese Frage in diesem Thread beantwortet.

  • langnickellangnickel MitgliedKommentare: 65 Danke erhalten: 7 Mitglied seit: 10. April

    @KMUdo

    Es ging bei der Frage in diesem Thread um eine ManyToOne Assoziation. In dem von dir verlinkten Beitrag geht es um eine OneToMany Assoziation.

Anmelden oder Registrieren, um zu kommentieren.