Unterschiedliche Anzahl von Produkten auf der Kategorieseite anzeigen


7

Ich versuche, eine unterschiedliche Anzahl von Produkten in der Kategorie anzuzeigen, aber es funktioniert nur auf Seite 1. Ich möchte 22 Produkte auf Seite 1 anzeigen und alle Seiten 20 Produkte pro Seite ruhen lassen. Ich habe es geschafft, durch setPageSize auf der ersten Seite zu ändern, und es funktioniert gut, aber ruhen Sie alle Seiten aus, für die ich kein Produktlimit von 20 pro Seite erreichen kann.

Page 1...22 products //works well
Page 2...20 products //doesn't work..shows from 21 to 40
Page 3...20 products //doesn't work..shows from 41 to 60

So geht es mir:

$currentPage = (int) Mage::app()->getRequest()->getParam('p');
if ($currentPage==0 || $currentPage==1){
    $productCollection->clear();
    $productCollection->setCurPage($currentPage)->setPageSize(22); //works..
} else {
        $productCollection->clear(); 
        $productCollection->getSelect()->limit(20,22); //doesn't work
}

Irgendeine Idee, wie ich das lösen kann?

Vielen Dank.

Antworten:


4

Das Problem ist, dass die LIMITbasierend auf "Seitengröße" und "aktuelle Seite" unmittelbar vor dem Laden der Sammlung berechnet wird. Siehe Mage_Eav_Model_Entity_Collection_Abstract :: _ loadEntities () :

public function _loadEntities($printQuery = false, $logQuery = false)
{
    if ($this->_pageSize) {
        $this->getSelect()->limitPage($this->getCurPage(), $this->_pageSize);
    }

Sie können dies verhindern, indem Sie _pageSizeauf 0 setzen:

$productCollection->setPageSize(0);
$productCollection->getSelect()->limit(20,22);

Außerdem ist es keine gute Idee, die bereits geladene Sammlung zurückzusetzen, um sie erneut zu laden.

Sie können einen Beobachter schreiben catalog_product_collection_load_before, um das Limit unmittelbar vor dem Laden der Sammlung zu manipulieren:

public function setProductPaging(Varien_Event_Observer $observer) 
{
    $collection = $observer->getCollection();
    if ($collection->getCurPage() == 1) {
        $collection->setPageSize(22);
    } else {
        $productCollection->setPageSize(0);
        $productCollection->getSelect()->limit(20, 22 + 20 * ($collection->getCurPage() - 2));
    }
}

Vielen Dank! Ich werde dies überprüfen und Sie wissen lassen, ob es funktioniert. Sieht so aus, als ob es funktionieren sollte.
Kalpesh

Es scheint zu funktionieren, aber die Paginierung ist nicht korrekt. Wenn es 21 Produkte gibt, wird statt 1 Seite 2 angezeigt. Irgendeine Idee?
Kalpesh

OK, dies wird schwierig, da die Anzahl der Seiten durch die Anzahl der Elemente geteilt durch die Seitengröße berechnet wird. Sie müssen diese Berechnung im Symbolleistenblock irgendwie manipulieren
Fabian Schmengler

Ich habe herausgefunden, dass wir hier das Produktlimit auf der Katzenseite festlegen können, Mage::getSingleton('catalog/session')->setLimitPage(22);bevor die Symbolleiste aufgerufen wird. Vielen Dank!
Kalpesh

Ich habe dieses Ereignis verwendetcatalog_block_product_list_collection
Kalpesh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.