@Shopware AG: Verständnis-Problem Smarty-Objekte

Ich bereite in einer in der „frontend/index/index.tpl“ eingebetteten PHP-Routine den HTML-Code für einige „Boxen“ auf (das sind die Elemente in der Linken und rechten Navi-Leiste). Über das dort schon definierte „$smarty“-Objekt geschieht das z.B. mit „$smarty->assign(‚box_CATEGORIES‘,$box_code);“ Das funktioniert auch, d.h. im „tpl_vars“-Array des „$smarty“-Objekts sind alle meine Boxen schön enthalten… Das Problem: Wenn ich jetzt in „frontend/index/index.tpl“ diese Box mit {box\_CATEGORIES} einbinden will, dann ist da kein Code enthalten... Smarty kompiliert diesen Zugriff zu "_smarty_tpl->getVariable(‚box_CATEGORIES‘)->value". Das bedeutet wohl, dass das „smarty"-Objekt ein anderes ist, als das "_smarty_tpl“-Objekt… Das „$_smarty_tpl“-Objekt ist aber zu dem Zeitpunkt, an dem ich es benötige, noch nicht definiert… Die Frage ist also: wie bekomme ich meine „Boxen“ in das richtige Smarty-Objekt? Ganz am Anfang von „frontend/index/index.tpl“ ist meine Routine eingebettet mit {php} //Do the magic! if (INIT\_DONE!==true) { define('INC\_PATH',$smarty-\>template\_dir[1].'frontend/\_pt\_inc/'); include(INC\_PATH.'pt\_setup.inc.php'); } {/php} Das erwähnte „$smarty“-Objekt ist dort schon definiert… In den GAMBIO/xtc- und OXID-Umgebungen hat diese Vorgehensweise bisher prima funktioniert, da es nur ein „Smarty“-Objekt gibt, hier ist das anscheinend etwas komplizierter…

Also eines ist sicher: mit Shopware muss man erst mal alles vergessen, was man bisher mit GAMBIO und OXID so gemacht hat… :wtf: Ich habe mein Problem mit meiner Template-Initialisierung und den „Boxen“ jetzt dadurch lösen können, dass ich das nicht mehr im Template mache, sondern mich in die „View“-Erstellung eingeklinkt habe… Derzeit mache ich das in „engine/Shopware/Plugins/Default/Core/ControllerBase/Bootstrap.php“, wo ich folgenden Code eingefügt habe, der dann eine ganze Reihe von Template-Initialisierungen durchführt, und meine „Boxen“ im „View“ speichert. //Avenger //Do the template magic! $aTemplateDirs=Shopware()-\>Template()-\>getTemplateDir(); define('INC\_PATH',$aTemplateDirs[1].'frontend/\_pt\_inc/'); include(INC\_PATH.'pt\_setup.inc.php'); //Avenger Das Prinzip funktioniert erfreulicher Weise jetzt schon mal, die Kür (das alles schön systemkonform in ein Plugin verpacken) kommt später… Zumindest wissen wir jetzt, dass unsere gewohnte Arbeitsweise auch bei Shopware funktionieren wird, und das ist schon mal sehr erfreulich. Folgend die ersten „Zuckungen“ eines Shopware-Templates mit komplett anderem Layout… Sieht zwar noch ziemlich aus „wie Hund“, weil das CSS (und eine Reihe anderer Dinge, einschl. dem Layout) überhaupt noch nicht passen, aber das ist jetzt einfach in den Griff zu bekommen… (Die Namespace-Bindung der Textbausteine ( viewtopic.php?f=14&t=395&p=2679#p2177 ) hindert auch noch sehr, da kommen dann so unschöne Texte wie „#BreadcrumbDefault#“ zu Stande. Aber da will die Shopware AG ja noch was dran tun, dass man Template Elemente beliebig verlagern kann, ohne dasss die Texte verloren gehen…) Das ist so die Art Templates, die wir entwickeln: voll graphisch (auch die individuellen Buttons, Boxenheader usw.)), mit dem Standard-Shopware-Template wird das nicht mehr viel zu tun haben (funktional natürlich schon)… Warum der ganze Aufwand, fragt man sich vielleicht… Weil damit eine ganze Reihe von Automatismen möglich werden, die uns die Arbeit sehr erleichtern. z.B. entsteht der grafische Header einfach dadurch, dass man die Headergrafiken in einem bestimmten Verzeichnis ablegt, ebenso auch Grafiken, die man im Contentbereich haben will. Oder ich kann die „Topseller“-Box einfach in die linke Spalte verlagern, indem ich in einer Box-Konfigurations-Datei die Anweisung box\_topseller=r,1 (1. Box in der rechten Spalte) in box\_topseller=l,5 (5. Box in der linken Spalte) ändere… Bei den vielen Templates, die wir machen, ist das eine echte Erleichterung, weil man ohne Template-Änderungen (an unserem Standard-Template) das Shop-Layout sehr flexibel handhaben kann. (Und durch die ganzen Untersuchungen lernt man nebenbei die Shopware-Software immer besser kennen… :thumbup: ) Wen es interessiert: hier ein paar (wenige) von powertemplate designte Shops aus de Gambio-/xtc- und OXID-Welt (nichts von der Stange, alles kundenspezifische Maßanzüge…): http://www.tretwerk.net/ http://www.alternative-haustechnik.de/ http://heimhifi.com/ http://digital-readers.de/ http://www.just-sound.de/ http://www.robosauger.com/ http://www.powertemplate.de/kunden/yankee/ http://www.lensshop24.de http://www.bioticana.de/ http://www.doktorhardstuff.de/ http://www.savegame24.de/ http://www.carsystem24.de/ http://www.swiss-code-red.com/ (Noch kein Shop sondern eher eine Image-Seite, aber implementiert mit Gambio GX, da es mal ein Shop werden soll) http://www.mxstuff.net/ http://beckpc.ch/game/index.php http://beckpc.ch/soho/index.php (Die letzten beiden Shops haben einen sehr umfangreichen Systemkonfigurator…) Und ab 2011 können dann auch Shopware-Templates von powertemplate so individuell aussehen… :sunglasses:

