我正在尝试显示与可配置产品相关的简单产品的库存状态列表。这是正常工作,除非在没有显示相关属性'Size'时为数组的第一个实例。
<?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
有关我出错的指示以及如何显示第一个属性的任何指示?
答案 0 :(得分:2)
解决问题比理解导致问题容易得多!但是,让我按正确的顺序解决它:
首先,addAttributeToSelect
和getAttributeText
实际上都使用attribute_code
,而不是attribute_value
(我认为你有尺寸,而不是大小)。
因此Magento第一次在$product->getData('Size')
内getAttributeText
进行null
,然后返回getAttributeText
。
当您将尺寸传递给SELECT `eav_attribute`.* FROM `eav_attribute` WHERE (`eav_attribute`.`attribute_code`='Size') AND (entity_type_id = :entity_type_id);
函数时,尺寸代码会被尺寸替换为特定代码属性实例。怎么回事?非常简单:在方法链的最深层,Magento向DB发出下一个请求:
attribute_code
如果你的表整理 不区分大小写(* _ci),那么无论实际的getAttributeText('Size')
是什么,它都会得到值尺寸”。您可以在official article和SO上阅读有关整理的详情。
因此,在第一个$product->getData('Size')
函数之后,每个连续load
将返回正确的值。
现在返回你的脚本。除了 size-Size 问题之外,你还有一些小问题,但是为了更好地理解Magento和php,你可以很好地理解它们:
首先,在循环中使用collection
函数确实是一种不好的做法 - 尤其是连续两次,特别是对于产品对象。如果您的可配置产品有很多简单,那么您将获得不必要的内存和时间损失。最好将所需的所有数据添加到addAttributeToSelect
,然后在循环中使用已加载的产品。顺便说一下,您已使用$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
第二个问题我想提一下,因为你在<?php foreach($col as $simple_product):?>
<li>
<?php if ( $qty >= 1 ):?>
<!-- some html -->
<?php else:?>
<!-- some html -->
<?php endif:?>
</li>
<?php endforeach;?>
模板文件中,需要你遵循Magento模板标准 - 使用close标签为你循环和案例:
{{1}}
答案 1 :(得分:1)
这将在ver。 1.7.0.2你不必自己输入AttributeText它会自动收集它们。
<?php if($_product->getTypeId() == "configurable"):
$ids = $_product->getTypeInstance()->getUsedProductIds(); ?>
<?php $instock = "Next Day"; ?>
<?php $outofstock = "4 to 7 Days"; ?>
<ul>
<?php foreach ($ids as $id) :
$simpleproduct = Mage::getModel('catalog/product')->load($id);
$name = $simpleproduct->getName();
$qty = (int)Mage::getModel('cataloginventory/stock_item')->loadByProduct($simpleproduct)->getQty();?>
<li><?php echo $simpleproduct->getName()." - ".(int)Mage::getModel('cataloginventory/stock_item')
->loadByProduct($simpleproduct)->getQty();?>
</li>
<li><?php
if ( $qty >= 1 )
{echo $qty, " ",$name," ",$instock;}
else
{echo $qty, " ",$name," ",$outofstock;}
?>
</li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
答案 2 :(得分:0)
您确定第一个产品上设置了Size
属性吗?我使用shirt_size
作为我的属性测试了您的代码,我的结果按预期返回。