【问题标题】:Attributes and Inventory for child products of configurable可配置子产品的属性和库存
【发布时间】:2012-10-11 09:06:40
【问题描述】:

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

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

关于我的错误以及如何显示第一个属性的任何指针?

【问题讨论】:

    标签: magento


    【解决方案1】:

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

    【讨论】:

    • 您好,感谢您花时间检查代码。是的,'Size' 属性是绝对设置的,它是强制性的,它是唯一可配置的属性。令人讨厌的是,“尺寸”下拉列表中确实缺少属性,在本例中为尺寸 9.5,所以我真的不知道发生了什么。
    • 如果产品基于导入或使用批量操作更新,请尝试在产品管理中打开该产品并重新保存。有时价值观往往不会保持不变。
    【解决方案2】:

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

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

    2. 所以 Magento 第一次在 getAttributeText 中执行 $product-&gt;getData('Size') 时,它会返回 null

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

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

      如果您的表格 collat​​e不区分大小写 (*_ci),则无论实际的 attribute_code 是“大小”,它都会获得该值.您可以在official articleSO 上阅读有关整理的更多信息。

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

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

    1. 首先,在循环中使用load 函数确实是一种不好的做法——尤其是连续两次,尤其是产品对象。如果您的可配置产品有很多简单点,您将获得不必要的内存和时间损失。最好将您需要的所有数据添加到您的collection,然后在循环中使用加载的产品。顺便说一句,您已经使用 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
      }
      
    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;?>
      

    【讨论】:

    • 感谢您抽出宝贵时间回答问题并进行解释,非常感谢。
    • 感谢您提到循环在模板文件中应使用此语法。我打开了太多其他开发人员没有这样做的模板文件,并且完全没有标签/未格式化代码。看到这让我想踩婴儿。
    【解决方案3】:

    这将在版本中工作。 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; ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多