Grundsatzfrage - Zugriff auf Datenbank/Artikel/Attribute

[quote=“Stefan Hamann”][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![/quote] Entschuldige Stefan wenn ich dir nicht ganz folgen konnte. Die Bootstrap.php sieht dann so aus: <?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'); $limit = 5; $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' ORDER BY rand() LIMIT $limit "; $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; } } } public function getInfo() { return array( 'version' =\> "1.0", 'autor' =\> 'Frank Nitsche', 'copyright' =\> 'Copyright © 2011 CarHifi-Store Bünde', 'label' =\> "Gallerie", ); } } Und meine index.tpl {block name="frontend\_home\_right\_campaign\_top" append} {if $GallerieConfig.right == "1"} {foreach from=$myProdList item=sArticle} [![{$sArticle.name}]({$sArticle.image.src.1})]({$sArticle.link} "{$sArticle.name}") {/foreach} {/if} {/block}

Das kann so aber immer noch nicht gehen… Mach mal einen Dump von $args->getSubject()->View()->myProdList Die Variablen sollten linkDetails und articleName heißen - funktioniert es damit?

Also die Sache funktioniert, beim Bild muß ich ja den Pfad davor noch angeben, dann kann ich mit {$sArticle.articleImage} auf das Bild zugreifen. {$sArticle.articleName} geht auch, genau wie die ID. Jetzt müßte ich nur noch an die Links kommen, und das fehlt denke ich in der sql Abfrage noch. So langsam verstehe ich das Ganze, wobei mir die Abfrage der sql Geschichte doch noch etwas unklar ist. Warum heißt es SELECT a.id as articleId ? bezieht sich das kleine a auf FROM s_articles a ? Wofür steht das a? Einfach als Abkürzung? Um an die Links zu kommen müßte ich das doch jetzt erweitern SELECT a.link as articleLink FROM s_articles_information a ? Dann hätte ich Zugriff über {$sArticle.articleLink} Vielen Dank schon mal für eure Unterstützung :thumbup:

Hallo taaucher, die SQL-Abfrage dient eigentlich ‘jetzt’ nur noch dazu eine Liste mit Artikel-IDs zu liefern (attr6 == ‘1’). Dann werden, für jede einzelne Artikel-ID dieser Liste, mit ‘sGetPromotionById()’ die Artikeldaten ermittelt und in ‘myProdList’ gespeichert. Heißt also die SQL-Abfrage hat mit den Artikeldaten eigentlich nichts mehr zu tun. Alle Daten, Bezeichner kommen von ‘sGetPromotionById()’. Deswegen mal ‘$args->getSubject()->View()->myProdList’ anschauen. Sollten schon alle Daten dabei sein. Das Bild mit Pfad sollte man mit ‘image’ erhalten. Habs aber nicht getestet.

Hi Ralf, das mit dem Bild ist kein Problem, das klappt jetzt. Was meinst du mit ‚$args->getSubject()->View()->myProdList‘ anschauen?

Halt einfach das Array anschauen, das an das Template übergeben wird. Da siehst du dann, welche Daten zur Verfügung stehen und unter welchem Namen man die jeweiligen Felder anspricht. Spart ja auch Arbeit, da manches schon vorhanden ist, was man sich evtl. erst zusammenstricken müßte. :thumbup:

Aber das wäre doch dann die Ausgabe, oder? 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" } }

Das müßte ‚$dbData‘ sein: $dbData = Shopware()->Db()->fetchAll($sql); aber nicht das, was ‚sGetPromotionById()‘ zurückgibt. Aber es geht ja auch ohne ‚sGetPromotionById()‘. Je nachdem, wie du es umgesetzt hast?

Hi Ralf, also langsam verwirrt mich das Ganze. Meine Bootstrap und index stehen ja oben, du hattest mir mal den Dump empfohlen mit echo ’

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

'; Was der ausgibt steht ja auch oben. Das ist doch der Dump von ‘$args->getSubject()->View()->myProdList’

Wenn ich statt: $args->getSubject()->View()->myProdList = $dbData; $args->getSubject()->View()->myProdList = $tmpContainer; einsetze, dann bekomme ich alle Informationen aus dem Artikel. array(60) { ["articleID"]=\> string(4) "2585" ["articleDetailsID"]=\> string(4) "2666" ["ordernumber"]=\> string(8) "CHS10687" ["datum"]=\> string(10) "2011-02-03" ["sales"]=\> string(1) "0" ["highlight"]=\> string(1) "0" ["description"]=\> string(0) "" ["description\_long"]=\> string(849) "I-Pod und I-Phone Interface für Audi A5, A6, A8 und Q7 mit MMI High 2G Navigationssystem. Einfache Aufrüstung ihres Systems um in den Genuß von ihrer Musiksammlung von I-Pod oder I-Phone zu kommen. Alle Daten werden wie gewohnt im FIS und auf dem 7" Display dargestellt. Suche nach Wiedergabelisten, Interpreten, Titeln, Genre usw... Der I-Pod/I-Phone wird komplett über das MMI System gesteuert und gleichzeitig auch geladen. Der optimale Einbauort ist im Handschuhfach. Navigieren sie bequem durch 1000de Songs in gewohnter Qualität. Das Interface wird wie das original von Audi als Audi Music Interface eingebunden und angezeigt. Das MMI System sollte bei Fehlfunktion auf den aktuellen Stand geupdatet werden, das macht gern ihr VAG Partner. Der Einbau durch uns ist problemlos für 40€ möglich. Artikel ist neu und mit voller Garantie!" ["supplierName"]=\> string(5) "Dietz" ["supplierImg"]=\> string(36) "1f452099b2f0431d1b74b96fb2b53245.gif" ["articleName"]=\> string(49) "MMI 2G AMI Ipod Iphone Interface Audi A5 A6 A8 Q7" ["price"]=\> string(6) "219,00" ["pseudoprice"]=\> string(6) "349,00" ["tax"]=\> string(2) "19" ["attr1"]=\> string(1) "0" ["attr2"]=\> string(1) "0" ["attr3"]=\> string(1) "0" ["attr4"]=\> string(0) "" ["attr5"]=\> string(0) "" ["attr6"]=\> string(1) "1" ["attr7"]=\> string(0) "" ["attr8"]=\> string(1) "0" ["attr9"]=\> string(0) "" ["attr10"]=\> string(0) "" ["attr11"]=\> string(0) "" ["attr12"]=\> string(0) "" ["attr13"]=\> string(1) "0" ["attr14"]=\> string(0) "" ["attr15"]=\> string(0) "" ["attr16"]=\> string(0) "" ["attr17"]=\> string(10) "0000-00-00" ["attr18"]=\> string(0) "" ["attr19"]=\> string(0) "" ["attr20"]=\> string(0) "" ["instock"]=\> string(1) "2" ["weight"]=\> string(1) "1" ["shippingtime"]=\> string(1) "4" ["pricegroup"]=\> string(2) "EK" ["pricegroupID"]=\> string(1) "1" ["pricegroupActive"]=\> string(1) "0" ["filtergroupID"]=\> string(1) "0" ["purchaseunit"]=\> string(1) "0" ["referenceunit"]=\> string(1) "0" ["unitID"]=\> string(1) "0" ["laststock"]=\> string(1) "1" ["additionaltext"]=\> string(0) "" ["sConfigurator"]=\> string(1) "0" ["esd"]=\> string(1) "0" ["sVoteAverange"]=\> array(2) { ["averange"]=\> float(0) ["count"]=\> float(0) } ["newArticle"]=\> string(1) "0" ["topseller"]=\> string(1) "0" ["sUpcoming"]=\> string(1) "0" ["sReleasedate"]=\> string(0) "" ["sVariantArticle"]=\> bool(false) ["priceStartingFrom"]=\> int(0) ["pseudopricePercent"]=\> array(2) { ["int"]=\> float(37) ["float"]=\> float(37.25) } ["image"]=\> array(5) { ["src"]=\> array(7) { ["original"]=\> string(87) "http://www.carhifi-store-buende.de/images/articles/cd13187e9dafc120ae1e3b2136c64967.jpg" [0]=\> string(89) "http://www.carhifi-store-buende.de/images/articles/cd13187e9dafc120ae1e3b2136c64967\_0.jpg" [1]=\> string(89) "http://www.carhifi-store-buende.de/images/articles/cd13187e9dafc120ae1e3b2136c64967\_1.jpg" [2]=\> string(89) "http://www.carhifi-store-buende.de/images/articles/cd13187e9dafc120ae1e3b2136c64967\_2.jpg" [3]=\> string(89) "http://www.carhifi-store-buende.de/images/articles/cd13187e9dafc120ae1e3b2136c64967\_3.jpg" [4]=\> string(89) "http://www.carhifi-store-buende.de/images/articles/cd13187e9dafc120ae1e3b2136c64967\_4.jpg" [5]=\> string(89) "http://www.carhifi-store-buende.de/images/articles/cd13187e9dafc120ae1e3b2136c64967\_5.jpg" } ["res"]=\> array(3) { ["original"]=\> array(2) { ["width"]=\> string(3) "700" ["height"]=\> string(3) "487" } ["description"]=\> string(0) "" ["relations"]=\> string(0) "" } ["position"]=\> string(1) "1" ["extension"]=\> string(3) "jpg" ["main"]=\> string(1) "1" } ["linkBasket"]=\> string(43) "shopware.php?sViewport=basket&sAdd=CHS10687" ["linkDetails"]=\> string(43) "shopware.php?sViewport=detail&sArticle=2585" ["mode"]=\> string(3) "fix" } Aber was tue ich damit?

Hallo, ‘$args->getSubject()->View()->myProdList’ wird hier schon gesetzt: 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; } } Diese Zeile kann gelöscht werden: $args-\>getSubject()-\>View()-\>myProdList = $dbData; Die Felder kannst du im Template verwenden, z.B. $sArticle.linkDetails, $sArticle.articleName, $sArticle.image.src.1,