Wie ich gerade erfahre, haben wir unseren ersten Shopware-Design-Auftrag erhalten… Passt terminlich sehr gut, weil das erst Anfang 2011 losgehen soll… Wird was ganz besonderes: ein edler Designermoden-Shop mit allem Schnick und Schnack… Mit dem Kunden arbeiten wir schon seit Jahren sehr gut mit mehreren Shops auf xtCommerce-Basis zusammen. Jetzt war er aber von dem Shopware-Produkt so sehr angetan, dass er den neuen Shop damit machen, und in modernere Zeiten aufbrechen will… Ein paar Plugins braucht er da auch noch (Konfigurator, Newsletter und so). Wird sicher spannend…

Moin! Glückwunsch, das freut mich sehr. :thumbup:

[quote=“Stefan Hamann”]Moin! Glückwunsch, das freut mich sehr. :thumbup:[/quote] Uns auch… Da Du gerade hier bist… [quote]Derzeit mache ich das in “engine/Shopware/Plugins/Default/Core/ControllerBase/Bootstrap.php”, wo ich folgenden Code eingefügt habe, der dann eine ganze Reihe von Template-Initialisierungen durchführt, und meine “Boxen” im “View” speichert. //Avenger //Do the template magic! $aTemplateDirs=Shopware()->Template()->getTemplateDir(); define(‘INC_PATH’,$aTemplateDirs[1].‘frontend/_pt_inc/’); include(INC_PATH.‘pt_setup.inc.php’); //Avenger [/quote] “engine/Shopware/Plugins/Default/Core/ControllerBase/Bootstrap.php” ist sicher nicht der beste Platz, um sich einzuklinken… Wo würde man sich denn, systematisch korrekt, besser einklinken?

Das soll einfach bei jedem Controller aktiv werden, oder? Dann kannst du dich am besten in $event = $this-\>createEvent( 'Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch' ); $this-\>subscribeEvent($event); einklinken! Im Listener kannst du per public static function onPostDispatch(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject()-\>View(); } auf den View!

[quote=„Stefan Hamann“]Das soll einfach bei jedem Controller aktiv werden, oder? Dann kannst du dich am besten in $event = $this-\>createEvent( 'Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch' ); $this-\>subscribeEvent($event); einklinken! Im Listener kannst du per public static function onPostDispatch(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject()-\>View(); } auf den View![/quote] In welchem Modul? Einem eigenen Plugin?

