可配置的子产品的属性和库存

时间:2012-10-21 09:09:27

标签: magento

我正在尝试显示与可配置产品相​​关的简单产品的库存状态列表。这是正常工作,除非在没有显示相关属性'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

有关我出错的指示以及如何显示第一个属性的任何指示?

3 个答案:

答案 0 :(得分:2)

解决问题比理解导致问题容易得多!但是,让我按正确的顺序解决它:

  1. 首先,addAttributeToSelectgetAttributeText实际上都使用attribute_code,而不是attribute_value(我认为你有尺寸,而不是大小)。

  2. 因此Magento第一次在$product->getData('Size')getAttributeText进行null,然后返回getAttributeText

  3. 当您将尺寸传递给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 articleSO上阅读有关整理的详情。

  4. 因此,在第一个$product->getData('Size')函数之后,每个连续load将返回正确的值。

  5. 现在返回你的脚本。除了 size-Size 问题之外,你还有一些小问题,但是为了更好地理解Magento和php,你可以很好地理解它们:

    1. 首先,在循环中使用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
    2. 第二个问题我想提一下,因为你在<?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作为我的属性测试了您的代码,我的结果按预期返回。