我正在尝试显示与可配置产品相关的简单产品的库存状态列表。这工作正常,除非对于数组的第一个实例,相关属性“大小”不显示。
<?php $_helper = $this->helper('catalog/output'); ?>
<?php $_product = $this->getProduct(); ?>
<?php $instock = "Next Day"; ?>
<?php $outofstock = "4 to 7 Days"; ?>
<?php $conf = Mage::getModel('catalog/product_type_configurable')->setProduct($_product); ?>
<?php $col = $conf->getUsedProductCollection()->addAttributeToSelect('Size')->addFilterByRequiredOptions(); ?>
<ul>
<?php foreach($col as $simple_product){
$qty = intval(Mage::getModel('cataloginventory/stock_item')->loadByProduct($simple_product)->getQty());
$size = Mage::getModel('catalog/product')->load($simple_product->getId())->getAttributeText('Size');
?>
<li>
<?php
if ( $qty >= 1 )
{echo $qty, " ",$size," ",$instock;}
else
{echo $qty, " ",$size," ",$outofstock;} ?>
</li>
<?php } ?>
</ul>
结果集如下所示:
99 Next Day
99 9 Next Day
99 8.5 Next Day
99 8 Next Day
99 7.5 Next Day
0 7 4 to 7 Days
99 12 Next Day
99 11.5 Next Day
99 11 Next Day
99 10.5 Next Day
99 10 Next Day
有什么关于我的错误以及如何显示第一个属性的指示吗?
最佳答案
解决您的问题比了解导致问题的原因容易得多!但让我以正确的顺序来解决这个问题:
首先,
addAttributeToSelect
和getAttributeText
实际上都是使用attribute_code
进行操作,而不是attribute_value
(我相信你有尺寸,而不是尺寸)。因此,Magento 第一次在
getAttributeText
内执行$product->getData('Size')
时,它返回null
.当您将 Size 传递给
getAttributeText
函数时,size 代码将替换为 Size对于特定的属性实例。这是怎么回事?非常简单:在方法链的最深层,Magento 向数据库发出下一个请求:SELECT `eav_attribute`.* FROM `eav_attribute` WHERE (`eav_attribute`.`attribute_code`='Size') AND (entity_type_id = :entity_type_id);
如果您的表格整理不区分大小写 (*_ci),则无论实际
attribute_code
是什么,它都会获取该值> 是“尺寸”。您可以在official article中阅读有关整理的更多信息。以及 SO .因此,在第一个
getAttributeText('Size')
函数之后,每个连续的$product->getData('Size')
将返回正确的值。
现在返回到您的脚本。除了 size-Size 问题之外,您还遇到了一些小问题,但是处理这些问题对于您更好地理解 Magento 和 php 来说会很棒:
首先,在循环内使用
load
函数确实是一种不好的做法 - 尤其是连续两次,尤其是对于产品对象。如果您的可配置产品有很多简单的内容,您将遭受不必要的内存和时间损失。最好将所需的所有数据添加到集合
中,然后在循环中使用加载的产品。顺便说一句,您已经使用addAttributeToSelect
函数将 size 添加到您的集合中。 因此解决您的问题的正确方法是:$col = $conf->getUsedProductCollection() ->addAttributeToSelect('size') ->joinField( 'qty', 'cataloginventory/stock_item', 'qty', 'product_id=entity_id', '{{table}}.stock_id=1', 'left' )->addFilterByRequiredOptions(); foreach($col as $simple_product){ $qty = (int)$simple_product->getQty(); $size = $simple_product->getAttributeText('size'); // do your logic }
我想提的第二个问题是,由于您位于
.phtml
模板文件中,因此您需要遵循 Magento 模板标准 - 对循环和案例使用关闭标记:<?php foreach($col as $simple_product):?> <li> <?php if ( $qty >= 1 ):?> <!-- some html --> <?php else:?> <!-- some html --> <?php endif:?> </li> <?php endforeach;?>
关于magento - 可配置子产品的属性和库存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996469/