Цикл продукта, дающий неправильные изображения


Я просматриваю продукты и получаю ошибку с изображениями продуктов.

Код, с которым я работаю, приведен ниже:

    <?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 версии 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; ?>
Author: Sarah, 2013-10-28

1 answers

Прежде всего, вы не должны использовать load в цикле. Это действительно большой убийца производительности. Используйте ->addAttributeToSelect('small_image') и после этого используйте объект $product вместо $_productInCollection.
но если вы действительно настаиваете на использовании load, используйте if следующим образом.

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

Если вы используете ту же переменную $obj для загрузки продуктов, вы получите проблемы, подобные вашим, потому что объекты передаются в качестве ссылки.
Поэтому, когда вы вызываете $obj->load() во второй раз, переменная $obj все еще содержит данные из первой загрузки и, и при вызове load данные, которые уже установлены, объединяются с новыми значениями из базы данных.
Итак... у продукта 4 нет изображения, но у $obj уже есть набор изображений из загрузки продукта 3. При объединении вы получаете изображение с продукта 3.
[ Редактировать]
И еще кое-что... немного не по теме. Если вы хотите, чтобы в коллекции было только 26 товаров, установите ограничение. Не загружайте полную коллекцию и просто остановитесь после 26 итераций. Опять же... большая проблема с производительностью.

$collection->setPage(1, 26);
//or
$collection-getSelect()->limit(26);
 9
Author: Marius, 2013-10-28 11:51:26