Grundsatzfrage - Zugriff auf Datenbank/Artikel/Attribute

Schau doch mal was an das Template übergeben wird. [code] echo ’

'; var\_dump($args-\>getSubject()-\>View()-\>myProdList); echo '

'; [/code]

Wie kann ich das denn machen? Das ist Neuland für mich. Mit Firebug?

Einfach die 3 Zeilen ans Ende der Funktion ins Plugin kopieren. Dann wird der Inhalt des Arrays einfach als Text auf der Seite ausgegeben. [code] $dbData = Shopware()->Db()->fetchAll($sql); foreach ($dbData as $data){ if (!empty($data[“articleId”])){ $id = $data[“articleId”]; $tmpContainer = Shopware()->Modules()->Articles()->sGetPromotionById(“fix”,0,$id); if (!empty($tmpContainer[“articleName”])){ $args->getSubject()->View()->myProdList = $tmpContainer; } } } echo ’

'; var\_dump($args-\>getSubject()-\>View()-\>myProdList); echo '

'; } [/code]

Das kommt raus: array(1) { [0]=\> array(3) { ["articleId"]=\> string(4) "2585" ["articleName"]=\> string(51) "MMI 2G AMI Ipod Iphone Interface Audi A5 A6 A8 Q7 " ["articleImage"]=\> string(36) "cd13187e9dafc120ae1e3b2136c64967.jpg" } }

Kann normal nicht sein. Hast du evtl. vergessen diese Zeile zu löschen. $args->getSubject()->View()->myProdList = $dbData;

Wenn ich diese Zeile raus nehme kommt nur noch: NULL

Die DB-Abfrage scheint ja zu funktionieren. Am besten mal den kompletten Plugin-Code posten. Ist wohl noch ein Fehler drin.

Das heißt das es damit funktionieren müsste {foreach from=$myProdList item=sArticle}[![]({$sArticle.image})]({$sArticle.linkDetails}){/foreach}

Also mir scheinen die Variablen nicht zu passen, die foreach Abfrage funktioniert in jedem Fall, aber mir wird mit {$sArticle.image} oder {$sArticle.name} einfach nichts ausgegeben. Trage ich dafür einfach mal Text oder einen anderen Bildlink ein, wird dieser auch so oft ausgegeben, wie Artikel das attr6 haben.

Die Variablen sind ja auch falsch - articleName statt name wäre z.B. korrekt :wink:

Ich habe es mit{$articleName} und {$articleImage} schon probiert, das geht aber nicht.

Stell doch bitte nochmal deinen kompletten Code der Bootstrap.php hier ein …

[code]<?php class Shopware_Plugins_Frontend_Gallerie_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function install()
{
$event = $this->createEvent( ‘Enlight_Controller_Action_PostDispatch’, ‘onPostDispatch’ ); $this->subscribeEvent($event); $form = $this->Form(); $form->setElement(‘checkbox’, ‘right’, array(‘label’=>‘Anzeige rechts mittig’,‘value’=>false, ‘scope’=>Shopware_Components_Form::SCOPE_SHOP)); $form->save(); return true; } public static function onPostDispatch(Enlight_Event_EventArgs $args) { $request = $args->getSubject()->Request(); $response = $args->getSubject()->Response(); $view = $args->getSubject()->View(); $config = Shopware()->Plugins()->Frontend()->Gallerie()->Config(); $view->GallerieConfig = $config; $view->addTemplateDir(dirname(__FILE__).’/templates/’); $view->extendsTemplate(‘frontend/plugins/gallerie/index.tpl’); $sql = “SELECT a.id as articleId, a.name as articleName, CONCAT(ai.img, ‘.’, ai.extension) as articleImage FROM s_articles a INNER JOIN s_articles_attributes at ON a.id = at.articleID LEFT JOIN s_articles_img ai ON a.id = ai.articleID WHERE ai.main=1 AND at.attr6 = ‘1’”; $dbData = Shopware()->Db()->fetchAll($sql); $args->getSubject()->View()->myProdList = $dbData; /* echo ’

'; var\_dump($args-\>getSubject()-\>View()-\>myProdList); echo '

'; */ } public function getInfo() { return array( ‘version’ => “1.0”, ‘autor’ => ‘Frank Nitsche’, ‘copyright’ => ‘Copyright © 2011 CarHifi-Store Bünde’, ‘label’ => “Gallerie”, ); } }[/code]

Und wenn du nun hinter: $dbData = Shopware()-\>Db()-\>fetchAll($sql); print\_r($dbData); exit; einfügst? Welche Daten werden da genau ausgegeben?

