Grundsatzfrage - Zugriff auf Datenbank/Artikel/Attribute

Hallo, ich hänge mal wieder bei einem Plugin. Ich möchte in dem Plugin ein Artikelattribut abfragen, besser gesagt, jeden Artikel bei dem das Attribut angehakt ist, ausgeben. Habe mich jetzt schon durch diveres Controller und Bootstrap Dateien durchgewühlt und einiges probiert, jedoch ohne Erfolg. Meine Frage ist, wie gehe ich so etwas an? Muß ich in meiner Bootstrap.php auf die Datenbank zugreifen? Oder kann ich das direkt in der tpl Datei? Oder ganz anders? Ich habe mal folgendes in der Bootstrap.php probiert: $getAttribute = Shopware()-\>Db()-\>fetchRow(" SELECT s\_articles\_attributes.articleID FROM s\_articles\_attributes WHERE s\_articles\_attributes.attr6 = ? ",array($attribute)); Damit habe ich dann in der tpl versucht, das attr6 abzufragen, geht natürlich nicht. Mir fehlt hier wirklich noch Verständnis, würde mich freuen wenn mich hier jemand erleuchten könnte. Evtl. kann mir ja mal jemand ein Beispiel für die Vorgehensweise in so einem Fall geben. Danke Frank

Niemand der meinen Sonntag retten kann? Mit: $attr = Shopware()-\>Db()-\>fetchOne("SELECT s\_articles\_attributes.attr6 FROM s\_articles\_attributes WHERE attr6 = '1'"); kann ich ja schon mal das attr6 in der Bootstrap.php abfragen, aber wie erreiche ich, das ich das direkt im Template machen kann? Oder besser gesagt alles vom Artikel abfragen kann?

Hallo, weiss nicht, ob ich die Frage falsch verstanden habe, aber du willst doch einfach den Wert an das Template übergeben. Wenn ich z.B. auf der Detailseite zugriff auf myAttributes haben möchte, sollte das so gehen. Nicht getestet! [code]<?php class Shopware_Plugins_Frontend_PluginName_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function install()
{
$event = $this->createEvent( ‚Enlight_Controller_Action_PostDispatch_Frontend_Detail‘, ‚onPostDispatchFrontendDetail‘ ); $this->subscribeEvent($event); return true; } public static function onPostDispatchFrontendDetail(Enlight_Event_EventArgs $args) { $attributes = array(); $attributes[6] = ‚‘;

	$view = $args-&gt;getSubject()-&gt;View();
	$view-&gt;myAttributes = $attributes; 
}

}

[/code]

Hallo Ralf, ich möchte in meinem Plugin auf alle Artikel zugreifen, bei denen das attr6 gesetzt ist, sprich ich möchte mit einer foreach Schleife alle Artikel ausgeben, bei denen das attr6 == 1 ist.

Dann musst du die Tabellen Artikel, Attribute, Details, etc. ? in der SQL-Anweisung verknüpfen (JOIN). Wie das geht kann man glaube ich im Artikelexport sehen. Ist aber eigentlich recht einfach. Dann das Ergebnis in einem Array speichern und an das Template übergeben.

Ich fange jetzt mal folgendermassen in der Bootstrap.php an: $sql = Shopware()-\>Db()-\>fetchOne("SELECT articleID AS Test FROM s\_articles\_attributes WHERE s\_articles\_attributes.attr6 = '1'"); Damit hätte ich doch alle Artikel bei denen das attr6 gesetzt ist, oder? Kann ich darauf jetzt mit $Test zugreifen? Oder lieg ich mal wieder voll daneben? Jetzt müßte ich aber auch alle Artikel die mit der articleID von obiger Abfrage überein stimmen aus der s_articles auslesen und dann ans Template übergeben.

[quote=„taaucher“]Damit hätte ich doch alle Artikel bei denen das attr6 gesetzt ist, oder?[/quote] Alle Artikel-IDs, ja. [quote]Kann ich darauf jetzt mit $Test zugreifen?[/quote] Nein. Das ist nur ein Alias, den du statt articleID verwenden kannst. [quote]Jetzt müßte ich aber auch alle Artikel die mit der articleID von obiger Abfrage überein stimmen aus der s_articles auslesen und dann ans Template übergeben.[/quote] Genau.

Hallo Ralf, ich bräuchte jetzt noch etwas Hilfe, wie ist denn der nächste Schritt, um an die Artikel zu kommen, bei denen die ausgelesene articleID übereinstimmt, um dann z.B. auf das Artikelbild zuzugreifen? Was muß ich jetzt noch tun, um aus der obigen sql Abfrage die $articleID im Template ausgeben zu können.

