Vòng lặp sản phẩm cho hình ảnh không chính xác


7

Tôi đang lặp qua các sản phẩm và gặp lỗi với hình ảnh sản phẩm.

Mã tôi đang làm việc với bên dưới:

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

Các thuộc tính như tên đang được xử lý tốt nhưng tôi đang gặp một lỗi lạ với hình ảnh sản phẩm. Khoảng 75% sản phẩm tôi đang làm việc không có hình ảnh nên sẽ hiển thị hình ảnh giữ chỗ mặc định, nhưng tôi đang nhận được một mẫu lạ:

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)

Ngay khi một sản phẩm có hình ảnh xuất hiện trong vòng lặp, sản phẩm đó sẽ xuất hiện tốt, nhưng nếu sản phẩm tiếp theo trong vòng lặp không có hình ảnh, nó sẽ hiển thị hình ảnh sản phẩm trước đó thay vì giữ chỗ. Tôi đã thử nó với getImageUrl()quá và mô hình tương tự xảy ra.

Tôi tự hỏi nếu nó là một vấn đề bộ nhớ đệm hoặc chỉ là hình ảnh không được thiết lập lại mỗi lần? Bất kỳ trợ giúp sẽ được đánh giá rất nhiều, cảm ơn bạn!

Tôi đang sử dụng Magento ver. 1.7.0.2.

EDITED - GIẢI QUYẾT: Nhờ Marius bên dưới, đây là mã tôi đang sử dụng.

<?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
Bạn không nên load()ing trong một vòng lặp! Nhận bộ sưu tập để tải thông tin thuộc tính mà bạn cần.
đánh dấu

Câu trả lời:


9

Trước hết bạn không nên sử dụng loadtrong một vòng lặp. Đó là một kẻ giết người hiệu suất thực sự lớn. Sử dụng ->addAttributeToSelect('small_image')và sau đó sử dụng các $productđối tượng thay vì $_productInCollection.
nhưng nếu bạn thực sự nhấn mạnh vào việc loadsử dụng nếu như sau.

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

nếu bạn sử dụng cùng một biến $objđể tải sản phẩm, bạn sẽ gặp sự cố như của bạn, vì các đối tượng được truyền dưới dạng tham chiếu.
Vì vậy, khi bạn gọi $obj->load()lần thứ hai, biến $objvẫn chứa dữ liệu từ lần tải đầu tiên và khi gọi loaddữ liệu đã được đặt sẽ được hợp nhất với các giá trị mới từ cơ sở dữ liệu.
Vì vậy, ... sản phẩm 4 không có hình ảnh, nhưng $ obj đã có bộ hình ảnh từ khi tải sản phẩm 3. Khi hợp nhất, bạn nhận được hình ảnh từ sản phẩm 3.
[Chỉnh sửa]
Và một điều khác ... hơi lạc đề. Nếu bạn chỉ muốn 26 sản phẩm đặt giới hạn cho bộ sưu tập. Không tải bộ sưu tập đầy đủ và chỉ dừng lại sau 26 lần lặp. Một lần nữa ... vấn đề hiệu suất lớn.

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

Cảm ơn bạn rất nhiều vì câu trả lời hữu ích của bạn và con trỏ thêm. Xin vui lòng xem câu hỏi được chỉnh sửa cho mã tôi đã kết thúc bằng cách sử dụng. Sẽ ->addAttributeToSelect('*')tạo ra bất kỳ vấn đề hiệu suất đáng chú ý nào ngoài việc thêm từng thuộc tính tôi cần riêng biệt?
Sarah

@Sarah Nếu bạn thêm tất cả các thuộc tính bạn có thể có vấn đề về hiệu suất. Tôi nghĩ sẽ tốt hơn nếu chỉ thêm những thứ bạn cần nếu chúng không nhiều.
Marius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.