Hallo, ich mache noch mal einen extra Thread auf, weil es sonst evtl. untergeht und es ein eigenes Thema ist. Ich hätte gerne ein Beispiel dafür, wie ich in einer tpl Datei einen Ajaxrequest einbinde, bei dem ein eigenes Plugin aufgerufen wird. Die Rückgabe kann erst mal eine einfache Zeichenkette sein. Wenn da jemand was hätte, wäre super.
Ich habe es so realisiert (nicht vollständig, nur das wichtigste): function getArticle(id){ var ordernumber = jQuery('#ordernumber' + id).val(); .... $('#ajaxLoader' + id).show(); jQuery.getJSON('/<controller>/<action>, function(data) {
if(data.name != ''){
...<erfolgreich>...
}else{
jQuery('#name' + id).html('Artikel nicht gefunden');
}
});
}
Der Controller muss dann von der Klasse Enlight_Controller_Action abgeleitet werden und die entsprechende Action haben.
Die Daten im JSON Format zurück gegeben.
Danke für das Beispiel. Ich hänge aber irgendwie fest, bzw. verstehe einen Punkt noch nicht. Was muss ich bei // angeben?
Ich habe da jetzt einfach /FilterBox/index hingeschrieben, da mein Plugin FilterBox heißt.
Der Controller, bzw. die Klasse darin heißt auch Shopware_Controllers_Frontend_FilterBox und hat ein public function indexAction(){…}
Müsste das so funktionieren?
Weil bei mir (im Fiddler geguckt) kommt dann einfach als Request /FilterBox/index? raus. Das kanns ja nicht sein.
Ich denke, mir fehlt da noch das Mapping zum Plugin, oder nicht?
Welche Dateien hast Du in Deinem Plugin? In der Bootstrap muss der Controller „eingebunden“ sein. Dafür muss das Plugin so etwas haben: public static function onGetControllerPathFrontend(Enlight\_Event\_EventArgs $args){ return dirname(\_\_FILE\_\_).'/Controllers/Frontend/WkMiniBasketController.php'; # Controller laden }
Statt „WkMiniBasketController“ muss natürlich Dein Kontroller stehen. Danach das Plugin deinstallieren, wieder installieren und aktivieren. Und dann im Browser prüfen: http://shop-url//action.
In meinem Beispiel wäre das: http://shopware.waldicom.de/WkMiniBaske … BasketItem (das heißt, der Controller implementiert eine Action mit dem Namen „changeQuantityBasketItemAction“
function changeQuantityBasketItemAction(){
....
}
Also, mein Plugin liegt derzeit unter \engine\Shopware\Plugins\Local\Frontend\FilterBox und besteht derzeit aus einer plugin.tpl und einer Bootstrap.php. Dazu habe ich jetzt noch unter \engine\Shopware\Controllers\Frontend die Datei FilterBox.php angelegt. In der Bootstrap.php habe ich in der install function folgendes stehen $event = $this-\>createEvent( 'Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_FilterBox', 'onGetControllerPathFrontend' ); $this-\>subscribeEvent($event);
und public static function onGetControllerPathFrontend(Enlight\_Event\_EventArgs $args){ return dirname(\_\_FILE\_\_).'/Controllers/Frontend/FilterBox.php'; # Controller laden }
Und meine FilterBox.pbp beinhaltet derzeit nur Testcode class Shopware\_Controllers\_Frontend\_FilterBox extends Enlight\_Controller\_Action { /\*\* \* Disable template renderer for not given actions \* @return void \*/ public function preDispatch() { if(in\_array($this-\>Request()-\>getActionName(), array('index','foo'))) { Shopware()-\>Plugins()-\>Controller()-\>ViewRenderer()-\>setNoRender(); } } public function indexAction(){ //Diese Action soll kein Template laden, sondern direkt Json formatierte Daten zurückgeben $this-\>View()-\>setTemplate(); echo "Index Action"; } public function fooAction(){ $this-\>View()-\>setTemplate(); $bar = $this-\>Request()-\>bar; $bar = htmlentities($bar); if (empty($bar)){ echo "Hello World"; }else { echo $bar; } } }
Wenn ich so wie Du gesagt hast, dann im Browser den Aufruf mache. Das ist bei mir dann localhost/FilterBox/index wird mir die normale Shop Startseite angezeigt, mehr nicht. Im Fiddler sehe ich, das der Aufruf einen 404 Fehler zurück liefert. Irgendwas mache ich da noch falsch.
[quote]Dazu habe ich jetzt noch unter \engine\Shopware\Controllers\Frontend die Datei FilterBox.php angelegt.[/quote] Der Controller muss in Deinem Fall hier liegen: \engine\Shopware\Plugins\Local\Frontend\FilterBox\Controllers\Frontend\FilterBox.php
Danke, das wars.