Moin taaucher, ausgehend von dem Threadverlauf dachte ich, dass du diesen Code: $dbData = Shopware()-\>Db()-\>fetchAll($sql); foreach ($dbData as $data){ if (!empty($data["articleId"])){ $id = $data["articleId"]; $tmpContainer = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById("fix",0,$id); if (!empty($tmpContainer["articleName"])){ $args-\>getSubject()-\>View()-\>myProdList[] = $tmpContainer; } } } mit diesem Template-Code verwendest: {foreach from=$myProdList item=sArticle} [![]({$sArticle.image})]({$sArticle.linkDetails}) {/foreach} Und evtl. noch die von Stefan modifizierte SQL-Anweisung. Sonst musst du natürlich die Bezeichner aus der SQL-Anweisung verwenden (z.B. articleImage).

[quote=“Stefan Hamann”]Und wenn du nun hinter: $dbData = Shopware()-\>Db()-\>fetchAll($sql); print\_r($dbData); exit; einfügst? Welche Daten werden da genau ausgegeben?[/quote] Das hier: Array ( [0] => Array ( [articleId] => 2585 [articleName] => MMI 2G AMI Ipod Iphone Interface Audi A5 A6 A8 Q7 [articleImage] => cd13187e9dafc120ae1e3b2136c64967.jpg ) )

Ich habe jetzt so ziemlich alle Konstellationen durch, auch {$sArticle.image} funktioniert nicht…

[quote] Das hier: Array ( [0] => Array ( [articleId] => 2585 [articleName] => MMI 2G AMI Ipod Iphone Interface Audi A5 A6 A8 Q7 [articleImage] => cd13187e9dafc120ae1e3b2136c64967.jpg ) ) [/quote] Wenn diese Daten an das Template übergeben werden - kannst du ja nicht per $sArticle.image auf ein Bild zugreifen — das ist doch oben in dem Array überhaupt nicht definiert. Also dann wäre es, {$sArticle.articleImage} - und auch das würde nicht funktionieren, da der Link zum Bild fehlt. Also nochmal volle fahrt zurück bitte - das Ergebnis wie jetzt auslesen und dann mit einer foreach über das Ergebnis iterieren. if (!empty($data["articleId"])){ $id = $data["articleId"]; $tmpContainer = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById("fix",0,$id); if (!empty($tmpContainer["articleName"])){ $args-\>getSubject()-\>View()-\>myProdList[] = $tmpContainer; } } Dann hast du in $myProdList definitiv alle Artikeldaten (vollständig) - diese kannst du dann im Template ausgeben und mit den GLEICHEN Parametern abfragen, die auch an anderen stellen im Frontend verwendet werden. Ansonsten lese dir mal den Artikel Debuggen mit Shopware 3.5 durch - du kannst so Variablen wie $myProdList dann einfach direkt in Firebug einsehen und weißt somit genau, welche Informationen überhaupt im Template ankommen!

Du übergibst es jetzt so ins Template, oder? $dbData = Shopware()-\>Db()-\>fetchAll($sql); $args-\>getSubject()-\>View()-\>myProdList = $dbData; Versuch es dann mal im Template mit: {$myProdList[0].articleImage} Was sagt Firebug? EDIT: Dann ist mein Ansatz auch falsch :sunglasses:

Das ist doch eigentlich ganz einfach - man kann im Template nur auf das zugreifen, was man in der Controller-Ebene auch definiert / übergeben hat. Wenn man also im Controller die Variablen ausgibt (z.B. mit print_r und var_dump) und dort steht nichts von articleLink imageXY oder name12, dann ist doch klar, das man auf diese Werte auch nicht im Template zugreifen kann, oder? :wink: Wenn also im Template nicht die erwünschten Werte zur Verfügung stehen, dann ist der einzig sinnvolle Weg, die Daten im Controller zu debuggen - also zu prüfen, ob eventuell die Datenbank-Query falsch ist oder aber die Daten in einer anderen Struktur übergeben werden. Sprich, man erzeugt einen Dump der Daten, die man an das Template übergibt. Wenn ich die Zuweisung wie folgt durchführe: $args->getSubject()->View()->myProdList = [QUERY…]; und mit var_dump($args->getSubject()->View()->myProdList); folgende Ausgabe erhalte: Array ( [0] =\> Array ( [articleId] =\> 2585 [articleName] =\> MMI 2G AMI Ipod Iphone Interface Audi A5 A6 A8 Q7 [articleImage] =\> cd13187e9dafc120ae1e3b2136c64967.jpg ) ) kann ich im Template ganz SICHER per Foreach über das Array iterieren und die Elemente, über die Keys ansprechen, die ich in der Ausgabe erhalte. Also z.B. Artikelname über articleName. Ansonsten BITTE das Tutorial zum Debuggen anschauen und FirePHP installieren - damit bekommt ihr eine Übersicht über alle Template-Variablen frei Haus und dann wisst ihr, wie ihr die Elemente ansprechen müsst.