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

标签 magento

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

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

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

最佳答案

解决您的问题比了解导致问题的原因容易得多!但让我以正确的顺序来解决这个问题:

  1. 首先,addAttributeToSelectgetAttributeText 实际上都是使用 attribute_code 进行操作,而不是 attribute_value (我相信你有尺寸,而不是尺寸)。

  2. 因此,Magento 第一次在 getAttributeText 内执行 $product->getData('Size') 时,它返回 null .

  3. 当您将 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 .

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

现在返回到您的脚本。除了 size-Size 问题之外,您还遇到了一些小问题,但是处理这些问题对于您更好地理解 Magento 和 php 来说会很棒:

  1. 首先,在循环内使用 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
    }
    
  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;?>
    

关于magento - 可配置子产品的属性和库存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12996469/

相关文章:

Magento - 使用 IP 地址按国家/地区划分的产品

php - 单击导航栏中的类别直接转到产品详细信息页面

Magento 自定义选项 - 检查每个第一个单选按钮

.htaccess - Magento .htaccess

magento - 创建后更新 Magento 产品属性的数据库字段类型

sql - mysqldump 不创建表,然后尝试锁定/更改不存在的表

magento - 禁用特定 block 的整页缓存

magento - 从magento中的销售订单和销售订单项目获取数据

php - EcomDev Phpunit 测试在执行期间调用了两次

Magento 每个商店 View 有不同的交易电子邮件