Цикл продукта, дающий неправильные изображения
Я просматриваю продукты и получаю ошибку с изображениями продуктов.
Код, с которым я работаю, приведен ниже:
<?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; ?>
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);