Hallo liebe Community, habe eine Frage: Ich habe pro Artikel (Hauptartikel genannt) ein Textfeld, in welches man Artikelnummern anderer Artikel reinschreiben soll. (im Backend bei den Stammdaten). Nun möchte ich, dass bestimmte Dinge (z.B. das Bild) dieser einzelnen Artikel auf meinem Hauptartikel erscheinen. Momentan kann ich zwar die einzelnen Artikelnummern auslesen, weiß leider aber nicht, wie ich mit denen nun weiter verfahren soll. {* Kabinen Ausstattung *} {block name=‚kabinen_ausstattung‘} {$Ausstattung = explode(’|’,$sArticle.attr4,20)} {$Ausstattung[1]} {/block}
Falls nicht ganz verständlich ist, was ich meine, bitte fragt nach.
mein Ansatz ist dieser: (wahrscheinlich aber sehr fehlerhaft) {\* Kabinen Ausstattung \*} {block name='kabinen\_ausstattung'} {$gefundeneArtikel = []} {$Ausstattung = explode('|',$sArticle.attr4,20)} {foreach from=$sArticle item=offer name="counter"} {foreach from=$Ausstattung item=offer name="counter2"} {if $sArticle.ordernumber == $Ausstattung} {array\_push($gefundeneArtikel,$sArticle)} {/if} {/foreach} {/foreach} {count($gefundeneArtikel)} {/block}
Ich hab gerade keinen Rechner mit installierter Shopware zur Hand, aber so aus dem Kopf (falls du mit Artikelnummern die Bestellnummern meinst): $articleDetailRepostiory = Shopware()-\>Models()-\>getRepository('Shopware\Models\Article\Detail'); $articleDetail = $articleDetailRepostiory-\>findOneBy(array('ordernumber' =\> 'SW10003')); $article = $articleDetail-\>getArticle();
Was dahinter steckt ist, dass die Ordernummer in den Artikeldetails abgebildet ist; der eigentliche Artikel ist dann eben über den Getter erreichbar.
Jetzt würde aber nur ein Artikel ausgegeben mit eben der entsprechend vordefinierten Bestellnummer. Wie kann ich jetzt jeden Artikel anzeigen, welcher eine Bestellnummer aus einem Array besitzt, anzeigen?
Da müsstest du dir einen Query zusammen bauen. So in der Art: $qb-\>select('articleDetails') -\>from('Shopware\Models\Article\Detail', 'articleDetails') -\>where('articleDetails.ordernumber IN (:ordernumbers)') -\>setParameter('ordernumbers', array( ... ));
Den QueryBuilder kriegst du auf verschiedene Arten. Entweder du erweiterst das Repository oder schreibst ein eigenes. Am einfachsten wäre es so: $qb = Shopware()-\>Models()-\>createQueryBuilder()
(Hab ich jetzt alles nicht getestet, schau mal in den Shopware Quellcode, da findest du in den Repostories viele Beispiele).
Wäre diese Abfrage auch innerhalb einer Smarty foreach Schleife machbar? Weil ich das Ganze direkt in einen Block in die description.tpl schreiben möchte. Bzw. ich hätte dann wiederum die Frage, wie ich eingetragenen Bestellnummern als Array dem PHP übergeben kann. Denn momentan funktioniert das Auslesen so: {$Ausstattung = explode('|',$sArticle.attr4,20)}
Das ginge wahrscheinlich mit viel bösem Willen und Gefrickel schon, aber Smarty ist eine Templating Engine und da hat das eigentlich nichts zu suchen …
Wenn du nur die Ordernummern haben willst, kannst du das ja im select angeben (‘articleDetails.ordernumber’), der QueryBuilder gibt eh schon einen Array zurück.
Also ich habe gegeben nur die Artikelnummern (möchte diese also nicht auslesen), da diese in ein Textfeld reingeschrieben werden. Was ich möchte ist, dass verschiedene Daten der dazugehörigen Artikel angezeigt werden.
Wenn ich jetzt natürlich eine PHP Datei in einen Block einfügen könnte, so könnte ich ja dann mit einer solchen Abfrage arbeiten. Aber wie übergebe ich dann den Aktuellen Artikel sodass man das Array mit den Artikelnummern aus dem attr14 überhaupt erstellen kann?
Ja, das verstehe ich schon. Aber die Daten, die du gerne hättest liegen eben in der Datenbank und über der Datenbank liegt in Shopware 4 ein Persistenzframework namens Doctrine. Wenn du es ordentlich machen willst, musst du der MVC Struktur folgen. Wenn du da keine Lust drauf hast kannst du das natürlich über einen PHP Block in smarty mit mysql_connect in einen blink-Tag rendern … Ist halt nicht so doll.
Naja es geht mir weniger um die Lust, als mehr um das Verständnis Wenn ich eine saubere Lösung erzielen kann, dann ist mir das natürlich lieber.
Dann erzähl doch mal etwas mehr was du machen willst. Erweiterst du was bestehendes oder schreibst du eine eigene Erweiterung?
Also es ist so: was ich erzielen möchte (nämlich eine ähnliche Funktion wie das Cross selling nur ohne Preisberechnung und Warenkorb) ist ja klar soweit? Wie ich da jetzt aber hinkomme weiß ich selber nicht, da ich dahingehend relativ am Anfang meiner Entwicklung stehe. Es muss also in irgendeiner Art und Weise möglich sein, die Artikel, dessen Artikelnummer in einem bestimmten Artikel eingetragen werden (nämlich in ein Textfeld), bei eben diesem Artikel angezeigt werden. Ich ging davon aus, dass das Ganze eine relativ kleine Sache ist. Ich brauche ja nur die Artikel, welche zu den Artikelnummern gehören, und füge deren Inhalte mittels einer For-Schleife ein. Aber was wäre dafür die einfachste Variante?
Hast du dir mal die Tutorials durchgelesen? Da steht eigentlich alles drin, wenn du ein kleines Plugin schreiben willst. Leg doch erstmal eine Bootstrap.php an, wie im Tutorial beschrieben, zieh da die Daten, hook dich an ein Event (also immer do wo du angezeigt werden willst) und übergeb die Daten aus deiner Bootstrap Datei an dein Template. Das ist recht straightforward und da gibts auch Beispiele in den Doks zu. Wenn dein Plugin wächst, verlagerst du dann Code aus deiner Bootstrap Datei in dedizierte Klassen. Poste dann mal, was du so hast. Eine Alternative zu einem Plugin wäre, dass du einen ViewHelper für Smarty schreibst, wo du den Code abfeierst und den dann in deinem Template includierst. Das hab ich in shopware aber auch noch nicht gemacht, würde mich aber interessieren.