1

大家好!我希望你能给我一个线索,因为我仍然是 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;

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

在此处输入图像描述

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

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

4

2 回答 2

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 = $collection->getSelect();

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

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

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

于 2013-04-18T09:58:43.540 回答
1

首先请不要使用 $_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);

我也看不出你为什么按看起来像类别 ID 的 $_GET['cat_id'] 过滤产品......

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

$_product->getRelatedProductCollection();

更新:

既然您清除了请求,请尝试以下操作:

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

//也 addAttributeToSelect 你可能需要的所有属性,比如名字等 $myCollection->load(); //也许你实际上不需要在这里加载

请记住,我没有测试这个代码,它是从我的头顶编写的,测试它。但我希望你明白这一点。

于 2013-04-18T09:30:34.857 回答