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.

Kalpesh
quelle

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));
    }
}
Fabian Schmengler
quelle
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