Produktschleife mit falschen Bildern


7

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; ?>

4
Sie sollen nicht werden load()in einer Schleife ing! Holen Sie sich die Sammlung, um die Attributinformationen zu laden, die Sie benötigen.
Benmarks

Antworten:


9

Zunächst sollten Sie nicht loadin einer Schleife verwenden. Es ist ein wirklich großer Performance-Killer. Verwenden Sie ->addAttributeToSelect('small_image')und verwenden Sie danach das $productObjekt anstelle von $_productInCollection.
aber wenn Sie wirklich darauf bestehen, Verwendung zu loadverwenden, wenn wie folgt.

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

Wenn Sie dieselbe Variable $objzum 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, $objenthält die Variable weiterhin die Daten vom ersten Laden und beim Aufrufen werden loaddie 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.

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

Vielen Dank für Ihre hilfreiche Antwort und zusätzliche Hinweise. In der bearbeiteten Frage finden Sie den Code, den ich letztendlich verwendet habe. Würden Sie ->addAttributeToSelect('*')merkliche Leistungsprobleme verursachen, als jedes benötigte Attribut separat hinzuzufügen?
Sarah

@Sarah Wenn Sie alle Attribute hinzufügen, kann ein Leistungsproblem auftreten. Ich denke, es ist besser, nur die hinzuzufügen, die Sie brauchen, wenn es nicht so viele sind.
Marius
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.