Magento:从Varien_Data_Collection获取数据

时间:2013-04-18 08:56:43

标签: php magento magento-1.6

大家好!我希望你能给我一个线索,因为我还是和Magento一样。

我尝试显示我在数组中获得的产品列表。在Mage/Catalog/Block/Product/List.php中,我创建了一个新的Varien_Data_Collection(),其中我推送了我的产品对象(->addItem($product))。

然后我返回我的自定义集合,List.php类使用它来显示产品列表。

当我在浏览器中调用该页面时,我显示了正确数量的显示产品,当我点击它以查看产品页面时,我得到了正确的页面。

但是,所有数据(如产品名称,价格等)都是空的。我猜List类用于捕获这些数据的方法因我的Varien_Data_Collection对象而失败。

为了说明,这是我的代码示例:

// getting a particular product
$mainProduct = Mage::getModel('catalog/category')->load($currentCat->getId());
$mainProduct = $mainProduct->getProductCollection();
$mainProduct = $mainProduct->addAttributeToFilter('product_id', $_GET['cat_id']);

// creating a custom collection             
$myCollection = new Varien_Data_Collection();

foreach ($mainProduct as $product) {
    // getting my particular product's related products in an array
    $related = $product->getRelatedProductIds();                
    if ($this->array_contains($related, $_GET['cat_id'])) {
        // if it suits me, add it in my custom collection
        $myCollection->addItem($product);
    }
}
return $myCollection;

这就是我在列表页面中得到的内容:

enter image description here

当我var_dump($myCollection)时,我可以看到['name']['price']等字段未被引用。只有['product_id']以及我不关心的许多其他字段。

我的最终问题是:如何将包含这些产品数据的集合返回给我的List类?我知道它的解释很差,但我的英语非常有限,我尽力做到最好:(

2 个答案:

答案 0 :(得分:2)

针对某个类别调用->getProductCollection()仅返回已创建集合中每个产品的骨架数据。如果您需要每个产品的完整数据,则需要加载它们,因此在foreach循环中您将拥有:

$product = Mage::getModel('catalog/product')->load($product->getId());

但是,构建集合的方式并不是最好的工作方法 - 您永远不必创建自己的Varien_Data_Collection对象,而应该按如下方式创建产品集合:

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

然后在加载集合之前(foreach循环或对集合调用->load()将作为2个示例),您可以根据您的要求过滤集合。您可以使用本机Magento方法执行此操作,其中一种方法已经使用(addAttributeToFilter()),或者我更喜欢从集合中提取select对象并以这种方式应用过滤:

$select = $collection->getSelect();

然后,您可以对此select对象运行所有Zend_Db_Select类方法以过滤集合。

http://framework.zend.com/manual/1.12/en/zend.db.select.html

加载集合后,其中的产品将包含完整的产品数据。

答案 1 :(得分:1)

首先pelase不使用$ _GET变量,使用Mage::app()->getRequest()->getParams(); 为什么不尝试从一开始就正确地构建你的收藏?

这是您的代码所做的事情:

$mainProduct = Mage::getModel('catalog/category')->load($currentCat->getId());
$mainProduct = $mainProduct->getProductCollection();
$mainProduct = $mainProduct->addAttributeToFilter('product_id', $_GET['cat_id']);

获取一个产品,我的意思是您加载一个类别然后加载产品集合,然后按产品ID过滤..为什么不:

$mainProduct = Mage::getModel('catalog/product')->load($yourSearchedId);

我也不明白为什么你用$ _GET ['cat_id']过滤产品,看起来像是一个类别ID ...

总而言之,如果您准确解释您想要找到的内容,您可以获得更多帮助。看起来您正在尝试查找具有相关产品的所有产品。那么为什么不正确地为该给定产品设置相关产品并获得相关产品集合。

$_product->getRelatedProductCollection();

更新:

现在你已经清除了你的请求,试试这个:

$relatedIds = $product->getRelatedProductIds();
$myCollection = Mage::getModel('catalog/category')
    ->load($currentCat->getId())
    ->getProductCollection();
$myCollection->addAttributeToFilter('product_id', array("in",$relatedIds));

// add addAttributeToSelect您可能需要的所有属性,如名称等     $ myCollection->负载(); //也许你不需要在这里加载

请记住,我没有测试这个代码,它是从我的头顶写的,测试它。但我希望你有这个主意。