[gelöst] Plugin - Neues Model erstellen

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

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

3 Likes

[color=red]EDIT: Es läuft - ein @ORM\Entity vergessen (in dem unten stehendem Code berichtigt)[/color] - 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

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

@Tim: Wo hängst du? @Maximillian: Die Installvariante geht noch ein bisschen eleganter, nämlich ganz ohne SQL :slight_smile: - 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') ) ); }

1 Like

@Tom: Wie ich oben in dem Edit schon geschrieben habe, lag es an dem @ORM\Entity @Christian: Super, danke für den Tipp :wink:

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!

kriege halt folgende fehlermeldung: [quote]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): [/quote] 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!

Ok das Problem mit der View hat sich erledigt… Habe nun eine Frage, Würde änderungen im Formular ja mit [quote] 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();[/quote] ind die DB schreiben. Dies macht er aber leider nicht! Woran liegt das? Danke

[quote=„shredding“] Die Installvariante geht noch ein bisschen eleganter, nämlich ganz ohne SQL :slight_smile: - der Vorteil ist, dass du bei Änderungen im Model den Installer nicht anfassen muss; Doctrine generiert das Datenbankschema dann automatisch: [/quote] 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.