Hallo, ich würde gerne einem eigenen Listing-Template vorgeben, wie viele Artikel (pro Seite) angezeigt werden sollen - das wird wohl in der \frontend\listing\listing_actions.tpl festgelegt, oder? Zurzeit kann man ja nur global im Backend die Anzahl vorgeben, aber das betrifft dann unerwünschterweise ja alle Kategorien… Da es ein eigenes Template ist könnte ich also eine eigene listing_actions_xyz.tpl anlegen und laden. Auch kann diese Vorgabe gerne direkt “fest verdrahtet” im Template stehen - nur was muss wie geändert werden? Hat Jemand eine Idee? Grüße rattatui
(push…) Keiner eine Idee? Grüße rattaui
Ich bin zwar kein Templater AAAABER es müsste sich ja hier irgendwo verstecken [code] {* Article per page *} {block name=‘frontend_listing_actions_items_per_page’} {if $sPerPage}
Hi Klingelbeutel, ich vermute auch das dies die richtige Stelle ist… Wäre klasse wenn Du da etwas rausfindest :thumbup: Grüße rattatui
Hab mich jetzt durchgezappt und das Ergebnis: Ich finds nicht Habe dann doch zu lange nichts in diesem Bereich gemacht… Ggf. hilft dir dieser Artikel weiter: http://wiki.shopware.de/Ausgabe-bestimmter-Artikel-auf-der-Startseite_detail_468.html Besten Gruß
hallo, da das auf mich wohl auch zukommt, hab ich mal ein bißchen experimentiert. Das Hauptproblem ist, den Wert von sPerPage wieder auf den Standartwert zurückzusetzen, wenn Du von dem speziellen Template auf die anderen gehst. Das geht wohl nur mit einem Plugin: siehe http://wiki.shopware.de/Einfuehrung-Hook-System_detail_615.html Ich habe in engine\Shopware\Plugins\Local\Frontend[b]sPerPageHook[/b] folgende Bootstrap.php angelegt: [code]<?php class Shopware_Plugins_Frontend_sPerPageHook_Bootstrap extends Shopware_Components_Plugin_Bootstrap {
public function install() {
$hook = $this->createHook( ‘sArticles’, ‘sGetArticlesByCategory’, ‘set_sPerPage’, Enlight_Hook_HookHandler::TypeBefore, 0 ); $this->subscribeHook($hook); return true; } static function set_sPerPage(Enlight_Hook_HookArgs $args) { $id = $args->getArgs(); if (!empty(Shopware()->System()->_POST[‘sPerPage’])){ Shopware()->System()->_SESSION[‘tempPerPage’] = Shopware()->System()->_POST[‘sPerPage’]; } if($id[0] == 2157) { Shopware()->System()->_GET[‘sPerPage’] = ;
unset(Shopware()->System()->_SESSION[‘sPerPage’]);
} else {
Shopware()->System()->_GET[‘sPerPage’] = Shopware()->System()->_SESSION[‘tempPerPage’];
}
}
}[/code]In _SESSION[‘tempPerPage’] (Zeile 23) liegt der Wert von sPerPage, falls man ihn über die Auswahlbox Artikel pro Seite umgeschaltet hat.
if($id[0] == 2157) fängt das bewußte Template ab, über die categoryId, für die anderen Templates wird der alte Wert wieder eingesetzt.
Den Rest macht die Funktion sGetArticlesByCategory aus engine\core\class\sArticles.
Beste Grüße
Hi Klingelbeutel, [quote]Ggf. hilft dir dieser Artikel weiter:…[/quote] Das hilft mir hier zwar nicht direkt, ist aber trotzdem sehr interessant und bis SW 3.0.5 (diese Funktion ist ab 3.5 auch im Backend vorhanden), aber gut zu wissen wo da geschraubt wird danke Dir. Hi tetri999, In meinem (speziellen) Listing-Template wird die Auswahlbox „Artikel pro Seite“ nicht mehr angezeigt, momentan wird ja automatisch der Standardwert aus dem Backend übernommen. Die standard-Listing-Templates benutze ich an anderer Stelle aber auch. Ich müsste Deinen Plugin Code mal nachher ausprobieren - eben trägst Du die Kategorie-ID ja fest ein - könnte man hier nicht auch einen Wert von einem Kategorie Freitext-Feld (z.B. $sCategory.ac\_attr6
nehmen? Dann wäre man ja recht flexibel… …Weiterhin, damit ich das richtig verstehe, fängt Dein Code eine andere gewählte Voreinstellung ab und stellt bei Kategorie(template-)wechsel wieder auf den Standardwert zurück - wie kann ich aber in meinem Fall überhaupt erstmal etwas eigenes vorgeben? …alle Artikel einer Kategorie anzuzeigen, würde mir auch schon helfen :wtf: Grüße rattatui
zunächst zu [quote]könnte man hier nicht auch einen Wert von einem Kategorie Freitext-Feld[/quote] in der Funktion set_sPerPage vor die Abfrage folgendes: ... $category = $args-\>getSubject()-\>sSYSTEM-\>\_GET['sCategory']; $catContent = Shopware()-\>Modules()-\>Categories()-\>sGetCategoryContent($category); if ( !empty($catContent['ac\_attr6']) ){ $sPerPage = $catContent['ac\_attr6']; } if( !empty($sPerPage) ) { Shopware()-\>System()-\>\_GET['sPerPage'] = $sPerPage; unset(Shopware()-\>System()-\>\_SESSION['sPerPage']); } else { Shopware()-\>System()-\>\_GET['sPerPage'] = Shopware()-\>System()-\>\_SESSION['tempPerPage']; }
Damit wird sPerPage auf den Wert von ac_attr6 gesetzt, wenn leer -> dann der Standardwert. zu [quote]wie kann ich aber in meinem Fall überhaupt erstmal etwas eigenes vorgeben[/quote] das eigene wird ja durch das plugin bzw. jetzt durch den Wert ac_attr6 gesteuert, die anderen Templates nehmen den Standardwert aus dem Backend. daß die Auswahlbox “Artikel pro Seite” auf Deinem eigenen Listing nicht angezeigt wird, könnte daran liegen, daß das Template nicht unter den $defaultViews registriert ist. Das hab ich in der engine/Shopware/Controllers/Frontend/Listing.php gefunden, undzwar zweimal: in Zeile 56 und 67. Da hab ich einfach zum Testen in array(‘article_listing_1col.tpl’, ‘article_listing_2col.tpl’, ‘article_listing_3col.tpl’, ‘article_listing_4col.tpl’) hinten das eigene Template angehängt (müßte man natürlich auch mit plugin lösen). Aber diese Auswahlbox brauchst Du ja eigentlich gar nicht für den speziellen Wert. Beste Grüße Nachtrag: Ich habe das frontend/listing/index.tpl überschrieben. Da muß das eigene Template natürlich auch rein: [code]{* Main content *} {block name=‘frontend_index_content’}
… {* Change / Logic move to controller *} {if $sCategoryContent.template eq “article_listing_1col.tpl”} {assign var=“sTemplate” value=“listing-1col”} {assign var=“sBoxMode” value=“list”} … {elseif $sCategoryContent.template eq “my_special_template.tpl”} {assign var=“sTemplate” value=“my_special_template”} {assign var=“sBoxMode” value=“table”} {else} {assign var=“sTemplate” value=“listing-3col”} {assign var=“sBoxMode” value=“table”} {/if} …[/code]weil das darunter in {\* Listing \*} {block name="frontend\_listing\_index\_listing"} {include file='frontend/listing/listing.tpl' sTemplate=$sTemplate} {/block}
mit übergeben wird.
Hallo, danke sehr :thumbup: …also ab Zeile 22 Deine Ergänzung dazwischenschieben und der andere/restliche Code bleibt so? Sonst wäre ja der Wert der Kategorie ID weg… Das die Auswahlbox bei mir nicht erscheint ist beabsichtigt - war missverständlich von mir geschrieben. Was Du im Nachtrag geschrieben hast: Ich habe das Listing Template ja nach dem Wiki hier erstellt, dabei musste auch nichts in der frontend/listing/index.tpl eingetragen werden - ist das jetzt zwingend notwendig? [quote]Ich habe das frontend/listing/index.tpl überschrieben.[/quote] hiermit, oder?: Enlight\_Hook\_HookHandler::TypeBefore,
…wäre das auch möglich in diesem Fall und die Änderung in der index.tpl nicht nötig?: Enlight\_Hook\_HookHandler::TypeAfter,
Grüße rattaui
um Mißverständnissen vorzubeugen, hier nochmal die ganze set_sPerPage aus dem sPerPageHook: static function set\_sPerPage(Enlight\_Hook\_HookArgs $args) { if (!empty(Shopware()-\>System()-\>\_POST['sPerPage'])){ Shopware()-\>System()-\>\_SESSION['tempPerPage'] = Shopware()-\>System()-\>\_POST['sPerPage']; } $category = $args-\>getSubject()-\>sSYSTEM-\>\_GET['sCategory']; $catContent = Shopware()-\>Modules()-\>Categories()-\>sGetCategoryContent($category); if ( !empty($catContent['ac\_attr6']) ){ $sPerPage = $catContent['ac\_attr6']; } if( !empty($sPerPage) ) { Shopware()-\>System()-\>\_GET['sPerPage'] = $sPerPage; unset(Shopware()-\>System()-\>\_SESSION['sPerPage']); } else { Shopware()-\>System()-\>\_GET['sPerPage'] = Shopware()-\>System()-\>\_SESSION['tempPerPage']; } }
Die aktuelle KategorieID wird in Zeile 6 ermittelt, und wenn im zugehörigen categoryContent ac_attr6 gesetzt ist, wird dieser Wert als sPerPage verwendet, sonst der Standardwert. Das frontend/listing/index.tpl ist eine Smarty-Template-Datei, keine .php, da ist nichts mit TypeBefore oder TypeAfter. Wenn man dort in {include file=‘frontend/listing/listing.tpl’ sTemplate=$sTemplate} den Template-Namen übergibt, kann man ihn z.B. als CSS-Klasse einbauen und darüber dann auch ein spezielles Layout dieses Kategorie-Templates steuern. Das mit den $defaultViews in engine/Shopware/Controllers/Frontend/Listing.php am besten vergessen … Beste Grüße Entschuldigung, Du meintest TypeAfter in der sPerPageHook, das geht aber nicht - der Wert Shopware()->System()->_GET[‘sPerPage’] muß am Anfang gesetzt werden, weil im weiteren Verlauf der sGetArticlesByCategory daraus die DB-Abfrage zusammengebaut wird.
danke Dir vielmals. [quote]Die aktuelle KategorieID wird in Zeile 6 ermittelt, und wenn im zugehörigen categoryContent ac_attr6 gesetzt ist, wird dieser Wert als sPerPage verwendet, sonst der Standardwert.[/quote] Ahh gut jetzt verstehe ich. [quote]Entschuldigung, Du meintest TypeAfter in der sPerPageHook, das geht aber nicht - der Wert Shopware()->System()->_GET[‚sPerPage‘] muß am Anfang gesetzt werden, weil im weiteren Verlauf der sGetArticlesByCategory daraus die DB-Abfrage zusammengebaut wird.[/quote] Ja genau so meinte ich Danke für die Aufklärung. [quote]{include file=‚frontend/listing/listing.tpl‘ sTemplate=$sTemplate} den Template-Namen übergibt, kann man ihn z.B. als CSS-Klasse einbauen und darüber dann auch ein spezielles Layout dieses Kategorie-Templates steuern.[/quote] Ja das nutze ich auch schon reichlich - eine gute Sache. [quote]Das mit den $defaultViews in engine/Shopware/Controllers/Frontend/Listing.php am besten vergessen …[/quote] Wird gemacht… endlich mal was einfaches! Schönes WE wünsche ich Dir. Grüße rattatui
Kann es sein, dass dieses Workaround mit 4.0.6 nicht mehr funktioniert? Habe es ausprobiert, leider ohne Ergebnis. So bin ich vorgegangen: 1. Bootstrap.php hochgeladen 2. Im Plugin-Manager aktiviert 3. Im entsprechenden Freitextfeld der Kategorie eine Zahl eingetragen
Bei mir klappt es leider auch nicht. Nutze SW 4.3.2. Kann jemand eine funktionierende Lösung benennen?