$sArticles - um weiteren Wert aus Datenbank erweitern und im Frontend nutzen - SQL Select

Hallo,

ich würde gerne einen Wert aus der Datenbank im Frontend anzeigen lassen, welcher jedoch nicht als Wert in $sArticles (oder woanders )vorliegt. Daher muss ich $sArticles um diesen Wert aus der Datenbank erweitern. Der Wert, welchen ich hinzufügen möchte liegt in der Tabelle "s_articles_supplier".

Daher muss ich nun also per SQL-Befehl (Select) die Werte aus der Datenbank abfragen, aber selbst wenn mir das gelingt, wie füge ich diese zu $sArticles dem entsprechenden Produkt hinzu?

Vielen Dank für eure Hilfe!

https://developers.shopware.com/developers-guide/

Dort wird alles beschrieben, erklärt und ist mit Beispiel-Plug-Ins belegt.

Danke, kenne ich… hab da auch schon mal gesucht, aber nicht das passende gefunden und als Designer (nicht Programmierer) eher schwierig da komplett durchzusteigen. Gibt es eine Kurzfassung?

Dann ist vielleicht eine der Shopware-Schulungen für dich interessant.

Bestimmt, aber durch eine Shopware-Schulung allein wird man auch nicht zum Programmierer, wenn man keiner ist. Immerhin ist mein Ziel ja nicht, von heute auf morgen den gesamten Shop umzuprogrammieren, sondern lediglich einen Wert auszulesen usw.  Daher würde ich die Grundsatzdiskussion jetzt gerne hiermit beenden…

1 „Gefällt mir“

Hallo dst,

auch wenn du nicht den ganzen Shop umprogrammieren willst wirst du dafür ein kleines Plugin benötigen welches dir beim passenden Event den Wert als Templatevariable zur Verfügung stellt. Die Tutorials im Developers Guide sind schon recht kurz gehalten und man findet eigentlich für die meisten Fälle etwas, was man nur anpassen muss.

Wenn du dich damit nicht beschäftigen kannst oder willst, dann musst du das höchstwahrscheinlich in Auftrag geben.

Es ist leider nicht in einem 2 Zeiler erklärt und eine Komplettlösung darfst du hier nicht erwarten, sorry!

Daher würde ich die Grundsatzdiskussion jetzt gerne hiermit beenden…

Von mir aus.

Was genau hast du den vor? Um welchen Wert geht es denn? Warum, Wieso und wie soll es am Ende aussehen?

Hallo,

du kannst die Artikel relativ leicht erweitern, indem du eine weiteres Attribute hinzufügst. (In der DB ist es dann eine weitere Spalte in der s_articles_attributes). Wenn man diesen Weg geht, dann steht im Frontend das neue Attribute im $sArticle Array mit zur Verfügung. Die Werte könnten/müssten dann im Backend beim Artikel hinterlegt werden.

Hier wird es analog mit den Kundendaten gemacht. http://community.shopware.com/Schuhgrößen-Erweiterung_detail_1052.html#Bootstrap

Wenn du über die SQL Anfrage den Wert aus der DB holst, dann musst du die Variable wieder dem View zuweisen. Dies findest du hier 

in der 

 onPostDispatchDetail 

Ich hoffe, die Hinweise und beide Tutorials helfen dir.

Beste Grüße

Jens

1 „Gefällt mir“

@jsdevelopment schrieb:

Hallo,

du kannst die Artikel relativ leicht erweitern, indem du eine weiteres Attribute hinzufügst. (In der DB ist es dann eine weitere Spalte in der s_articles_attributes). Wenn man diesen Weg geht, dann steht im Frontend das neue Attribute im $sArticle Array mit zur Verfügung. Die Werte könnten/müssten dann im Backend beim Artikel hinterlegt werden.

Hier wird es analog mit den Kundendaten gemacht. http://community.shopware.com/Schuhgrößen-Erweiterung_detail_1052.html#Bootstrap

