2012-01-20 17 views
6

मैंने एक Varien_Data_Collection संग्रह ऑब्जेक्ट में आइटम जोड़कर एक संग्रह बनाया।Magento कस्टम संग्रह पेजिंग

$collection = new Varien_Data_Collection(); 
    foreach($array_of_products as $productId){ 
    $collection->addItem(Mage::getModel('catalog/product')->load($productId)); 
} 

हालांकि जब यह वस्तु नीचे दिए गए अनुसार Magento पेजर ब्लॉक पर जाती है, तो यह मेरे कस्टम पेज में पेजिनेशन तोड़ देती है।

$pager = $this->getLayout()->createBlock('page/html_pager', 'retailerfe.analysis.pager') 
      ->setCollection($collection); 

पी.एस मैं दाना :: getModel तरह मॉडल संग्रह से प्राप्त किए गए संग्रह के साथ समस्याओं कभी नहीं पड़ा है ('मॉड्यूल/modelname') -> getCollection()। यह केवल Varien_Data_Collection ऑब्जेक्ट में आइटम जोड़कर बनाए गए संग्रह हैं।

+0

त्रुटि संदेश का पाठ पोस्ट करें और हमें बताएं कि Magento के संस्करण। v1.4 ने पेजिनेशन काम करने के तरीके को बदल दिया। –

+1

कोई त्रुटि संदेश नहीं है। यह सिर्फ इतना है कि अंकन थोड़ा अजीब हो जाता है। पेजर पृष्ठ संख्याओं की सही गणना करता है। ऐसा लगता है कि यह संग्रह पर सीमा लागू करने में सक्षम नहीं है। सभी आइटम सभी पृष्ठों पर दिखाए जाते हैं। मैं Magento v 1.5.0.1 – Adheesh

+1

का उपयोग करता हूं ऐसा लगता है कि जब भी रिक्त स्थान पर आइटम जोड़कर बनाया गया संग्रह भिन्न होता है तो Varien_Data_Collection ऑब्जेक्ट पेजिनेट पर किया जाता है। – Adheesh

उत्तर

6

पेजर setPageSize अपने संग्रह जिस पर बुला रहा है - यदि आप इसे का पता लगाने - केवल getLastPageNumber द्वारा प्रयोग किया जाता है। इसका मतलब है कि पेजर पृष्ठों की संख्या को सटीक रूप से दिखा सकता है लेकिन यह है। यह Varien_Data_Collection_Db है जो वास्तव में SQL पृष्ठ के लिए LIMIT खंड के रूप में उन्हें प्रस्तुत करके वर्तमान पृष्ठ संख्या और आकार के साथ कुछ भी करता है।

पृष्ठ मानदंडों का सम्मान करने वाले संग्रह को बनाने के लिए आपको कक्षा में वंशज बनाना होगा। विचारों के लिए the source of Varien_Data_Collection_Filesystem देखें और यह loadData लागू करता है।


मैं सिर्फ अपने प्रश्न फिर से पढ़ें और महसूस किया कि आप यह कर सकते हैं किया है:

$collection = Mage::getModel('catalog/product')->getCollection() 
      ->addIdFilter($array_of_products); 

इस संग्रह में पेज काफी खुशी होगी।

+0

धन्यवाद, clockworkgeek। आपकी व्याख्या सही है। अगर मैं इससे अच्छा समाधान प्राप्त कर सकता हूं, तो मैं इसे यहां पोस्ट करूंगा। – Adheesh

+1

मुझे एक कस्टम संग्रह बनाना था और इसमें दो Magento संग्रहों को विलय करना था ... दरअसल उपर्युक्त सुझाव ठीक काम करता था: यह अंकन को ठीक करता है। मैं केवल Varien_Data_Colletion को विस्तारित करने वाले संग्रह को लागू करता हूं और Varien_Data_Collection_Filesystem में वर्णित तरीके से लोडडेटा को कार्यान्वित करता हूं। – WonderLand

+0

