Hallo, ich entwickle gerade ein ziemlich schlichtes Plugin, welches nur ein bisschen Daten in der Datenbank herumschaufelt. Das Plugin braucht keine Trigger oder Cronjobs sondern soll manuell aufgerufen werden. Und genau hier komme ich einfach nicht weiter. Wie kann ich veranlassen, das z.B. nach einem Klick auf einen von mir erstellten Menüeintrag einfach nur eine Methode aufgerufen wird, und fertig. Schön wäre noch eine abschließende „Done“ Meldung. Vorgeschichte / Code so far: Ich hab mir die Tutorials für die Controller, Views, Models, etc. angesehen - aber das ist viel zu umfangreich für meinen Einsatzzweck. Ich brauch kein Fenster oder ähnliches und hab auch keine Daten zum Anzeigen. Bis jetzt schaffe ich es nur den Menüpunkt einzubinden und einen Controller aufzurufen. Wie komme ich weiter? /\* Bootstrap.php \*/ public function install() { $this-\>subscribeEvent( 'Enlight\_Controller\_Dispatcher\_ControllerPath\_Backend\_MyPlugin', 'getBackendController' ); $this-\>createMenuItem(array( 'label' =\> 'MyPlugin starten', 'controller' =\> 'MyPlugin', 'class' =\> 'sprite-application-block', 'action' =\> 'Index', 'active' =\> 1, 'parent' =\> $this-\>Menu()-\>findOneBy('label', 'Artikel') )); return true; } public function getBackendController(Enlight\_Event\_EventArgs $args) { return $this-\>Path() . '/Controllers/Backend/MyPlugin.php'; }
/\* MyPlugin.php \*/ class Shopware\_Controllers\_Backend\_MyPlugin extends Shopware\_Controllers\_Backend\_ExtJs { public function init() { doStuff(); parent::init(); } public function doStuff() { echo "do something !?"; } }
Viele Grüße, Mario
Bis jetzt sieht alles soweit korrekt aus. Du musst nun eine backend app schreiben, die lädt und geöffnet wird, sobald du auf den Menüpunkt klickst. Hier ist ein Tutorial, das sich (unter anderem) mit einer backend app beschäftigt: http://wiki.shopware.com/Favoritenliste … 4_868.html Prinzipiell sollte ein Klick auf deinen Menüpunkt aber bereits einen request auslösen, der “do something” liefert. Hier einfach mal die Entwicklertools von chrome anschauen. Viele Grüße
Nun, das Entwickeln der Backend App würde ich mir gern sparen - ich wäre schon glücklich wenn einfach nur meine Funktion aufgerufen wird. Derweil lädt er einfach nur ins Nirvana. Keine Fehlermeldung, keine Aktion, gar nichts. Es scheint mir als ob er in init() gar nicht reingeht, weil ich nichts im Quellcode sehe. Das hat leider auch keinen Effekt: (oder werden Exceptions irgendwie ‘stumm’ gefangen?) /\* MyPlugin.php \*/ public function init() { throw new Exception('init entered.'); parent::init(); }
So, ich habe jetzt einen (unsauberen) Weg gefunden um meinen Wunsch zu erfüllen. Eigentlich ähnlich wie im ersten Post nur mit ein paar Änderungen und dem $this- Operator vor dem Methodenaufruf (problematisch wenn man vorher in C#/Java rumprogrammier …) Das Plugin trägt sich jetzt in das Menü ein, und führt beim Klick einen beliebigen Methodenaufruf auf. Nach Abschluss sendet es eine Nachricht an eine E-Mail Adresse (ich kam leider mit den Views nicht zurecht um das sauber zu implementieren). Naja und der Buttonklick führt auch zu einem Fehler weil er kein ExtJS Skript laden kann, die Methoden werden aber trotzdem ausgeführt - das ist das einzige was für mich zählt, wie gesagt ich brauch kein GUI. Plugin Folder Download dieses Code Snippets hier. Controller (DemoPlugin\Controllers\Backend\DemoPlugin.php) <?php class Shopware_Controllers_Backend_DemoPlugin
extends Shopware_Controllers_Backend_ExtJs
{
public function init()
{
$this->doWork(); $this-\>sendMail(); } public function doWork() { // ... } public function sendMail() { $mail = Shopware()-\>Mail(); $mail-\>IsHTML(false); $mail-\>From = Shopware()-\>Config()-\>Mail; $mail-\>FromName = Shopware()-\>Config()-\>ShopName; $mail-\>Subject = "DemoPlugin executed"; $mail-\>Body = "DemoPlugin executed"; $mail-\>ClearAddresses(); $mail-\>AddAddress(Shopware()-\>Plugins()-\>Backend()-\>DemoPlugin()-\>Config()-\>get('reportMail')); $mail-\>send(); } } ?\>
Bootstrap (DemoPlugin\Bootstrap.php) [code]<?php class Shopware_Plugins_Backend_DemoPlugin_Bootstrap
extends Shopware_Components_Plugin_Bootstrap
{
public function getLabel() { … }
public function getVersion() { … }
public function getCapabilities() { … }
public function getInfo() { … }
public function uninstall() { return true; }
public function install()
{
$this->createConfiguration(); $this-\>subscribeEvent( 'Enlight\_Controller\_Dispatcher\_ControllerPath\_Backend\_DemoPlugin', 'onGetBackendController' ); $item = $this-\>createMenuItem(array( 'label' =\> 'Start DemoPlugin', 'class' =\> 'sprite-application-block', 'action' =\> 'Index', 'active' =\> 1, 'controller' =\> 'DemoPlugin', 'parent' =\> $this-\>Menu()-\>findOneBy('label', 'Einstellungen') )); return true; } public function onGetBackendController(Enlight\_Event\_EventArgs $args) { return $this-\>Path(). 'Controllers/Backend/DemoPlugin.php'; } private function createConfiguration() { $form = $this-\>Form(); $form-\>setElement('text', 'reportMail', array( 'scope' =\> Shopware\Models\Config\Element::SCOPE\_SHOP, 'required' =\> true, 'label' =\> 'E-Mail Adresse an welche ein Statusbericht nach Ausführen dieses Moduls gesendet wird', 'value' =\> Shopware()-\>Config()-\>Mail ) ); } } [/code]