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

cigdeys3  于 2022-11-12  发布在  其他
关注(0)|答案(4)|浏览(145)

我正在尝试显示与可配置产品相关的简单产品的库存状态列表。除了在数组的第一个示例中没有显示相关的属性“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

有没有关于我错了什么以及如何显示第一个属性的建议?

nom7f22z

nom7f22z1#

解决您的问题比了解问题的原因要容易得多!但让我按正确的顺序来解决它:
1.首先,addAttributeToSelectgetAttributeText实际上都使用attribute_code,而不是attribute_value(我相信您使用的是size,而不是Size)。
1.因此,Magento第一次在getAttributeText中执行$product->getData('Size')时,它返回null
1.当你将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);

如果你有collate作为 * case-sensitive _ci),那么不管实际的attribute_code是“size”,它都会得到这个值。你可以在official articleSO上阅读更多关于collate的内容。
1.所以在第一个getAttributeText('Size')函数之后每一个连续的$product->getData('Size')都会返回正确的值。
现在回到你的脚本。除了size-Size问题,你还有一些小问题,但是处理它们会很好,让你更好地理解Magento和php:
1.首先,在循环中使用load函数是一个很糟糕的习惯--尤其是连续两次,尤其是对于product对象。如果你的可配置产品有很多简单的例子,你会得到不必要的内存和时间损失。最好是把你需要的所有数据都添加到你的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
}

1.第二个问题,我想提到,因为你在.phtml模板文件,它要求从你遵循Magento模板标准-为你的循环和情况使用关闭标记:

<?php foreach($col as $simple_product):?>
    <li>
    <?php if ( $qty >= 1 ):?>
          <!-- some html -->
    <?php else:?>
          <!-- some html -->
    <?php endif:?>
    </li>
<?php endforeach;?>
qf9go6mv

qf9go6mv2#

这将在ver. www.example.com中工作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; ?>
ix0qys7i

ix0qys7i3#

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

qoefvg9y

qoefvg9y4#

我想显示条码属性值,如何显示条码值?谢谢您的帮助。

<?
$childProducts = Mage::getModel('catalog/product_type_configurable')
                 ->getUsedProducts(null,$product);
$stock_count=0;
$sizeqty="";
foreach($childProducts as $child){
 if($child->getAttributeText('ust_beden_no')!=""){   
 $sizeqty.="<Stok><isim>Beden</isim><Beden>".$child->getAttributeText('ust_beden_no')."</Beden><Miktar>".
(int)Mage::getModel('cataloginventory/stock_item')->loadByProduct($child)->getQty()."

</Miktar></Stok>";

}
}
 return $sizeqty;
?>

相关问题