我通过向Varien_Data_Collection集合对象添加项目来创建集合。
$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);
P.S我从未遇到过从中获取的集合的问题 模型集合,如Mage :: getModel('module / modelname') - > getCollection()。它只是通过向Varien_Data_Collection对象添加项而创建的集合。
答案 0 :(得分:6)
寻呼机在您的收藏集中调用setPageSize
,如果您追踪它,则仅由getLastPageNumber
使用。这意味着寻呼机可以准确地显示页数,但就是这样。通过将它们作为SQL的LIMIT
子句呈现,它实际上对当前页码和大小执行任何操作Varien_Data_Collection_Db
。
要创建一个尊重页面条件的集合,您必须为该类创建一个后代。有关提示,请查看the source of Varien_Data_Collection_Filesystem
及其实现方式loadData
。
我刚刚重新阅读了您的问题并意识到您可以这样做:
$collection = Mage::getModel('catalog/product')->getCollection()
->addIdFilter($array_of_products);
这个系列的页面会非常愉快。
答案 1 :(得分: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 :(得分: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;
}
}
谢谢, 卡希夫
答案 3 :(得分:0)
使用以下类扩展Varien Data Collection类:
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;
}
}