Hallo, in meinem Shop habe ich den Artikelverlauf aktiviert, so dass unten Links der Verlauf der letzten 5 Artikel angezeigt wird. Zusätzlich werden Blog-Artikel hier auch angezeigt. Dies würde ich gerne unterbinden. In dem Template plugin/index/viewlast.tpl steht folgendes: [code] {* Last seen articles *}
{s name=‘WidgetsRecentlyViewedHeadline’}{/s}
{foreach from=$sLastArticles item=sArticle}
{if $sArticle.img} {$sArticle.name} {else} {se name=‘WidgetsRecentlyViewedLinkDetails’}{/se} {/if} {$sArticle.name|truncate:50}
{/foreach}
[/code] Nun muss ich irgendwie unterscheiden welche Artikel in dem Array “echte” Artikeln sind und welche Blog Artikel sind. Wenn ich es nun richtig sehe, haben alle Blog-Artikel in der Artikelnummer ein “Blog” Prefix. Nun müsste ich die FOREACH so abändern, dass Artikel mit einer Artikelnummer “Blog*” nicht aufgelistet werden. Wie mache ich das? Oder gibt es noch andere Merkmale zur Unterscheidung? (Außer in attrX ein Merkmal reinschreiben und auf dieses prüfen? Danke
Hey, leider komme ich nicht weiter. Der Artikelverlauf (links unten) stehen in der Variable sLastArticle und hier habe ich keine Möglichkeit auf die Artikelnummer oder auf die Attr Felder zurückzugreifen. Hier gibt es nur: array( [0] =\> array( ... 4 elements ... ) ['img'] =\> ... ['name'] =\> 'Zwei Boxer' ... ['articleID'] =\> 193 ... ['linkDetails'] =\> 'shopware.php?sViewport=detail&sArticle=193' ... ) )
Hi, ich glaube solange die Blogartikel in der Datenbank-Tabelle s_articles gespeichert werden, schlagen die Artikel auch wieder in der Verlauf-Übersicht auf. Also da musst du, denke ich, schon mit attr arbeiten oder Blog-Artikel aus der DB-Tabelle auslaggern. Nur wie das genau aussehen soll,… Aber aufgefallen ist, nachdem man einen Blog-Artikel angeklickt hat und darauf hin 5 weitere “normale” Artikel, wird der Blog-Artikel auch nach erneuten Aufruf dort nicht angezeigt. Vllt kann man hier etwas ableiten. Gruß
[quote=“sr-1”]Hi, ich glaube solange die Blogartikel in der Datenbank-Tabelle s_articles gespeichert werden, schlagen die Artikel auch wieder in der Verlauf-Übersicht auf. Also da musst du, denke ich, schon mit attr arbeiten oder Blog-Artikel aus der DB-Tabelle auslaggern. Nur wie das genau aussehen soll,… Aber aufgefallen ist, nachdem man einen Blog-Artikel angeklickt hat und darauf hin 5 weitere “normale” Artikel, wird der Blog-Artikel auch nach erneuten Aufruf dort nicht angezeigt. Vllt kann man hier etwas ableiten. Gruß[/quote] Die Anzeige ist auf 5 Artikel begrenzt. Darum zeigt es dir den Blogartikel nicht mehr an. Ich würde ja gerne mit den Attr von den Artikeln arbeiten, aber über sLastArticle komme ich nicht an das Attr Feld ran :thumbdown:
Moin, dafür müsstest du ein kleines Plugin schreiben - weiß nicht, in wie weit du da schon firm bist. Es müsste ein Hook auf sArticles > sGetLastArticles implementiert werden, der die SQL-Query dort verändert. Die Quick & Dirty Lösung sArticles ca. Zeile 3943 $queryArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>GetAll(" SELECT img, name, articleID FROM s\_emarketing\_lastarticles WHERE sessionID='".$this-\>sSYSTEM-\>sSESSION\_ID."' GROUP BY articleID ORDER BY time DESC LIMIT $numberOfArticles "); Ändern in: $queryArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>GetAll(" SELECT last.img, last.name, last.articleID FROM s\_emarketing\_lastarticles last, s\_articles WHERE s\_articles.id = last.articleID AND s\_articles.mode = 0 AND last.sessionID=? GROUP BY last.articleID ORDER BY last.time DESC LIMIT $numberOfArticles ",array($this-\>sSYSTEM-\>sSESSION\_ID));
Moin! Mit dem Artikelverlauf gibt es noch ein anderes Problem, das irgendwie auch sehr ärgerlich ist. Die angesehenen Artikel werden in der Reihe praktisch immer nach unten durchgeschoben. Wenn aber ein Artikel angesehen wird, der bereits schon einmal angesehen wurde, so sollte der (finde ich) wieder oben in die Liste auf Position eins. Tut er aber nicht. Das führt dazu: Wenn ich einmal 6 (Standard-Einstellung Artikel im Verlauf = 5) Artikel nacheinander angeschaut habe und gehe wieder zum ersten dieser sechs, so taucht dieser im Artikel-Verlauf überhaupt nicht mehr auf. Und das ist sicher kein Feature … AS
Hallo Stefan, dein Code muss in welche Datei editiert werden? (Das mit den Plugins muss ich mir bei Gelegenheit mal anschauen, im Moment habe ich noch keine Ahnung davon.) Nun zum eig. Du Änderst hier die Query. Was ist hier das Ausschlaggebende? Sowie ich es verstehe das Feld s_articles.mode = 0 Welche verschiedenen Modi gibt es hier? 0 normale Ariktel? 1 Blog Artikel? Edit: Dieses HowTo bezieht sich auf Events http://www.shopware.de/wiki/Tutorial-Pl … l_523.html Geht das mit den Hooks genau gleich? Welches HowTo sind so die wichtigsten, wenn ich mich mit den Plugins beschäftigen möchte?
Hey, engine/core/class/sArticles.php - genau, a.mode ist das entscheidene - 0 = normal, 1 = Blog. Bzgl. der Tutorials, am besten von unten nach oben durch die Liste arbeiten - da wird eigentlich alles wichtige vermittelt.
Super danke. bzgl. dem Plugin habe ich noch ein Verständnisproblem. [quote]Es müsste ein Hook auf sArticles > sGetLastArticles implementiert werden, der die SQL-Query dort verändert.[/quote] Soweit ist es mir klar, es muss bei aktiviertem Plugin dynamisch das SQL Query geändert werden, welches ich auch so wie du gepostet hast, direkt in der sArticle.php machen kann. Nun finde ich aber in den Einstellungen unter Hooks kein sArticle.php_sGetLastArticles und in der sArticle.php auch nichts… Oder muss ich das selbst in die sArticle.php schreiben? Original: public function sGetLastArticles($sCurrentArticle=0){ $numberOfArticles = $this-\>sSYSTEM-\>sCONFIG['sLASTARTICLESTOSHOW']; // If the user visits currencly an article, this article should not be listed if ($sCurrentArticle){ $queryArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>GetAll(" SELECT img, name, articleID FROM s\_emarketing\_lastarticles WHERE articleID!=$sCurrentArticle AND sessionID='".$this-\>sSYSTEM-\>sSESSION\_ID."' GROUP BY articleID ORDER BY time DESC LIMIT $numberOfArticles "); }else { // Update articles if (!empty($this-\>sSYSTEM-\>\_SESSION["sUserId"])){ $updateArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>Execute(" UPDATE s\_emarketing\_lastarticles SET userID = '".$this-\>sSYSTEM-\>\_SESSION["sUserId"]."' WHERE sessionID='".$this-\>sSYSTEM-\>sSESSION\_ID."' "); } $queryArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>GetAll(" SELECT img, name, articleID FROM s\_emarketing\_lastarticles WHERE sessionID='".$this-\>sSYSTEM-\>sSESSION\_ID."' GROUP BY articleID ORDER BY time DESC LIMIT $numberOfArticles "); } Änderung: public function sGetLastArticles($sCurrentArticle=0){ $numberOfArticles = $this-\>sSYSTEM-\>sCONFIG['sLASTARTICLESTOSHOW']; // If the user visits currencly an article, this article should not be listed if ($sCurrentArticle){ $queryArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>GetAll(" SELECT img, name, articleID FROM s\_emarketing\_lastarticles WHERE articleID!=$sCurrentArticle AND sessionID='".$this-\>sSYSTEM-\>sSESSION\_ID."' GROUP BY articleID ORDER BY time DESC LIMIT $numberOfArticles "); }else { // Update articles if (!empty($this-\>sSYSTEM-\>\_SESSION["sUserId"])){ $updateArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>Execute(" UPDATE s\_emarketing\_lastarticles SET userID = '".$this-\>sSYSTEM-\>\_SESSION["sUserId"]."' WHERE sessionID='".$this-\>sSYSTEM-\>sSESSION\_ID."' "); } $queryArticles = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>GetAll(" SELECT img, name, articleID FROM s\_emarketing\_lastarticles WHERE sessionID='".$this-\>sSYSTEM-\>sSESSION\_ID."' GROUP BY articleID ORDER BY time DESC LIMIT $numberOfArticles "); eval($this-\>sSYSTEM-\>sCallHookPoint("sArticles.php\_sGetLastArticle")); }
Das ist ja nur eines von vielen Beispielen - in diesem Fall musst du einen Hook anlegen und keinen Event! Diese Liste ist übersichtlicher: http://www.shopware.de/wiki/Tutorials-z … 2_444.html Also in der Bootstrap des Plugins würde man das wie folgt registrieren: $event = $this-\>createHook( 'sArticles', 'sGetLastArticles', 'onGetLast', Enlight\_Hook\_HookHandler::TypeAfter, 0 ); $this-\>subscribeHook($event); Dann würde man eine neue Funktion in der Boostrap.php anlegen - static function onGetLast (Enlight\_Hook\_HookArgs $args) { $numberOfArticles = Shopware()-\>Config()-\>sLASTARTICLESTOSHOW; $queryArticles = Shopware()-\>Db()-\>fetchAll(" SELECT last.img, last.name, last.articleID FROM s\_emarketing\_lastarticles last, s\_articles WHERE s\_articles.id = last.articleID AND s\_articles.mode = 0 AND last.sessionID=? GROUP BY last.articleID ORDER BY last.time DESC LIMIT $numberOfArticles ",array(Shopware()-\>SessionID())); $args-\>setReturn($queryArticles); } Das mal nur als Beispiel - ungetestet - aber vom Prinzip her funktioniert das so.
Okay, danke. Funktioniert super. Ich habe meine Bootstrap in /frontend/LastArticleModifi abgelegt mit folgendem deinem Inhalt: <?php class Shopware_Plugins_Frontend_LastArticleModifi_Bootstrap extends Shopware_Components_Plugin_Bootstrap
{
public function install()
{
$event = $this->createHook( 'sArticles', 'sGetLastArticles', 'onGetLast', Enlight\_Hook\_HookHandler::TypeAfter, 0 ); $this-\>subscribeHook($event); return true; } static function onGetLast (Enlight\_Hook\_HookArgs $args) { $numberOfArticles = Shopware()-\>Config()-\>sLASTARTICLESTOSHOW; $queryArticles = Shopware()-\>Db()-\>fetchAll(" SELECT last.img, last.name, last.articleID FROM s\_emarketing\_lastarticles last, s\_articles WHERE s\_articles.id = last.articleID AND s\_articles.mode = 0 AND last.sessionID=? GROUP BY last.articleID ORDER BY last.time DESC LIMIT $numberOfArticles ",array(Shopware()-\>SessionID())); $args-\>setReturn($queryArticles); } } Der untere Teil ist mir klar. Aber oben beim Plugin registrieren/installieren habe ich noch meine Probleme. Gibt es hier auch ein HowTo darüber? Ich finde immer nur die Infos zu den Events und nichts zu den Hooks… Danke dir
@AS Das ist eigentlich tatsächlich gewollt - also als Bug würde ich das nicht bezeichnen. Sicherlich können hier die Meinungen auseinandergehen, welche Reihenfolge der Darstellung sinnvoll ist. Anpassung: engine/core/class/sArticles.php - Funktion sSetLastArticle in 3808 - Unter: if (!empty($name) && !empty($id) && empty($checkForArticle["id"])){ $insertArticle = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>Execute(" INSERT INTO s\_emarketing\_lastarticles (img, name, articleID, sessionID, time, userID) VALUES ('$image',$name,$id,'".$this-\>sSYSTEM-\>sSESSION\_ID."',now(),'".intval($this-\>sSYSTEM-\>\_SESSION["sUserId"])."') "); } Einfügen: else { $insertArticle = $this-\>sSYSTEM-\>sDB\_CONNECTION-\>Execute(" UPDATE s\_emarketing\_lastarticles SET `time` = now() WHERE articleID = ? AND sessionID = ? ",array($id,$this-\>sSYSTEM-\>sSESSION\_ID)); } Wenn ihr das jetzt noch selbstständig als Plugin realisiert, bekommt ihr ein Eis von mir
ich könnte es ja mal versuchen Naja, oben ging es ja nur darum den Inhalt von der Query abzuändern. Bei diesem Fall muss ja die komplette IF abgeändert werden. mhhhh Das überlasse ich dir @AS
@STH: Kann das wirklich gewollt sein? Dass ich den Artikel, welchen ich zuletzt angeschaut habe in der Aufstellung “ANGESCHAUT” gar nicht mehr sehe? Egal wie oft ich drauf klicke, nur weil ich ihn früher schon einmal irgendwann angeschaut hatte? Kommt mir komisch vor … Diese Aufstellung soll doch dem User ermöglichen, auf kurzem Weg zu einem Artikel zurück zu finden, den er vor kurzem angeschaut hat. Das ist so aber doch nicht mehr möglich … @ottscho: Vielen Dank, dass Du mir das überlassen willst. Hatte schon befürchtet, Du wolltest Dich da vordrängen! Ich muss aber leider sagen, dass mir das Plugin-System noch ziemlich fremd ist. Und das wird wohl auch noch eine Weile so bleiben bis hier die Essentials voll laufen. Läuft wohl eher unter Fleissarbeit … Mal sehn … AS P.S.: @ottscho checke mal Deine PNs. Sorry, hat etwas gedauert …
@As Du kannst du natürlich gerne in die Roadmap eintragen - dann schauen wir uns das Thema im Zuge des nächsten Releases nochmal an. @Ottscho - Eigentlich ganz einfach - die IF-Bedingung wird im Prinzip nicht benötigt - also das Update darunter kann eigentlich immer ausgeführt werden. Dadurch verringert sich der benötigte Code im Event-Handler auf: $id= $args-\>getId(); $insertArticle = Shopware()-\>Db()-\>query(" UPDATE s\_emarketing\_lastarticles SET `time` = now() WHERE articleID = ? AND sessionID = ? ",array($id,Shopware()-\>SessionID()));
Stimmt. Ich brauche hier ja keine IF, ich kann ja direkt das IF Ergebnis also die Query einfügen Logisch… Gibt es eig. hierzu eine Erklärung? $id= $args->getId(); Du holst dir hier welche ID aus $args ?
Die Funktion ist ja im Original so definiert sSetLastArticle($image,$name, $id) Es gibt also 3 Parameter - die kann man sich in den Hooks via $args->getVARIABLENAME holen -