Wenn du über die SQL Anfrage den Wert aus der DB holst, dann musst du die Variable wieder dem View zuweisen. Dies findest du hier 

http://community.shopware.com/Detailseiten-Reiter-Konfiguration_detail_1019_870.html

in der 

onPostDispatchDetail

Ich hoffe, die Hinweise und beide Tutorials helfen dir.

Beste Grüße

Jens

Hallo,

anzumerken zu den beiden Tutorials wäre aber noch, das diese noch für Shopware 4 sind und manches dort beschriebene in Shopware 5 - Plugins nicht mehr verwendet werden soll/darf (beispielsweise: $view->extendsTemplate(…) ).

Die besten Tutorials sind immernoch die von Shopware selbst veröffentlichten, die sich speziell an Shopware 5 richten: Plugin quick Startup Guide.

Beste Grüße

Sebastian

Hallo Sebastian,

danke für Anmerkung, die absolut richtig ist. Hier werden die Unterschiede zwischen SW4 und SW5 erwähnt. (Shopware 5 Plugin update guide)

Ich hatte vergessen, dass ich hier im Shopware 5 Bereich bin und wollte eigentlich auf das $view->assign() hinaus.

Beste Grüße

Jens

Hallo,

eigentlich will ich gar nicht so viel, wie ihr hier bietet :wink: Aber schon mal danke für die Hilfe.

Ich versuche mal, es genauer zu erklären:

Ich möchte das Feld meta_description aus der Tabelle s_articles_supplier per SQL Befehl auslesen, irgendwie so:

private function getSupplierMeta() {

...

       $sql= "SELECT meta_description FROM s_articles_supplier";
       $fields = Shopware()->Db()->fetchRow($sql);
     
       return $fields;
    }

...

}

und dann der Variable $sArticles zuordnen und im Listing und der Detailseite zur Verfügung stellen und quasi wie {$sArticle.supplier_meta_description} im Template ausgeben können. Oder, falls es nicht möglich ist $sArticles zu erweitern, eine eigene Variable $dstArticles mit der Zuweisung ArtikelID und supplier_meta_description zu erstellen und als {$dstArticle.supplier_meta_description} zu verwenden.

Dass ich dazu ein kleines Plugin schreiben muss ist okay - damit kenne ich mich ein wenig aus. Dachte es wäre mit ein paar Zeilen Code möglich die Spalte auszulesen, der Variable zuzuweisen und im Template verfügbar zu machen.
 

Du könntest einen after Hook auf sGetArticleById setzen und dann in der function über

$articleData = $arguments->getReturn();

die Daten holen und über

$articleData[‚meineDaten‘] = ‚hier dein wert‘;

$arguments->setReturn($articleData);

zurückgeben.

 

1 „Gefällt mir“

Hallo Creatixx,

danke für deine Antwort.

Also muss ich theretisch gar keine neue Datenbankabfrage machen um die weiteren Werte auszulesen?

MFG DST

An die $sArticle kommst du so wie beschreiben ran. Wo du natürlich die Werte die du dort eintragen willst herbekommst ist eine andere Frage.

Bin mir aber gerade nicht sicher ob du dich nicht auch irgendwo einklinken könntest um die Query direkt um die meta-description zu erweitern?! 

Die sGetArticleById wird doch im Listing gar nicht ausgeführt oder?

Mein Vorschlag wäre: Subscriben auf 

 Enlight\_Controller\_Action\_PostDispatchSecure\_Frontend\_Listing

Dort die sArticles aus dem View holen, die IDs auslesen, in einer DB-Abfrage für alle Artikel die gewünschten Daten auslesen und sArticles hinzufügen und dann wieder in den View schreiben.

Geht relativ simpel und macht nur eine zusätzliche DB-Abfrage statt für jeden Artikel im Listing eine zusätzliche.

  • Subscribe auf das Event
  • sArticles aus dem View laden
  • Gewünschte Daten aus der DB laden
  • Daten in sArticles schreiben
  • sArticles wieder in den View schreiben
