Hallo, Ich bin bei einer Pluginentwicklung auf ein Problem gestoßen, und zwar weiß ich nicht ob es die Möglichkeit gibt auf MouseClick Ereignisse zu reagieren? Also, ich habe in meiner TPL Datei einen Link und möchte, dass wenn ein Benutzer darauf klickt eine Funktion aufgerufen wird. Die Funktion soll jedes mal wenn auf den Link geklickt wird im Datenbank einen Wert eintragen. Soweit ich weiß bekommt man aber von einer TPL Datei aus keinen Zugriff auf die Datenbank?!? Oder ich weiß nicht wie ich das hinbekomme. Ich glaube, deswegen muss das Klick Event in der Bootstrap Datei registriert werden oder? Bootstrap.php [code]<?php class Shopware_Plugins_Frontend_Test_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function getLabel()
{
return ‘TEST’;
}
public function install()
{
$this->subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Frontend\_Checkout', 'onPostDispatchCheckout' ); return true; } public function onPostDispatchCheckout(Enlight\_Event\_EventArgs $arguments) { $view = $arguments-\>getSubject()-\>View(); $config = $this-\>Config(); if (empty($config-\>show) && $config-\>show !== null) { return; } $view-\>addTemplateDir($this-\>Path() . 'Views/'); $view-\>extendsTemplate('frontend/template/my\_tpl.tpl'); } public function uninstall() { return true; } } ?\> [/code] my\_tpl.tpl [code] {block name='frontend\_checkout\_cart\_item\_details' append}
TEST
//folgenden Code habe ich ausprobiert, klappt aber so nicht. //Es soll bei jedem Klick auf den Link ein Wert in die Tabelle eingetragen werden. {literal} <?php function myFunction()
{
echo “myFunction wurde ausgeführt!.”;
$sql = "SELECT colum1 FROM table1 WHERE id = 1;";
$data = Shopware()->Db()-\>fetchAll($sql); $compID; foreach ($data as $row) { $compID = $row['colum1']; } $compID++; $this-\>Application()-\>Db()-\>query( "UPDATE table1 SET colum1 = " .$compID. "WHERE id = 1;" ); } ?\> {/literal} {/block} [/code]
Hi, das geht, aber nicht direkt über tpl. Sondern per tpl + Javascript (Ajax-Controller-Aufruf) + Controller. Schaue dieses Beispiel an: Artikellisting mit Variantenwechsel - das ist eigentlich das, was Du brauchst. Im Controller wird da Select gemacht, man kann aber alles mögliche aufrufen (Insert, Delete, Update…)
Ich hab mir das Beispiel gestern angeguckt… Aber viel hat das mir auch nicht gebracht. Vielleicht ist dieses Beispiel zu umfangreich und ich verstehe es deswegen nicht Kann mir denn niemand ein kleines Beispiel dazu vorbereiten, damit ich das verstehe. Also, ein einfaches Plugin wo in der TPL Datei (im Frontend an irgendeiner Stelle) ein Link stehen soll… Und wenn auf diesem Link geklickt wird, dann soll in eine DB Tabelle, welche vorher schon existiert irgendein Wert eingetragen werden. Das wäre mir wirklich hilfreich…
Die Antwort von kube ist korrekt und das Beispiel ist das richtige. Ein ‚kleines‘ Plugin für dich zu schreiben ist wohl leider nicht drin, weil es zu viel Zeit beanspruchen würde. Generell musst du dir jedoch nur folgende Funktionen aus dem Plugin-Beispiel herausziehen: 1. Wie registriere ich einen Controller in meiner Bootstrap 2. Wie kann ich eine Controller-Action mittels Ajax-Call aufrufen Wie Ajax mit jQuery funktioniert ist ja nicht Shopware spezifisch. Hier gibt es im Netz unzählige (auch kleine) Beispiele. Funktionsweise deines Plugins wäre dann folgende: Wenn der Link in der .tpl geklickt wird, dann wird eine Javascript-Funktion aufgerufen die eine Action in deinem Controller.php ausführt. In dieser Action werden deine Datenbank-operationen durchgeführt.
So wie ich das aus dem Beispiel verstanden habe müsste es so klappen… Aber leider klappt es so nicht. Wenn ich auf dem Link klicke dann gibt es kein Eintrag in der DB. Ich weiß nicht wo der Fehler sein könnte. Bootstrap.php [code]<?php class Shopware_Plugins_Frontend_MeinControllerTest_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
…
…
…
public function install()
{
$this->subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Frontend\_Checkout', 'onPostDispatchCheckout' ); $this-\>subscribeEvent( 'Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_MeinControllerTest', 'onGetFrontendController' ); return true; } public function onPostDispatchCheckout(Enlight\_Event\_EventArgs $arguments) { $view = $arguments-\>getSubject()-\>View(); $config = $this-\>Config(); if (empty($config-\>show) && $config-\>show !== null) { return; } $view-\>addTemplateDir($this-\>Path() . 'Views/'); $view-\>extendsTemplate('frontend/template/finish.tpl'); } public function onGetFrontendController(Enlight\_Event\_EventArgs $arguments) { $this-\>Application()-\>Template()-\>addTemplateDir( $this-\>Path() . 'Views/' ); return $this-\>Path() . 'Controllers/Frontend/MeinControllerTest.php'; } public function uninstall() { return true; } }//class ?\> [/code] Controllers/Frontend/MeinControllerTest.php [code]<?php class Shopware_Controllers_Frontend_MeinControllerTest extends Enlight_Controller_Action
{
public function setSomeDataInDB()
{
Shopware()->Plugins()-\>Controller()-\>ViewRenderer()-\>setNoRender(); //vorausgesetzt die Tabelle "SomeTable" ist schon angelegt! $sql = "INSERT INTO SomeTable (Wert) VALUES ('123');"; Shopware()-\>DB()-\>query($sql); } } [/code] finish.tpl [code] {block name="frontend\_index\_header\_javascript" append} <script src="%7Blink%20file='frontend/template/_resources/javascript/clickHandler.js'%7D"></script> {/block} {block name="frontend\_checkout\_finish\_item"} {include file='frontend/template/finish2.tpl'} {/block} [/code] finish2.tpl [code]
Öffne eine Seite
[/code] frontend/template/_resources/javascript/clickHandler.js $( document ).ready(function() { $(".myDiv").click(function(){ var myurl = $element.find('input[name=requestUrl]').val(); $.ajax({ // the URL for the request url: myurl, // the type of data we expect back dataType : "json", // code to run regardless of success or failure complete: function( xhr, status ) { alert( "The request is complete!" ); } }); }); });
Hallo jakko, ich habe deinen Code jetzt nur überflogen, allerdings ist mir da etwas aufgefallen. In deiner Javascript-Datei benutzt du $element. Dabei wurde element[/b] vorher nicht definiert. Versuch es doch einmal stattdessen mit [b](this). Alternativ sollte dir Firebug bei der Fehlersuche behilflich sein. Einfach einmal die Konsole öffnen, auf das Element klicken und schauen was passiert - bzw. eben nicht passiert. Viele Grüße, Patrick :shopware:
Hallo jakko, der Funktionsname “setSomeDataInDB” ist noch nicht ganz korrekt. Dort fehlt noch ein Action, der gesamte Funktionsname müsste also heißen: setSomeDataInDBAction Dies musst du jedoch nur in deinem PHP-Code ändern, nicht in deinen HTML/Javascript-Dateien. Gruß, Patrick:shopware:
Hallo Patrick! Ich habs probiert aber leider klappt das auch nicht… In mein ajax request habe ich jetzt noch ein alert bei der success function hinzugefügt, damit ich sehe ob der request erfolg hatte. Das alert box in success wird aber nicht ausgeführt, also wird der request überhaupt nicht ausgeführt… $(".meinDiv").click(function(){ var myurl = $(this).find('input[name=requestUrl]').val(); $.ajax({ // the URL for the request url: myurl, // the type of data we expect back dataType : "json", // code to run if the request succeeds; // the response is passed to the function success: function( json ) { //wird nicht ausgeführt.. alert( "The request was succesfull!" ); }, // code to run regardless of success or failure complete: function( xhr, status ) { alert( "The request is complete!" ); } }); }); hmm … was mache ich nur falsch…?
Hallo jakko, bei mir funktioniert dein Code reibungslos. Hast du einmal überprüft, ob dein SQL-Statement mit deiner Datenbank übereinstimmt? Wie bereits erwähnt sollte dir Firebug bei der Fehlersuche auch stark behilflich sein. Gruß, Patrick :shopware:
Jetzt gehts endlich. Vielen Dank an allen Beteiligten. Die Bemerkungen von Patrick waren alle hilfreich und auch korrekt nur ich habe den dummen Fehler gemacht, dass ich warum auch immer ein Codeteil in der install methode in Bootstrap.php auskommentiert hatte und dann völlig vergessen habe den Codeteil wieder zu aktivieren :)… …folgenden Codeteil hatte ich in der install Methode in Bootstrap deaktiviert. $this-\>subscribeEvent( 'Enlight\_Controller\_Dispatcher\_ControllerPath\_Frontend\_MeinControllerTest', 'onGetFrontendController' ); Jetzt gehts, ich bin erleichtert