Wenn ich die Zeile lösche erhalte ich keine Daten mehr. Ersetze ich $dbData mit $tmpContainer, dann werden bei meiner foreach Abfrage 60 Einträge ausgegeben, obwohl nur ein Artikel das attr6 gesetzt hat.

Also mit dbData könnte ich arbeiten, nur fehlt mir das der Artikel Link, da nur der Name, das Bild und die ID ausgegeben werden. In dem tmpContainer stehen wohl alle Daten drin, aber hier fehlt mir die Abfrage, mit {foreach from=$myProdList item=sArticle} komme ich da nicht weiter.

Stell bitte nochmal eben den aktuellen Code rein - also Bootstrap + Template. Ich stelle dir dann die fertige Lösung hier in den Thread, ist denke ich einfacher :wink:

Bootstrap.php <?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'); $limit = 5; $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' ORDER BY rand() LIMIT $limit "; $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; } } } $args-\>getSubject()-\>View()-\>myProdList = $dbData; } public function getInfo() { return array( 'version' =\> "1.0", 'autor' =\> 'Frank Nitsche', 'copyright' =\> 'Copyright © 2011 CarHifi-Store Bünde', 'label' =\> "Gallerie", ); } } index.tpl {block name="frontend\_home\_right\_campaign\_top" append} {if $GallerieConfig.right == "1"} {foreach from=$myProdList item=sArticle} [![{$sArticle.articleName}]({$sArticle.articleImage})]({sArticle.link "{$sArticle.articleName}") {/foreach} {/if} {/block}