1 „Gefällt mir“

ja, das grobe Prinzip kann ich mir vorstellen…

aber:

  • wie hole ich mir sArticles aus dem View
  • wie erweitere ich sArticles mit den weiteren Werten, welche ich mir aus der SQL Abfrage hole?

Hallo,

Creatixx liefert in seinem Beitrag ansich schon den entsprechenden Ansatz:

@dst schrieb:

ja, das grobe Prinzip kann ich mir vorstellen…

aber:

  • wie hole ich mir sArticles aus dem View
  • wie erweitere ich sArticles mit den weiteren Werten, welche ich mir aus der SQL Abfrage hole?

@Creatixx schrieb:

Du könntest einen after Hook auf sGetArticleById setzen und dann in der function über

$articleData = $arguments->getReturn();

die Daten holen und über

$articleData[‚meineDaten‘] = ‚hier dein wert‘;

$arguments->setReturn($articleData);

zurückgeben.

 

und: Plugin quick Startup Guide .

Ich glaube nicht das du hier eine fertige Lösung von jemanden geliefert bekommst - falls du aber nicht weiterkommst, kannst du ja auch jemanden beauftragen, der dies für dich umsetzt.

Beste Grüße

Sebastian

1 „Gefällt mir“

Hallo,

ergänzend zu der Lösung von t2oh4e, hier das Prinzip, die sArtcle aus dem View zu holen und dann in den View schreiben.

Beste Grüße

Jens

 

 public function onPostDispatchDetail(Enlight\_Event\_EventArgs $arguments) { /\*\*@var $controller Shopware\_Controllers\_Frontend\_Detail\*/ $controller = $arguments-\>getSubject();   $view = $controller-\>View();   $sArticle = $view-\>getAssign('sArticle');   // Do what you need .....   $view-\>assign('sArticle', $sArticle); }
2 „Gefällt mir“

Okay, das hilft mir alles schon mal ein um einiges Weiter zum Verständnis.

Ich hab nun ein Plugin, allerdings mit dem Event: Enlight_Controller_Action_PostDispatchSecure, weil ich die Werte im Listing, in der Detailansicht und wer weiß noch wo verwenden möchte. Geht doch, oder?

Dann habe ich eine Funktion, welche mir die Daten aus der Datenbank holt. Die Abfrage funktioniert, ich schreibe diese Testweise in eine Variable - $view->assign(testSupplierMeta’, $this->getSupplierMeta());:

 private function getSupplierMeta() 
    {
       $sql= "SELECT meta_description FROM s_articles_supplier";
       $fields = Shopware()->Db()->fetchAll($sql);
     
       return $fields;
    }

Dann habe ich noch einen after Hook im Plugin install() registriert, also nach dem Event?!:

$this->subscribeEvent(
            'sArticles::sGetArticleById::after',
            'afterGetArticleById'
        );

Und dann in noch den eigentlichen Hook:

 

public function afterGetArticleById(Enlight_Hook_HookArgs $arguments)
    {   
        $articleId = $arguments->getId();
     
        $categoryId = $arguments->get('sCategoryID');
     
        $sArticle = $arguments->getSubject();
     
        $articleData = $arguments->getReturn();
     
        $articleData['articelName'] = 'Tutorial Artikel';
     
        $arguments->setReturn($articleData);
    }

 

Jetzt muss ich noch die Daten aus der SQL-Abfrage dem entsprechenden Artikel jeweils zuweisen… Da hab ich noch keine Ahnung… Leider habe ich es hiermit auch noch nicht geschafft den Artikelnamen durch “Tutorial Artikel” zu ersetzen… damit wollte ich testen, ob das alles so hinhaut, was ich da mache…

Bin ich auf dem richtigen Weg?

Hallo dst,

also auf die Schnelle wäre mir mal aufgefallen dass du articelName anstatt articleName ändern willst (du hast das e und das l vertauscht, ich mach das auch gerne :-))

Beste Grüße, Martin

1 „Gefällt mir“