ürün toplama çağrısında iade öğeleri magento sınırlayıcı sayısı

6 Cevap php

Im list.phtml şablonun bir kopyası elle döndürülen sonuç sayısını sınırlamak için çalışıyor, ama onun ben beklenenden daha çok daha zor olduğu ortaya çeviriyor.

Ive toplama boyutu ayarını elle denedim, ama ya bir kez daha hiçbir şey çalışıyordu. Birisi nasıl bunu bana gösterebilir misin? Nmuch duyacağız!

6 Cevap

Hızlı bir şekilde bu yöntem ile I recently discovered. Hatta şablonda doğrudan kullanabilirsiniz.

$_productCollection = clone $this->getLoadedProductCollection();
$_productCollection->clear()
                   ->setPageSize(3)
                   ->load();

@ Joseph benzer bir yaklaşım Mage_Catalog_Block_Product_List geçersiz ancak yeni sınıfında aşağıdaki kodu eklemek için:

const PAGE_SIZE = 3;

protected function _getProductCollection(){
    $collection = parent::_getProductCollection();
    $yourCustomBoolean = someFunctionThatDetectsYourCustomPage();
    if($yourCustomBoolean) {
        $collection->setPageSize(self::PAGE_SIZE);
    }
    return $collection;
}

Eğer ana bloktan Mage_Catalog kodunda herhangi bir gelecek değişiklikleri devralır ama hala sayfa sınırlar koyacaktır bu şekilde.

İdeal PAGE_SIZE hardcoding olmadan bir yönetici tarafından düzenlenebilir bir alan oluşturmak için system.xml düğüm kullanmak istiyorsunuz. Xml gibi görünecektir:

<config>
<sections>
    <catalog>
        <groups>
            <frontend>
                <fields>
                    <custom_page_size translate="label">
                        <label>Page Size for Custom Page Type</label>
                        <frontend_type>text</frontend_type>
                        <sort_order>9999</sort_order>
                        <show_in_default>1</show_in_default>
                        <show_in_website>1</show_in_website>
                        <show_in_store>1</show_in_store>
                    </custom_page_size>
                </fields>
            </frontend>
        </groups>
    </catalog>
</sections>
</config>

Daha sonra kodunuzu bu değerini almak:

$page_size = Mage::getStoreConfig('catalog/frontend/custom_page_size');

HTH,
JD

ne yazık ki _getProductCollection() yönteminde Koleksiyonu zaten bir sayfa boyutu ile başlatıldı çünkü çalışmıyor.

Daha esnek bir çözüm adından da anlaşılacağı gibi toplama yüklenmeden önce, gönderilen, catalog_product_collection_load_before olayı gözlemleyerek o olabilir.

İşte (altında yourmodule uzantı yazmak varsayarak yourpackage) bir örnek şöyle:

1. ADIM: config.xml sizin gözlemci tanımlayın

Lütfen config.xml uzatma dosyasının global bölümündeki gibi bir şey eklemek:

<events>
  <catalog_product_collection_load_before>
    <observers>
      <yourpackage_yourmodule_catalog_observer>
        <type>singleton</type>
        <class>yourpackage_yourmodule/catalog_observer</class>
        <method>limitPageSize</method>
      </yourpackage_yourmodule_catalog_observer>
    </observers>
  </catalog_product_collection_load_before>
</events>    

2. ADIM: Model\Catalog klasörünün altında Gözlemci sınıfı tanımlayın:

<?php
class Yourpackage_Yourmodule_Model_Catalog_Observer
{
  public function limitPageSize($observer)
  {
    #TODO: Insert the logic you need to differentiate when to apply the following
    $event = $observer->getEvent();
    $collection = $event->getCollection();
    $collection->setPageSize(3);
    return $this;
  }
}

Hope it helps. Sincerely, Alessandro Ronchi

Zaten zaman biz sayfa boyutunu ayarlamak için fırsat kaybettim şablona almak anlamına gelir, denir) (yük olmuştur toplama list.phtml döndü gibi görünüyor. Yani, bu biraz dağınık almak için gidiyor!

Bu koleksiyon oluşturduğu blok biz kendi sınıf genişletmek ve aynı zamanda geçersiz, hangi Mage_Catalog_Block_Product_List olduğunu. Mage_Catalog_Block_Product_List genişleten yeni bir blok oluşturmak ve aşağıdaki gibi _getProductCollection yöntemini geçersiz:

/**
 * Retrieve loaded category collection
 *
 * @return Mage_Eav_Model_Entity_Collection_Abstract
 */
protected function _getProductCollection()
{
    if (is_null($this->_productCollection)) {
        $layer = Mage::getSingleton('catalog/layer');
        /* @var $layer Mage_Catalog_Model_Layer */
        if ($this->getShowRootCategory()) {
            $this->setCategoryId(Mage::app()->getStore()->getRootCategoryId());
        }

        // if this is a product view page
        if (Mage::registry('product')) {
            // get collection of categories this product is associated with
            $categories = Mage::registry('product')->getCategoryCollection()
                ->setPage(1, 1)
                ->load();
            // if the product is associated with any category
            if ($categories->count()) {
                // show products from this category
                $this->setCategoryId(current($categories->getIterator()));
            }
        }

        $origCategory = null;
        if ($this->getCategoryId()) {
            $category = Mage::getModel('catalog/category')->load($this->getCategoryId());
            if ($category->getId()) {
                $origCategory = $layer->getCurrentCategory();
                $layer->setCurrentCategory($category);
            }
        }
        $this->_productCollection = $layer->getProductCollection();

        $this->prepareSortableFieldsByCategory($layer->getCurrentCategory());

        // OUR CODE MODIFICATION ////////////////////
        $yourCustomPage = someFunctionThatDetectsYourCustomPage();
        if($yourCustomPage) {
            $this->_productCollection->setPageSize(1);
            $this->_productCollection->setCurPage(3);
            $this->_productCollection->load();
        }
        /////////////////////////////////////////////

        if ($origCategory) {
            $layer->setCurrentCategory($origCategory);
        }
    }
    return $this->_productCollection;
}

Önemli parçası, özel list.phtml sayfasını kullanarak ya da değil olup olmadığını algılamak için bir yol bulmak. Sonra sınıf düzenleri <block type='catalog/product_list' /> başvurular geçersiz kılmak gerekir, ve gitmek için ayarlanmış olmalıdır.

Umarım ki olur!

Thanks, Joe

Ben Kullanıcı Kodu var: clockworkgeek, ama burada bazı sorun ve doğru kod aşağıdaki gibi, o iş ve teşekkür clockworkgeek olduğunu.

$_productCollection = $this->getLoadedProductCollection();
$_productCollection->clear();
$_productCollection->setPageSize(3)
$_productCollection->load();

Bunları da yazmak enter code here ya da değiştirmek bu sorunu çözmek

$this->getLoadedProductCollection()->clear();
$_productCollection = $this->getLoadedProductCollection();

Thanks, If it help you then comment.

Bahsedildiği gibi, productCollection zaten sayfa boyutu belirledi. Olsa koleksiyon almak için başka bir yolu yoktur; catalog/product Modeli ile:

$productCollection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToSelect(
        array('name', 'image', 'price')
    )
    ->addIdFilter( 
        array('1', '2')
    )
    ->setPageSize( 2 )
    ->load();
;

return $productCollection->getSelect()->__toString();

Sonuçlanan sorgu (ve sonuçta object) LİMİT sözdizimi içeriyor:

SELECT `e`.* ... WHERE (`e`.`entity_id` IN('1', '2')) LIMIT 2;

Ne olduğunu sordular mı?