Net Inventors GmbHNet Inventors GmbH MitgliedKommentare: 72 Danke erhalten: 6 Mitglied seit: März 2011 bearbeitet Februar 2013
Hallo,

leider ist die Shopware 4 Dokumentation derzeit noch etwas einseitig gehalten, so dass man bei der Entwicklung von Plugins, insbesondere Backend-Plugin, immer wieder diverse Hürden überwinden muss.

In einer aktuellen Entwicklung benötige ich eine komplett neue Datenbanktabelle und dafür ein Model. Wie ein Model in der Struktur aussehen muss, ist ja sehr gut beschrieben ( Shopware - Grundverständnis Models ), doch wie erzeuge ich ein neues Model und wie binde ich es richtig ein.

Über einen Lösungsansatz (und eine bessere Dokumentation seitens Shopware) würde ich mich sehr freuen.


Weihnachtliche Grüße aus Hamburg

Maximilian Stegmaier

Kommentare

  • Oliver SkroblinOliver Skroblin ModeratorKommentare: 236 Danke erhalten: 70 Mitglied seit: August 2011
    Hi,

    wir arbeiten gerade an einer ausführlichen Dokumentation für Plugin Entwickler. Daher wird zu diesem Thema bald etwas erscheinen =).

    Um ein eigenes Model anzulegen gehst du wie folgt vor:

    1. Zuerst einen Ordner Namens "Models" in deinem Plugin Verzeichnis anlegen:
    Beispiel: "Plugins/Local/Frontend/SwagExample/Models"

    2. In diesem Ordner legst du dir am besten einen Unterordner für deine verschiedenen Resourcen an (Am besten auch wenn du nur eine Resource verwendest)
    Beispiel: "Plugins/Local/Frontend/SwagExample/Models/Article"
    So sind deine Models gruppiert.

    3. In diesem Ordner kannst du dann ganz normal die Model Dateien ablegen. (Wie in dem Link ( Shopware - Grundverständnis Models ) erklärt.

    4. Folgender Source Code muss in deiner Bootstrap.php vorhanden sein:
        /**
         * The afterInit function registers the custom plugin models.
         */
        public function afterInit()
        {
            $this->registerCustomModels();
        }
    
    Danach kannst du ganz normal in deinem Plugin mit den Models arbeiten.

    Mit freundlichen Grüßen
    Oliver Denter
  • Net Inventors GmbHNet Inventors GmbH MitgliedKommentare: 72 Danke erhalten: 6 Mitglied seit: März 2011
    EDIT: Es läuft - ein @ORM\Entity vergessen (in dem unten stehendem Code berichtigt) - Vielen Dank nochmal.

    Hallo Oliver,

    danke für die schnelle Antwort, doch leider läuft es nicht. Ich bekomme folgende Fehlermeldung:
    Class Shopware\CustomModels\Article\Test is not a valid entity or mapped super class. in Doctrine/ORM/Mapping/MappingException.php on line 147
    

    Folgende Schritte habe ich durchgeführt:

    Plugins/Local/Frontend/Example/Bootstrap.php
    public function install() {
        Shopware()->Db()->query("CREATE TABLE test (
            id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
        )");
    }
    
    public function afterInit() {
        $this->registerCustomModels();
    }
    
    Plugins/Local/Frontend/Example/Models/Article/Test.php
    namespace Shopware\CustomModels\Article;
    use Shopware\Components\Model\ModelEntity,
        Doctrine\ORM\Mapping AS ORM,
        Symfony\Component\Validator\Constraints as Assert,
        Doctrine\Common\Collections\ArrayCollection;
    /**
     * @ORM\Entity
     * @ORM\Table(name="test")
     */
    
    class Test extends  ModelEntity {
        /**
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
    
        public function getId() {
             return $this->id;
        }
        public function setId($id) {
            $this->id = $id;
        }
    }
    
    
    Der Aufruf ist dann:
    $repository = Shopware()->Models()->getRepository('Shopware\CustomModels\Article\Test');
    $test = $repository->findAll();
    
    Kannst du mir veraten wo der Fehler liegt und wie ich es richtig mache?

    Vielen Dank im Voraus.

    Gruß

    Maximilian Stegmaier
  • troemmelttroemmelt MitgliedKommentare: 114 Danke erhalten: 9 Mitglied seit: September 2012
    Hallo Maximilian,


    Wie hast du den Aufruf des Models nun gelöst?

    Ich hänge nämlich auch gerade da.

    Eine Auskuft würde mir sehr helfen.

    Gruß
    Tom
  • shreddingshredding MitgliedKommentare: 150 Danke erhalten: 26 Mitglied seit: Dezember 2012
    @Tim: Wo hängst du?

    @Maximillian:

    Die Installvariante geht noch ein bisschen eleganter, nämlich ganz ohne SQL :) - der Vorteil ist, dass du bei Änderungen im Model den Installer nicht anfassen muss; Doctrine generiert das Datenbankschema dann automatisch:
        public install() {
           $this->registerCustomModels();
    
           $modelManager = Shopware()->Models();
    
           $schemaTool = new Doctrine\ORM\Tools\SchemaTool($modelManager);
           $schemaTool->createSchema(
               array(
                   $modelManager->getClassMetadata('Shopware\CustomModels\Article\Test')
               )
           );
        }
    
    Danke von 1thesaint
  • Net Inventors GmbHNet Inventors GmbH MitgliedKommentare: 72 Danke erhalten: 6 Mitglied seit: März 2011
    @Tom: Wie ich oben in dem Edit schon geschrieben habe, lag es an dem @ORM\Entity

    @Christian: Super, danke für den Tipp ;)
  • troemmelttroemmelt MitgliedKommentare: 114 Danke erhalten: 9 Mitglied seit: September 2012
    also den zugriff auf das model funktioniert, nachdem ich auch noch mein eigenes repository geschrieben habe.

    mein problem ist nun, dass ichs nicht auf die view kriege.

    ich hab das productfeed (Produktexport) im endeffekt gehookt und jetz is es so, sobald ich in meinem controller den aufruf auf mein model mache, will er es mit

    $this->View()->assign(array('success' => true, 'data' => $feed));

    auf die falsche view schicken, nicht aber in das fenster das offen ist!

    er sollt dann ein fenster tpl das so heisst, wie die funktion in der dieser befehl aufgerufen wird!
  • troemmelttroemmelt MitgliedKommentare: 114 Danke erhalten: 9 Mitglied seit: September 2012
    kriege halt folgende fehlermeldung:
    ps! Ein Fehler ist aufgetreten! Die nachfolgenden Hinweise sollten Ihnen weiterhelfen. Unable to load template snippet 'backend/mein_plugin/get_detail_partner.tpl' in Smarty/sysplugins/smarty_internal_templatebase.php on line 127 Stack trace: #0 Enlight/View/Default.php(272): Smarty_Internal_TemplateBase->fetch() #1 Enlight/Controller/Plugins/ViewRenderer/Bootstrap.php(212): Enlight_View_Default->render(Object(Enlight_Template_Default)) #2 Enlight/Controller/Plugins/ViewRenderer/Bootstrap.php(238):
    das komische ist, das richtige fenster wird auch geöffnet (eigentlich auch logisch durch den aufruf create im feed.js), aber das $this->View() ist halt die falsche, oder nicht die richtige zuweisung.

    irgendwelche Ideen oder vorschläge?

    kann auch sein, dass es dann geht, wenn ich den richtigen Controller hook!

    EDIT:
    Also, wenn ich meine Funktionen direkt in den Controller ProduktFeed.php schreibe,
    funtkioniert es.
    Das bestätigt also meinen Verdacht, dass der Aufruf $this->View() der falsche an der Stelle ist!

    Also zwei Möglichkeiten: entweder den bestehenden Controller mit eigenen Funktionen erweitern! (ka wie das geht) oder aber meinem eigenen Controller die richtige View zuordnen (ka wie das geht )

    Würde mich um jede Art der Hilfestellung freuen!
  • troemmelttroemmelt MitgliedKommentare: 114 Danke erhalten: 9 Mitglied seit: September 2012
    Ok das Problem mit der View hat sich erledigt...

    Habe nun eine Frage,

    Würde änderungen im Formular ja mit
    if (!empty($id)) {
    //edit Product Feed
    $test = Shopware()->Models()->getRepository('Shopware\CustomModels\test\test')->find($id);
    } else {
    $test = new test();
    }
    Shopware()->Models()->persist($test);
    Shopware()->Models()->flush();
    ind die DB schreiben. Dies macht er aber leider nicht!

    Woran liegt das?

    Danke
  • thesaintthesaint MitgliedKommentare: 8 Danke erhalten: 1 Mitglied seit: Januar 2013
    shredding schrieb:

    Die Installvariante geht noch ein bisschen eleganter, nämlich ganz ohne SQL :) - der Vorteil ist, dass du bei Änderungen im Model den Installer nicht anfassen muss; Doctrine generiert das Datenbankschema dann automatisch:
    Danke für diesen Tipp! Zwei Anmerkungen dazu noch:

    1) Während des Entwickelns lohnt es sich, eine entsprechende uninstall-Routine zu haben:
        public uninstall() {
           $this->registerCustomModels();
    
           $modelManager = Shopware()->Models();
    
           $schemaTool = new Doctrine\ORM\Tools\SchemaTool($modelManager);
           $schemaTool->dropSchema(
               array(
                   $modelManager->getClassMetadata('Shopware\CustomModels\Article\Test')
               )
           );
        }
    
    2) Die Entity-Metadaten werden gecached. Ich hatte mich beim Tabellennamen einer Entity vertippt und die Installationsroutine funktionierte nicht. Nachdem ich das cache/database Verzeichnis geleert hatte, ging es dann.
Anmelden oder Registrieren, um zu kommentieren.