不正な画像を与える製品ループ


7

商品をループ処理していて、商品の画像でエラーが発生します。

私が使用しているコードは以下の通りです:

    <?php    
    $collection = Mage::getModel('catalog/product')->getCollection();
    $collection->addAttributeToFilter('status', 1); // 1=Enabled, 2=Disabled
    $obj = Mage::getModel('catalog/product');
    ?>
    <?php $productCounter=1; ?>
        <?php foreach ($collection as $product): ?>

            <?php $_productInCollection = $obj->load($product->entity_id); ?>

            <li class="item text-center">
                <a class="product-image" title="<?php echo $_productInCollection->getName(); ?>" href="<?php echo $_productInCollection->getProductUrl(); ?>">
                    <img src="<?php  echo $this->helper('catalog/image')->init($_productInCollection, 'small_image')->resize(null, 152)->keepFrame(false); ?>" height="152" alt="<?php echo $this->stripTags($this->getImageLabel($_productInCollection, 'small_image'), null, true) ?>" />
                 </a>
            </li>

            <?php if ($productCounter >=26) : ?>
                    <?php break; ?>
            <?php endif; ?>
            <?php $productCounter ++; ?>
        <?php endforeach; ?>

名前などの属性はうまく機能していますが、商品画像で奇妙なエラーが発生しています。使用している製品の約75%に画像がないため、デフォルトのプレースホルダー画像が表示されますが、奇妙なパターンが表示されます。

PRODUCT 1 -> has no image in admin panel -> SHOWS PLACEHOLDER (correct)
PRODUCT 2 -> has no image in ap -> SHOWS PLACEHOLDER (correct)
PRODUCT 3 -> has an image in ap -> SHOWS PRODUCT 3 IMAGE (correct)
PRODUCT 4 -> has no image in ap -> SHOWS PRODUCT 3 IMAGE (wrong, should show placeholder)
PRODUCT 5 -> has no image in ap -> SHOWS PRODUCT 3 IMAGE (wrong, should show placeholder)
PRODUCT 6 -> has no image in ap -> SHOWS PRODUCT 3 IMAGE (wrong, should show placeholder)
PRODUCT 7 -> has an image in ap -> SHOWS PRODUCT 7 IMAGE (correct)
PRODUCT 8 -> has no image in ap -> SHOWS PRODUCT 7 IMAGE (wrong, should show placeholder)
PRODUCT 9 -> has no image in ap -> SHOWS PRODUCT 7 IMAGE (wrong, should show placeholder)
PRODUCT 10 -> has an image in ap -> SHOWS PRODUCT 10 IMAGE (correct)

画像のある商品がループに表示されるとすぐに、その商品は正常に表示されますが、ループの次の商品に画像がない場合は、プレースホルダーではなく前の商品の画像が表示されます。私も試してみましたgetImageUrl()が、同じパターンが発生します。

キャッシングの問題なのか、それとも画像が毎回正しくリセットされないのでしょうか。どんな助けでも大歓迎です、ありがとう!

Magento ver。を使用しています。1.7.0.2。

編集-解決済み:以下のマリウスのおかげで、これは私が使用しているコードです。

<?php    
    $collection = Mage::getModel('catalog/product')->getCollection();
    $collection->addAttributeToSelect('*');
    $collection->addAttributeToFilter('status', 1);
            // 1=Enabled, 2=Disabled
    $collection->getSelect()->limit(25);
    $productBlock=$this->getLayout()->createBlock("catalog/product");       
    ?>

    <?php $productCounter = 1; ?>

        <?php foreach ($collection as $product): ?>

            <?php if (($productCounter + 4) % 5 == 0) : ?>
               <ul class="products-grid">
            <?php endif; ?>

                     <li class="item text-center">
                                 <h3><?php echo $product->getName(); ?></h3>
                                 <img src="<?php  echo $this->helper('catalog/image')->init($product, 'small_image')->resize(null, 152)->keepFrame(false); ?>" height="152" alt="<?php echo $this->stripTags($this->getImageLabel($product, 'small_image'), null, true) ?>" />

                                 <?php echo $productBlock->getPriceHtml($product,true); ?>

                                 <a href="<?php echo $product->getProductUrl() ?>" title="<?php echo $product->getName(); ?>" class="more-info">
                                    More info
                                 </a>

                       </li>


            <?php if ($productCounter % 5 == 0 || $productCounter == $collection.length) : ?>
               </ul>
            <?php endif; ?>


        <?php endforeach; ?>

4
あなたはすべきではないことがload()ループにINGの!コレクションを取得して、必要な属性情報をロードします。
ベンマークス2013年

回答:


9

まず最初loadに、ループで使用してはいけません。それは本当に大きなパフォーマンスキラーです。->addAttributeToSelect('small_image')以降では$productなくオブジェクトを使用してください$_productInCollection
しかし、もしあなたが本当にload次のような場合に使用を主張するなら。

$_productInCollection = Mage::getModel('catalog/product')->load($product->entity_id);

$obj製品をロードするために同じ変数を使用すると、オブジェクトが参照として渡されるため、同様の問題が発生します。
したがって$obj->load()、2回目に呼び出すと、変数に$objは最初のロードからのデータがまだ含まれており、呼び出し時にload、すでに設定されているデータがデータベースからの新しい値とマージされます。
だから... ...製品4は、イメージを持っていますが、$ OBJはありません、すでにあなたが製品3から画像を取得するマージオンロード製品3からの画像が設定されている
[編集]
そして、他の事...トピックオフビット。26個の製品のみが必要な場合は、コレクションに制限を設定します。完全なコレクションをロードせず、26回の反復後に停止します。繰り返しますが、パフォーマンスの大きな問題です。

$collection->setPage(1, 26);
//or
$collection-getSelect()->limit(26);

役立つ回答と追加のポインタをありがとうございました。最終的に使用したコードについては、編集した質問を参照してください。だろう->addAttributeToSelect('*')、私は別に必要と各属性を追加するよりも顕著なパフォーマンスの問題を作成しますか?
サラ

@Sarahすべての属性を追加すると、パフォーマンスの問題が発生する可能性があります。それほど多くない場合は、必要なものを追加するだけの方が良いと思います。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.