Code index.tpl {block name="frontend\_home\_right\_campaign\_top" append} {if $GallerieConfig.right == "1"} {foreach from=$myProdList item=sArticle} [![{$sArticle.articleName}]({$sArticle.image.src.3})]({$sArticle.linkDetails} "{$sArticle.articleName}") {/foreach} {/if} {/block} Code Bootstrap.php <?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'); $attributToSearchFor = 'attr6'; $limit = 5; $sql = "SELECT a.id as id 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.$attributToSearchFor = '1' ORDER BY rand() LIMIT $limit "; $dbData = Shopware()-\>Db()-\>fetchAll($sql); $result = array(); foreach ($dbData as $data){ if (!empty($data["id"])){ $id = $data["id"]; $tmpContainer = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById("fix",0,$id); if (!empty($tmpContainer["articleName"])){ $result[] = $tmpContainer; } } } $args-\>getSubject()-\>View()-\>myProdList = $result; } public function getInfo() { return array( 'version' =\> "1.0", 'autor' =\> 'Frank Nitsche', 'copyright' =\> 'Copyright © 2011 CarHifi-Store Bünde', 'label' =\> "Gallerie", ); } }

Hi, hier nur ein paar Tips für dein Plugin: 1. Nie fremde Werte direkt in einem SQL-Befehl verwenden: (In diesem Fall nur aus Prinzip.) Besser: $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=? ORDER BY rand() "; $sql = Shopware()-\>Db()-\>limit($sql, 5); $dbData = Shopware()-\>Db()-\>fetchAll($sql, array(1)); 2. An die Methode “sGetPromotionById” sollte ein Integer übergeben werden, da sonst die Methode auch nach einem Artikel mit dieser Bestellnummer sucht. 3. Dieses Construct “View()->myProdList = 323” kann gar nicht funktionieren, da der View immer nur eine Kopie des Array zurückgibt. Besser: foreach ($dbData as $key =\> $data) { $tmpContainer = Shopware()-\>Modules()-\>Articles()-\>sGetPromotionById("fix",0, (int) $data["articleId"]); if (!empty($tmpContainer["articleName"])){ $dbData[$key] = array\_merge($data, $tmpContainer); } } Viele Grüße Heiner

Ich habe das Ganze jetzt soweit am laufen. Allerdings habe ich folgendes Problem. Ich möchte einen Artikel anlegen, der aber keiner Kategorie zugeordnet ist, der soll nirgends im Shop auftauchen, nur in meinen Template. Dann würde ich auch gern den Link unter den Stammdaten/Links abfragen, mit {$sArticle.linkDetails} wird ja nur auf den Artikel im Shop verlinkt, ich möchte aber einen eigenen Link verwenden (mache das jetzt mit dem attr3). Was müßte ich dafür ändern? Aktuell wird nichts von dem array übergeben wenn der Artikel nicht aktiv ist und keiner Kategorie zugeordnet ist.

Also wenn wir es noch hinbekommen das ich die Artikel nicht in eine Kategorie packen muß wäre ich glücklich :sunglasses:

Am Montag kann ich dir weiterhelfen :wink: Ansonsten lege doch eine neue Stammkategorie an, also neben Deutsch. Die nennst du dann „Trash“ und ordnest die Artikel dort zu. Dann tauchen die ja trotzdem nicht im normalen Shop auf… Bin mir jetzt nicht, müsstest du eben ausprobieren!