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. SizegetAttributeText関数に渡すと、特定の属性インスタンスのサイズコードがSizeに置き換えられます。それはどのように起こっていますか?非常に単純です。メソッド チェーンの最深層で、Magento は DB に次のリクエストを行います。

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

    また、大文字と小文字を区別しない(*_ci)としてテーブルを照合すると、実際のサイズが「サイズ」であっても値が取得されます。collat​​e の詳細については、公式記事SOを参照してください。attribute_code

  4. したがって、最初のgetAttributeText('Size')関数の後、連続$product->getData('Size')するたびに正しい値が返されます。

スクリプトに戻ります。size-Size の問題以外にもいくつかの小さな問題がありますが、Magento と php について一般的に理解を深めるために、これらの問題に対処することをお勧めします。

  1. まず第一にload、ループ内で関数を使用することは本当に悪い習慣です。特に、製品オブジェクトでは特に 2 回連続して使用します。構成可能な製品に多くの単純なものがある場合、不要なメモリと時間の損失が発生します。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. そして、私が言及したい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

これは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; ?>
于 2013-04-19T09:16:44.970 に答える
0

Size最初の商品に属性が設定されていますか? shirt_sizeas my attributeを使用してコードをテストしたところ、期待どおりに結果が返されました。

于 2012-10-21T13:17:38.057 に答える