क्या कोई भी हमारे कस्टम Varien_Data_Collection में "Varien_Data_Collection_Filesystem" loadData विधि को कार्यान्वित करने के तरीके पर कोड पोस्ट कर सकता है? मैं सफलता के बिना घंटों तक इस अंकन मुद्दे को हल करने की कोशिश कर रहा हूं :(@ फ्रांसेस्को –

2

मैं सिर्फ संदेह पर (हो सकता है मैं गलत हूँ):

$collection->addItem(Mage::getModel('catalog/product')->load($productId)); 

जो इस तरह होना चाहिए:

$collection->addItem(Mage::getModel('catalog/product')->load($productId)->getData()); 

मुझे पता है कि अगर आप के लिए काम करता है। धन्यवाद

संपादित करें:
अंत में मैं यह पता लगा। यहाँ कैसे आप इसे क्या करना चाहिए है:

<?php 
$collection = new Varien_Data_Collection(); 
foreach($array_of_products as $productId){ 
    $product = Mage::getModel('catalog/product')->load($productId); 
    $_rowObject = new Varien_Object(); 
    $_rowObject->setData($product->getData()); 
    $collection->addItem($_rowObject); 
} 
+2

['addItem'] (http://docs.magentocommerce.com/Varien/Varien_Data/Varien_Data_Collection.html#addItem) को 'Varien_Object' की आवश्यकता होती है, एक सरणी नहीं। – clockworkgeek

+0

@clockworkgeek से सहमत हैं। मैंने वैसे भी कोशिश की। मुझे एक त्रुटि दी। लाइन 390 पर /var/www/magento/lib/Varien/Data/Collection.php में एक गैर-ऑब्जेक्ट पर किसी सदस्य फ़ंक्शन getId() पर कॉल करें। प्रतिक्रियाओं के लिए धन्यवाद। – Adheesh

+0

इसने मुझे अंकन के साथ मदद नहीं की है। जैसा कि @clockworkgeek ने कहा, वैरिएन_Data_Collection इस तरह के अंकन में मदद नहीं करता है। जवाब के लिए धन्यवाद। – Adheesh

0

समाधान प्रदान किया गया है।

class Test_Featuredsalons_Block_Featuredsalons extends Mage_Core_Block_Template 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
     $collection = Mage::getModel('featuredsalons/featuredsalons')->getCollection(); 
     $this->setCollection($collection); 
    } 

    protected function _prepareLayout() 
    { 
     parent::_prepareLayout(); 

     $pager = $this->getLayout()->createBlock('page/html_pager', 'custom.pager'); 
     $pager->setCollection($this->getCollection()); 
     $this->setChild('pager', $pager); 
     $this->getCollection()->load(); 

     return $this; 
    } 

    public function getPagerHtml() 
    { 
     return $this->getChildHtml('pager'); 
    } 

    public function getCollection()  
    {    
     $limit  = 10; 
     $curr_page = 1; 

     if(Mage::app()->getRequest()->getParam('p')) 
     { 
      $curr_page = Mage::app()->getRequest()->getParam('p'); 
     } 
     //Calculate Offset 
     $offset  = ($curr_page - 1) * $limit; 

     $collection = Mage::getModel('featuredsalons/featuredsalons')->getCollection() 
                ->addFieldToFilter('status',1);  
     $collection->getSelect()->limit($limit,$offset); 

     return $collection; 
    } 
} 

धन्यवाद, काशिफ

0

निम्नलिखित वर्ग उपयोग Varien डेटा संग्रह वर्ग का विस्तार करने के:

class Pageable_Varien_Data_Collection extends Varien_Data_Collection 
{ 
    /** 
    * Load data 
    * 
    * @param bool $printQuery 
    * @param bool $logQuery 
    * 
    * @return Pageable_Varien_Data_Collection 
    */ 
    public function load($printQuery = false, $logQuery = false) 
    { 
     if ($this->isLoaded()) { 
      return $this; 
     } 
     $this->_renderLimit(); 
     $this->_setIsLoaded(); 
     return $this; 
    } 

    /** 
    * @return Pageable_Varien_Data_Collection 
    */ 
    protected function _renderLimit() 
    { 
     if ($this->_pageSize) { 
      $currentPage = $this->getCurPage(); 
      $pageSize = $this->_pageSize; 
      $firstItem = (($currentPage - 1) * $pageSize + 1); 
      $lastItem = $firstItem + $pageSize; 
      $iterator = 1; 
      foreach ($this->getItems() as $key => $item) { 
       $pos = $iterator; 
       $iterator++; 
       if ($pos >= $firstItem && $pos <= $lastItem) { 
        continue; 
       } 
       $this->removeItemByKey($key); 
      } 
     } 
     return $this; 
    } 

    /** 
    * Retrieve collection all items count 
    * 
    * @return int 
    */ 
    public function getSize() 
    { 
     if (is_null($this->_totalRecords)) { 
      $this->_totalRecords = count($this->getItems()); 
     } 
     return intval($this->_totalRecords); 
    } 

    /** 
    * Retrieve collection items 
    * 
    * @return array 
    */ 
    public function getItems() 
    { 
     return $this->_items; 
    } 
} 
संबंधित मुद्दे