bestimmte Kategorie als Listing ausgeben

Ich möchte bei speziellen Artikeln ein zusätzliches TAB einfügen und dort alle Artikel einer definierten Kategorie ausgeben. Ähnlich wie das related.tpl mit Zubehör Artikeln macht: [quote]{if $sArticle.sRelatedArticles && !$sArticle.crossbundlelook}

{se name=‚DetailRelatedHeader‘}{/se}

{foreach from=$sArticle.sRelatedArticles item=sArticleSub key=key name=„counter“} {include file=„frontend/listing/box_article.tpl“ sArticle=$sArticleSub sTemplate=‚listing‘} {/foreach}

 

{/if}[/quote] Also im Prinzip: {foreach from=$sCategorie… aber wie kann ich dann die Kategorie definieren? Die ID bekomme ich über das Backend, aber wie und wo setz ich die hinter $sCategorie ?

hi, dazu kannst du dir ein kleines Plugin schreiben. hier mal ein kleines snippet auf Enlight_Controller_Action_PostDispatch_Frontend_Detail public function onPostDispatchFrontendDetail(Enlight\_Event\_EventArgs $args) { /\*\* @var $action Enlight\_Controller\_Action \*/ $request = $args-\>getSubject()-\>Request(); $response = $args-\>getSubject()-\>Response(); // Load this code only in frontend if(!$request-\>isDispatched() || $response-\>isException() || ($request-\>getModuleName()!='frontend' && $request-\>getModuleName()!="widgets")) { return; } if ($args-\>getSubject()-\>View()-\>hasTemplate()){ $args-\>getSubject()-\>View()-\>alternativeArticles = Shopware()-\>Modules()-\>Articles()-\>sGetArticlesByCategory(74); } } hier musst du natürlich deine Category-ID eintragen. und dann in deinem Tab zb so etwas: {foreach from=$alternativeArticles.sArticles item=sArticle key=key name=list} {include file='frontend/listing/box\_article.tpl' sTemplate='listing'} {/foreach}

@hbee ups, das ist ja doch etwas aufwendiger als gedacht… nunja, hab mich mal durch die Plugin Entwicklung gelesen und auch soweit installiert bekommen. Die Kategorie ID hab ich angepasst. Produkte sind auch in der Kategorie :wink: …aber irgendwie bleibt alles leer…:frowning: so sieht es im Moment aus: <?php class Shopware_Plugins_Frontend_VSmotorlager_Bootstrap extends Shopware_Components_Plugin_Bootstrap { public function getCapabilities() { return array( 'install' => true, 'update' =\> true, 'enable' =\> true ); } public function getLabel() { return 'Artikel einer gewissen Kategorie ausgeben'; } public function getVersion() { return '1.0.0'; } public function getInfo() { return array( 'version' =\> $this-\>getVersion(), 'label' =\> $this-\>getLabel(), 'supplier' =\> 'Volker Schröder', 'description' =\> 'Auslesen aller Artikel einer angegebenen Kategorie', 'support' =\> 'Volker Schröder', 'link' =\> 'http://www.myshop.de' ); } public function install() { return true; } public function onPostDispatchFrontendDetail(Enlight\_Event\_EventArgs $args) { /\*\* @var $action Enlight\_Controller\_Action \*/ $request = $args-\>getSubject()-\>Request(); $response = $args-\>getSubject()-\>Response(); // Load this code only in frontend if(!$request-\>isDispatched() || $response-\>isException() || ($request-\>getModuleName()!='frontend' && $request-\>getModuleName()!="widgets")) { return; } if ($args-\>getSubject()-\>View()-\>hasTemplate()){ $args-\>getSubject()-\>View()-\>MotorlagerArticles = Shopware()-\>Modules()-\>Articles()-\>sGetArticlesByCategory(1189); } } } {foreach from=$MotorlagerArticles.sArticles item=sArticle key=key name=list} {include file='frontend/listing/box\_article.tpl' sTemplate='listing'} {/foreach} Noch ne “Kleinigkeit” wie kann ich die ID als Variabel mit an das Plugin übergeben? …ich bräuchte den Aufruf dann mit unterschiedlichen Kategorien :wink:

1 Like

du hast vergessen dich für das Event zu registrieren. du musts noch folgendes in deine install methode einfügen $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Frontend\_Detail', 'onPostDispatchFrontendDetail' );

wenn du die Kategorie-ID über die Config eintragen willst, brauchst du eine Konfigurationsformular $form = $this-\>Form(); $form-\>setElement('text', 'cat-id', array( 'label' =\> 'Kategorie-ID', 'description' =\> 'Tragen sie hier die Kategorie-ID ein.', 'required'=\>true, 'scope' =\> \Shopware\Models\Config\Element::SCOPE\_SHOP )); darauf kannst du dann wie folgt zugreifen: $this-\>Config = Shopware()-\>Plugins()-\>Frontend()-\>VSmotorlager()-\>Config(); $catID = $this-\>Config-\>get('cat-id');

@hbee Ich habe den Code bei install eingefügt und über Plugin neu installiert…ändert aber irgendwie nix :frowning: Mit der Variabel hab ich mich etwas missverständlich ausgedrückt. Ich möchte die nicht in einem Formular eingeben, sondern über die „foreach“ Abfrage an das Plugin übergeben.

ok, also hier eine fertige bootstrap die dir am Ende die Variable $alternativeArticles auf der Detailseite zur Verfügung stellt. Diese Variable kannst du dann im Template wie folgt in einer Schleife durchlaufen: {foreach $alternativeArticles.sArticles as $sArticle} {include file="frontend/listing/box\_article.tpl" sTemplate=$sTemplate lastitem=$sArticle@last firstitem=$sArticle@first} {/foreach} Die gewünschte Kategorie-Id kannst du damit in dem Freitextfeld 1 in dem jeweiligen Artikel angeben. Wenn du ein anderes Freitextfeld nutzen möchtest, musst du die folgende Zeile im Code entsprechend ändern: $catId = $sArticle['attr1']; Mehr kann ich zu dem Thema hier nicht liefern :wink: Bootstrap.php [code]<?php /**

  • Bootstrap
  • @category Shopware
  • @package Maxout_Plugins
  • @subpackage Plugin
  • @author Heiko Bee plugins@maxout.de * @copyright Copyright © 2013, maxout.de, Heiko Bee */ class Shopware_Plugins_Frontend_MaxoutAlternativeArticles_Bootstrap extends Shopware_Components_Plugin_Bootstrap { /** * Installs the plugin * * @return bool */ public function install() { /** * Creates and subscribe the events and hooks. */ $this->subscribeEvent( ‘Enlight_Controller_Action_PostDispatch_Frontend_Detail’, ‘onPostDispatchFrontendDetail’ ); return TRUE; } /** * Updates the plugin * * @param $oldVersion * @return bool */ public function update($oldVersion) { return TRUE; } /** * Event listener method * * @param Enlight_Event_EventArgs $args */ public function onPostDispatchFrontendDetail(Enlight_Event_EventArgs $args) { /** @var $action Enlight_Controller_Action */ $request = $args->getSubject()->Request(); $response = $args->getSubject()->Response(); $subject = $args->getSubject(); // Load this code only in frontend if(!$request->isDispatched() || $response->isException() || ($request->getModuleName()!=‘frontend’ && $request->getModuleName()!=“widgets”)) { return; } if ($args->getSubject()->View()->hasTemplate()){ $view = $subject->View(); $sArticle = $view->getAssign(‘sArticle’); //Freitextfeld zur Angabe der Kategorie-ID $catId = $sArticle[‘attr1’]; if(!empty($catId)) $args->getSubject()->View()->alternativeArticles = Shopware()->Modules()->Articles()->sGetArticlesByCategory($catId); } } /** * Returns the label of the plugin as string * * @return string */ public function getLabel() { return ‘Alternative Artikel auf der Detailseite’; } /** * Returns the version of plugin as string. * * @return string */ public function getVersion() { return ‘1.0.0’; } /** * Returns plugin Information. * * @return array */ public function getInfo() { return array( ‘version’ => $this->getVersion(), ‘autor’ => ‘Heiko Bee’, ‘copyright’ => ‘Copyright © 2013, maxout.de, Heiko Bee’, ‘label’ => $this->getLabel(), ‘source’ => ‘’, ‘description’ => ‘Dieses Plugin stellt auf der Detailseite alternative Artikel aus einer zu definierenden Kategorie bereit.’, ‘license’ => ‘’ ); } } [/code]
1 Like

@hbee Suuuuuuuuuper Weihnachtsgeschenk :slight_smile: Vielen Dank :):):slight_smile: Klappt perfekt. ------- eine “Kleinigkeit” noch: kann ich die “catID” als Variable direkt aus dem Template an die PHP Datei übergeben? Hab das schon hiermit versucht…geht aber nicht: $myVar = $smarty->getTemplateVars(‘foo’); PS: darf natürlich auch von allen anderen beantwortet werden :slight_smile:

wie man Variablen aus dem Template in der Bootstrap verwendet steht doch schon da: $sArticle = $view-\>getAssign('sArticle'); Das sollte auch mit deiner $foo klappen.

@hbee jo stimmt. steht drin :sunglasses: ------- auch wenn ich nervig bin…dann sollte es doch so gehen…: im Template hab ich {$catId=1189} in der Bootstrap müsste ich dann doch mit $catId = $view->getAssign(‚catId‘); die catID= 1189 setzen können. geht aber nicht…aber genauso hast Du es doch auch mit sArticles gemacht…oder? Wenn ich die 1189 in ein Attribut schreibe und Deinen Code nehme, dann klappt es. *grübel*

ok, getAssign funktioniert nicht mit Variablen die erst im Template erstellt werden. Die müssen dazu wohl schon in der indexAction des Controllers erstellt worden sein. Warum willst du die Cat-ID denn im Template setzen? Wird sie dort irgend wie dynamisch erzeugt? ansonsten macht das doch keinen sinn.

Ich hab ne Abfrage von diversen Herstellern, je nach Hersteller werden diverse tabs mit FAQ etc. gefüllt und meine Idee war hier auch die entsprechende Kategorie, die herstellerbezogen ist zu nutzen. Lg Volker

aber den Hersteller hast du ja auch in den Artikel-Daten – da kommst du ja ran. Reicht dir das nicht? Die Abfrage kannst du dann ja auch in der Bootstrap machen. Ansonsten hab ich da jetzt auch keine Lösung für parat, auch wenn bald Weihnachten ist :wink:

Jo. Hast recht. Natürlich… Hab ich jetzt auch so gemacht :slight_smile: Wir stecken in den letzten Zügen unserer WAWI (erp-complete)und shopware Umstellung, da fehlt manchmal der klare Gedanke. Danke nochmal :slight_smile: Lg Volker