3

我正在尝试显示与可配置产品相​​关的简单产品的库存状态列表。这工作正常,除非当相关属性“大小”不显示时数组的第一个实例。

<?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

关于我错了什么以及如何显示第一个属性的任何指示?

4

3 回答 3

2

解决您的问题比了解导致它的原因要容易得多!但是让我按正确的顺序来解决它:

  1. 首先,两者addAttributeToSelect实际上getAttributeText都使用attribute_code, not attribute_value(我相信你有size,而不是Size)。

  2. 所以 Magento 第一次在$product->getData('Size')里面做getAttributeText,它就返回了null

  3. 当您将Size传递给getAttributeText函数时,大小代码将替换为特定属性实例的Size 。情况如何?非常简单:在方法链的最深层,Magento 向 DB 发出下一个请求:

    SELECT `eav_attribute`.* FROM `eav_attribute` WHERE (`eav_attribute`.`attribute_code`='Size') AND (entity_type_id = :entity_type_id);
    

    而且,如果您将表格整理不区分大小写(*_ci),则无论实际attribute_code为“大小”,它都会获得该值。您可以在官方文章SO上阅读有关整理的更多信息。

  4. 所以在第一个getAttributeText('Size')函数之后,每个连续的$product->getData('Size')都会返回正确的值。

现在回到你的脚本。除了size-Size问题之外,您还有一些小问题,但最好处理它们以便您更好地理解 Magento 和 php:

  1. 首先,load在循环中使用函数确实是一种不好的做法——尤其是连续两次,尤其是产品对象。如果您的可配置产品有很多简单点,您将获得不必要的内存和时间损失。最好将您需要的所有数据添加到您的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
    }
    
  2. 我想提到的第二个问题,因为您在.phtml模板文件中,所以您需要遵循 Magento 模板标准 - 为您的循环和案例使用关闭标签:

    <?php foreach($col as $simple_product):?>
        <li>
        <?php if ( $qty >= 1 ):?>
              <!-- some html -->
        <?php else:?>
              <!-- some html -->
        <?php endif:?>
        </li>
    <?php endforeach;?>
    
于 2012-10-22T12:21:03.077 回答
1

这将在版本中工作。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; ?>
于 2013-04-19T09:16:44.970 回答
0

您确定Size在第一个产品上设置了该属性吗?我已经使用shirt_size作为我的属性测试了您的代码,并且我的结果按预期返回。

于 2012-10-21T13:17:38.057 回答