Individuelles Layout / Kategorie

Hallo zusammen,

momentan arbeite ich an einer Template File für ein individuelles Layout für das Listing. 
Das Ziel soll es sein, bestimmte Produkte ohne Preise auszugeben.

Folgende Anleitung scheint mir veraltet?!:
http://community.shopware.com/Creating-a-custom-category-listing_detail_1233.html

Ich bin jetzt so vorgegangen, dass ich eine Datei mit dem Namen box-free-article.tpl  angelegt habe.
In diese Datei habe ich den Inhalt der box-basic.tpl kopiert.

In der box-article.tpl habe ich dann folgende Abfrage hinzugefügt:

{if $sCategoryContent.template == "listing_free_articles.tpl"} 
    {include file="frontend/listing/product-box/box-free-article.tpl"}

Alles super, bis auf die kleine Ausnahme, dass sich die letzte Box der ersten Reihe 2% (.product–box{ margin: 2% 0 0 2% }) nach unten schiebt.
Obwohl das Elternelement (.listing{ margin: -2% 0 0 -2% }) das wieder ausgleichen sollte.

Ich habe noch keine Templateänderungen vorgenommen, ausser box-free-article.tpl zu erstellen und den Inhalt der box-basic.tpl einzufügen.

Die Abfrage habe ich auch in folgendes abgeändert:

{if $sCategoryContent.template == "listing_free_articles.tpl"} 
    {include file="frontend/listing/product-box/box-minimal.tpl"}

Führte zum selben Fehler, obwohl es der identische Aufruf ist wie:

{elseif $productBoxLayout == 'minimal'}
    {include file="frontend/listing/product-box/box-minimal.tpl"}

Hat jemand sich schon daran versucht und kann mir bei meinem Problem weiterhelfen?

Vielen Dank und einen schönen Abend.

 

Hallo,

schau Dir am besten mal die Dokumentation in den DevDocs an. Das solltest Du besser über die Vererbung lösen.

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

Sonnige Grüße,
Phil

Hallo Phil,

danke für deine Antwort. 

Ich bin jetzt nach folgender Beschreibung vorgegangen:
Example: Custom listing page.

Hat auch den Fehler beseitigt. Allerdings nur für Seite 1.
Bei eingestelltem Infinite Scroll werden die nachzuladenden Artikel ohne eigenes Template und mit dem voreingestellten Produktlayout geladen.
Nicht so bei deaktiviertem Infinite Scroll.

Hat jmd. eine Idee woran es liegen kann?

Hey,

ich denke die Datei die Du suchst ist die frontend/listing/listing_ajax.tpl.

Sonnige Grüße,
Phil

1 „Gefällt mir“

Hallo,

das hat nicht den gewünschten Erfolg gebracht. Habe mal recherchiert und habe ein paar weitere Posts mit dem Problem gefunden.
Leider keinen mit einer Lösung.

https://forum.shopware.com/discussion/27920/listing-anzeige-veraendern

Stoße immer wieder auf Enlight_Controller_Action_PostDispatchSecure_Widgets, allerdings kann ich damit nichts anfangen. Auch suchen hat mir nicht weitergeholfen.

Sollte die Variabel {$productBoxLayout} nach Anpassung in meiner “custom_listing.tpl” nicht so erhalten bleiben?

Beim Seitenaufruf ist ihr Inhalt “minimal custom”, was auch so sein soll. Beim ajax request ist der Inhalt jedoch “minimal”, was ja dem Standartverhalten entspricht.

Der  box_article.tpl  habe ich auch diese Abfrage hinzugefügt:

{elseif $productBoxLayout == 'minimal custom'}
  {include file="frontend/listing/product-box/box-custom.tpl"}

Die listing_ajax.tpl befindet sich auch in meiner Themestruktur.

Hallo moerv,

habe auch damit gekämpft.

In meinem fall wird auch nicht mein custom custom_listing.tpl gezogen.

Der „Fehler“ in meinen Augen liegt, dass im ajax context kein $sCategoryContent der View übergeben wird.
Somit existiert $sCategoryContent.template nicht (wo eig. deine custom template Datei stehen würde) und somit ist 
$productBoxLayout auf ‚basic‘.

Dies ist beim normalen Listing der beim erstaufruf geladen wird nicht so. 

Meine Lösung durch ein Plugin (kann man bestimmt besser machen aber es tuts):

box_article.tpl überschreiben:

{extends file=„parent:frontend/listing/box_article.tpl“} {block name=„frontend_listing_box_article_includes“} {if $myLayout == ‚custom_layout.tpl‘} {include file=„frontend/listing/product-box/custom_layout.tpl“} {else} {$smarty.block.parent} {/if} {/block}

Plugin schreiben (In meinem Beispiel nach dem neuen 5.2 Plugin system)

MyPlugin.php

namespace MyPlugin; use Shopware\Components\Plugin; /** * Class MyPlugin * @package MyPlugin */ class MyPlugin extends Plugin { const TEMPLATE = ‚custom_layout.tpl‘; /** * @return array */ public static function getSubscribedEvents() { return [// Register template. ‚Enlight_Controller_Action_PostDispatchSecure_Frontend_Listing‘ => ‚onListing‘, // Register template for infinite scroll. ‚Enlight_Controller_Action_PostDispatchSecure_Widgets_Listing‘ => ‚onWidgetListing‘]; } /** * @param \Enlight_Event_EventArgs $args */ public function onListing(\Enlight_Event_EventArgs $args) { /** @var \Shopware_Controllers_Frontend_Listing $subject */ $subject = $args->getSubject(); if ($subject->View()->sCategoryContent[‚template‘] == self::TEMPLATE) { $subject->View()->myLayout= self::TEMPLATE; // Register view. $this->container->get(‚Template‘)->addTemplateDir($this->getPath() . ‚/Views‘); } } /** * @param \Enlight_Event_EventArgs $args */ public function onWidgetListing(\Enlight_Event_EventArgs $args) { /** @var \Shopware_Controllers_Widgets_Listing $subject */ $subject = $args->getSubject(); if ($subject->Request()->getActionName() == ‚ajaxListing‘) { /* Get the category template because no $subject->View()->sCategoryContent isset in this context. */ $categoryId = $subject->Request()->getParam(‚sCategory‘); $categoryContent = Shopware()->Modules()->Categories()->sGetCategoryContent($categoryId); if ($categoryContent[‚template‘] == self::TEMPLATE) { $subject->View()->myLayout= self::TEMPLATE; // Register view. $this->container->get(‚Template‘)->addTemplateDir($this->getPath() . ‚/Views‘); } } }

}

Pluginstruktur:

MyPlugin

  • Views
    – listing
    — product-box
    ---- my_layout.tpl
    – box_article.tpl
  • MyPlugin.php 
  • plugin.xml

Hoffe habe keinen „schnell schnell“ - Fehler und es hilf den ein oder anderen.

Wenn es besser geht bitte schreiben. Bin lernbereit =)

Gruß

Hall Beyer,

kannst du eine Zip datei deines Plugins hochladen? Ich verstehe deine Änderung nicht ganz und würde dies ohne plugin realisieren wollen.