Ich durchlaufe Produkte und erhalte eine Fehlermeldung mit Produktbildern.
Der Code, mit dem ich arbeite, ist unten:
<?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; ?>
Attribute wie der Name werden gut angezeigt, aber bei Produktbildern wird ein seltsamer Fehler angezeigt. Ungefähr 75% der Produkte, mit denen ich arbeite, haben keine Bilder, daher sollte das Standard-Platzhalterbild angezeigt werden, aber ich erhalte ein seltsames Muster:
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)
Sobald ein Produkt mit einem Bild in der Schleife angezeigt wird, wird dieses Produkt in Ordnung angezeigt. Wenn das nächste Produkt in der Schleife jedoch kein Bild enthält, wird das vorherige Produktbild und nicht der Platzhalter angezeigt. Ich habe es auch mit versucht getImageUrl()
und das gleiche Muster tritt auf.
Ich frage mich, ob es sich um ein Caching-Problem handelt oder ob das Bild nicht jedes Mal richtig zurückgesetzt wird. Jede Hilfe wäre sehr dankbar, danke!
Ich benutze Magento ver. 1.7.0.2.
BEARBEITET - GELÖST: Dank Marius unten ist dies der Code, den ich verwende.
<?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; ?>
load()
in einer Schleife ing! Holen Sie sich die Sammlung, um die Attributinformationen zu laden, die Sie benötigen.Antworten:
Zunächst sollten Sie nicht
load
in einer Schleife verwenden. Es ist ein wirklich großer Performance-Killer. Verwenden Sie->addAttributeToSelect('small_image')
und verwenden Sie danach das$product
Objekt anstelle von$_productInCollection
.aber wenn Sie wirklich darauf bestehen, Verwendung zu
load
verwenden, wenn wie folgt.Wenn Sie dieselbe Variable
$obj
zum Laden von Produkten verwenden, treten Probleme wie bei Ihnen auf, da die Objekte als Referenz übergeben werden.Wenn Sie also
$obj->load()
das zweite Mal aufrufen,$obj
enthält die Variable weiterhin die Daten vom ersten Laden und beim Aufrufen werdenload
die bereits festgelegten Daten mit den neuen Werten aus der Datenbank zusammengeführt.Also ... Produkt 4 hat kein Bild, aber $ obj hat bereits ein Bildset vom Laden von Produkt 3. Beim Zusammenführen erhalten Sie das Bild von Produkt 3.
[Bearbeiten]
Und noch etwas ... ein bisschen vom Thema ab. Wenn Sie nur 26 Produkte möchten, legen Sie ein Limit für die Sammlung fest. Laden Sie nicht die gesamte Sammlung und stoppen Sie einfach nach 26 Iterationen. Wieder ... großes Leistungsproblem.
quelle
->addAttributeToSelect('*')
merkliche Leistungsprobleme verursachen, als jedes benötigte Attribut separat hinzuzufügen?