Versuchs mal hiermit: public static function onPostDispatchFrontendDetail(Enlight\_Event\_EventArgs $args) { $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; }

1 Like

Danke Ralf, leider funktioniert das scheinbar nicht. Was ich brauche ist ja eigentlich nur, das ich auf der Index (Start) Seite auch auf die Artikeleigenschaften zugreifen kann, genau wie beim Listing und der Detail Seite.

Ich glaube hier ist noch nicht klar, was du genau erreichen willst. Oben schreibst du vom Abfragen von Artikeln, die ein bestimmtes Attribut haben und unten möchtest du die Eigenschaften von Artikeln auslesen können. Also eventuell erklärst du das nochmal zusammenhängend - was soll das Endergebnis sein?

Hi Stefan, auf der Detailseite oder im Listing kann ich in eigenen Plugins ja ohne weiteres auf z.B. {foreach from=$sArticle.images item=sArticleImage} {if $sArticle.image.src.1} zugreifen. Genauso kann ich mit {if $sArticle.attr6 == "1"} ein Attribut abfragen. Das ist denke ich ja möglich, weil die einzelnen Controller die Variablen zur Verfügung stellen, oder? Ist ja ähnlich wie mit dem Warenkorb, der in der Checkout komplett zur Verfügung steht, auf anderen Shopseiten aber nicht oder nur eingeschränkt. Ich möchte eigentlich verstehen, wie man in der Lage ist, diese Variablen auch in eigenen Plugins nutzen zu können, eben auch auf anderen Shopseiten. In diesem speziellen Fall möchte ich auf der Startseite Artikel ausgeben, die ähnlich dem Banner-Slider abwechselnd angezeigt werden. Aber eben nur Artikel, bei denen das attr6 gesetzt ist. Ich möchte dann das Bild anzeigen und den Link, den ich im Artikel unter Links angeben kann. Schon mal Danke für die Hilfe und allen einen guten Wochenstart!

Dann ist aber das Code-Beispiel von Radox doch korrekt? Man könnte das nun noch so modifizieren, dass a.) die Sortierung zufällig ist, b.) nur z.B. 5 Artikel ausgelesen werden und c.) alle Artikeldaten zur Verfügung gestellt werden. $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; Dann müsstest du im Frontend über die Variable myProdList auf die Produktliste zugreifen können - dort dann per foreach drüber und zur Darstellung die Artikelbox einbinden - also z.B. [code]

Top-Artikel markiert via attr6

{foreach $myProdList $sArticle} {include file=“frontend/listing/box_article.tpl”} {/foreach} [/code]

Hi Stefan, werde das gleich mal so umsetzen. Ich hatte nur gedacht, das dies etwas einfacher ginge. Auf der Detailseite und im Listing kann ich ja ganz einfach auf alle Artikeldaten zugreifen, dort kann ich ja auch mit einer foreach Schleife alle Artikel ausgeben lassen bei denen attr6 gesetzt ist und dann auf die Artikelbilder und Links zurgreifen, ohne das ich die Datenbankabfrage wie von euch beschrieben einbinden muß.

Hi, ja? Wie soll das denn konkret funktionieren? Also du kannst im Artikel-Listing maximal auf die Artikel zugreifen, die dort aktuell auch angezeigt werden - oder verstehe ich dich da irgendwie falsch?

Ich denke du verstehst das richtig und ich habe das falsch interpretiert. Ich bin davon ausgegangen, das ich bei den beiden Seiten jederzeit alle Artikeldaten zur Verfügung hätte. Ist wohl falsch. Ich habe das andere jetzt mal eingebaut, allerdings verursacht: {foreach $myProdList $sArticle} einen Fehler. {foreach $myProdList $sArticle}" - Unexpected " ", expected one of: “as” in Vendor/Smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php on line 404 Ich denke das müßte dann mit {foreach from=$myProdList item=$sArticle} funktionieren, oder?

Da hast du Recht {foreach from=$myProdList item=sArticle} wäre richtig!

Hallo, sollte dann das hier nicht funktionieren? {foreach from=$myProdList item=$sArticle} {if $sArticle.attr6 == „1“}{/if} {/foreach}

Hallo taaucher, {if $sArticle.attr6 == “1”} brauchst du nicht, da diese Bedingung schon in der SQL-Anweisung steht. Hab mir mal kurz ‘sGetPromotionById()’ angeschaut. Denke, es müsste {$sArticle.linkDetails}" heißen. Hast du dem Link eine Breite/Höhe zugewiesen (CSS), damit man das Hintergrundbild sieht?

Das hier funktioniert leider nicht: {foreach from=$myProdList item=sArticle} {/foreach}