Ja, entweder neues Plugin & Integration in irgendein Plugin, was deinerseits evtl. bereits angelegt worden ist. Also einfach unter Shopware\Plugins\Frontend ein neues Plugin Powertemplate & dann <?php class Shopware_Plugins_Frontend_Powertemplate_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function install() { $event = $this->createEvent( 'Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch' ); $this-\>subscribeEvent($event); } public static function onPostDispatch(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject()-\>View(); // Dein Code } } Wenn du die Ausgabe auf z.B. einen Controller beschränken möchtest, kannst du nach folgendem Schema Events definieren. Enlight_Controller_Action_PostDispatch_Frontend_Detail Enlight_Controller_Action_PostDispatch_Frontend_Checkout Enlight_Controller_Action_PostDispatch_Frontend_Register Enlight_Controller_Action_PostDispatch_Frontend_Listing Also man kann diese Art von Event bis runter auf eine einzelne Controller-Action definieren

P.s. getSubject() liefert das Ursprungsobjekt, in diesem Fall also z.B. den aktuellen Controller - von da aus, kannst du dann auf alle anderen Shopware-Objekte!

[quote=“Stefan Hamann”]Ja, entweder neues Plugin & Integration in irgendein Plugin, was deinerseits evtl. bereits angelegt worden ist. Also einfach unter Shopware\Plugins\Frontend ein neues Plugin Powertemplate & dann <?php class Shopware_Plugins_Frontend_Powertemplate_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function install() { $event = $this->createEvent( 'Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch' ); $this-\>subscribeEvent($event); } public static function onPostDispatch(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject()-\>View(); // Dein Code } } Wenn du die Ausgabe auf z.B. einen Controller beschränken möchtest, kannst du nach folgendem Schema Events definieren. Enlight_Controller_Action_PostDispatch_Frontend_Detail Enlight_Controller_Action_PostDispatch_Frontend_Checkout Enlight_Controller_Action_PostDispatch_Frontend_Register Enlight_Controller_Action_PostDispatch_Frontend_Listing Also man kann diese Art von Event bis runter auf eine einzelne Controller-Action definieren[/quote] Das ist doch (wieder) mal ein Super-Service, danke! :thumbup:

[quote=“avenger”][quote=“Stefan Hamann”]Ja, entweder neues Plugin & Integration in irgendein Plugin, was deinerseits evtl. bereits angelegt worden ist. Also einfach unter Shopware\Plugins\Frontend ein neues Plugin Powertemplate & dann <?php class Shopware_Plugins_Frontend_Powertemplate_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function install() { $event = $this->createEvent( 'Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch' ); $this-\>subscribeEvent($event); } public static function onPostDispatch(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject()-\>View(); // Dein Code } } Wenn du die Ausgabe auf z.B. einen Controller beschränken möchtest, kannst du nach folgendem Schema Events definieren. Enlight_Controller_Action_PostDispatch_Frontend_Detail Enlight_Controller_Action_PostDispatch_Frontend_Checkout Enlight_Controller_Action_PostDispatch_Frontend_Register Enlight_Controller_Action_PostDispatch_Frontend_Listing Also man kann diese Art von Event bis runter auf eine einzelne Controller-Action definieren[/quote] Das ist doch (wieder) mal ein Super-Service, danke! :thumbup:[/quote] So, das Plugin habe ich erstellt und registriert, und es wir auch schön aktiviert… Es gibt jetzt nur das Problem, dass zum Zeitpunkt der Plugin-Aktivierung View-Daten, die in “Shopware_Plugins_Core_ControllerBase_Bootstrap extends Shopware_Components_Plugin_Bootstrap” erstellt werden, noch nicht vorhanden sind… (Da ich mich bisher in “Shopware_Plugins_Core_ControllerBase_Bootstrap extends Shopware_Components_Plugin_Bootstrap” direkt “hart” eingeklinkt hatte, waren die Informationen vorhanden.) Frage: wie kann ich denn erreichen, dass mein neues Plugin “Shopware_Plugins_Local_Frontend_Powertemplate_Bootstrap extends Shopware_Components_Plugin_Bootstrap” erst nach “Shopware_Plugins_Core_ControllerBase_Bootstrap extends Shopware_Components_Plugin_Bootstrap” aktiviert wird? [color=#FF0000]Das Plugin-System ist echt geil… :thumbup: [/color]

Hi avenger, das ist einfach. Als 3. Parameter, bei der Event-Registierung, kannst du die Ausführungsposition angeben. Dieser muss in diesem Fall zwischen 100 und 400 betragen, da der Event im ControllerBase-Plugin eine Ausführungsposition von 100 hat und im ViewRenderer eine eine Ausführungsposition von 400 hat. $event = $this-\>createEvent( 'Enlight\_Controller\_Action\_PostDispatch', 'onPostDispatch', 101-399 ); $this-\>subscribeEvent($event); Viele Grüße Heiner

[quote=„avenger“]Frage: wie kann ich denn erreichen, dass mein neues Plugin „Shopware_Plugins_Local_Frontend_Powertemplate_Bootstrap extends Shopware_Components_Plugin_Bootstrap“ erst nach „Shopware_Plugins_Core_ControllerBase_Bootstrap extends Shopware_Components_Plugin_Bootstrap“ aktiviert wird?[/quote] Frage selbst beantwortet: In Tabelle „s_core_subscribes“ muss der Eintrag des Plugins eine höhere "„position“ haben, als die anderen Plugins… (Ich hab das mal per SQL registriert, ist wirklich kein Problem…)