كيف يمكنني عرض منتجات جديدة لكل صف من فئات محددة في Magento؟

StackOverflow https://stackoverflow.com/questions/1447205

سؤال

كما يوحي العنوان، أرغب في عرض المنتجات الجديدة التي تم استدعاؤها من فئات محددة مفصولة بصفوف في الصفحة الرئيسية.

الصف 1 -> منتجات جديدة من الفئة 1

الصف 2 -> منتجات جديدة من الفئة 2

الصف 3 -> منتجات جديدة من الفئة 3

...إلخ

في Magento Admin CMS، ضمن الصفحة الرئيسية، سيتم استدعاؤها ككتل منفصلة:

<block type="catalog/product_new" name="home.catalog.product.new_category_1" alias="product_new_category_1" template="catalog/product/new_category_1.phtml">

<block type="catalog/product_new" name="home.catalog.product.new_category_2" alias="product_new_category_2" template="catalog/product/new_category_2.phtml">

<block type="catalog/product_new" name="home.catalog.product.new_category_3" alias="product_new_category_3" template="catalog/product/new_category_3.phtml">

...etc

في الأساس أفكر في التكرار new.phtml والاتصال به new_category_1.phtml, new_category_2.phtml, وما إلى ذلك واحصل على منتجات "جديدة" من معرف الفئة 1 ومعرف الفئة 2 على التوالي.

لعبت مع Mage::getModel('catalog/category')->getCollection();, getProductCollection و getCatId ولا يمكن تشغيله في نسخة new.phml (app/design/frontend/default/default/template/catalog/product/).

يعمل الكود أدناه ولكنه لا يقوم بتحميل المنتجات المخصصة "الجديدة" ضمن معرف الفئة المعينة، بل يقوم بتحميل جميع المنتجات الموجودة بداخله.

<?php 

$cat_id = 46; // category id
$category = Mage::getModel('catalog/category')->load($cat_id);
$products = $category->getProductCollection()->addCategoryFilter($category)->addAttributeToSelect('*');

if (($products=($_products = $this->getProductCollection()) && $_products->getSize())): ?>

<div class="hp-report">
    <div class="head-alt">
        <h2 class="title"><?php echo $this->__('New Products') ?></h2>
    </div>
    <table cellspacing="0" class="generic-product-grid" id="new-products-list-table">
        <tr>
        <?php $i=0; foreach ($_products->getItems() as $_product): ?>
            <?php if ($i>=4): continue; endif; ?>

            <td>
                <p class="product-image">
                    <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->htmlEscape($_product->getName()) ?>"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(170) ?>" width="170" height="170" alt="<?php echo $this->htmlEscape($_product->getName()) ?>" /></a>
                </p>
                <p><a class="product-name" href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->htmlEscape($_product->getName()) ?>)"><?php echo $this->htmlEscape($_product->getName()) ?></a></p>
                <?php echo $this->getReviewsSummaryHtml($_product, 'short') ?>
                <?php echo $this->getPriceHtml($_product, true, '-new') ?>
                <?php if($_product->isSaleable()): ?>
                    <a href="<?php echo $this->getAddToCartUrl($_product) ?>"><img src="<?php echo $this->getSkinUrl('images/btn_add_to_cart.gif') ?>" alt="<?php echo $this->__('Add to Cart') ?>" title="<?php echo $this->__('Add to Cart') ?>" /></a>
                <?php else: ?>
                <div class="out-of-stock"><?php echo $this->__('Out of stock') ?></div>
                <?php endif; ?>
                <div class="clear"></div>
                <ul class="add-to">
                    <?php if ($this->helper('wishlist')->isAllow()) : ?>
                        <li><a href="<?php echo $this->getAddToWishlistUrl($_product) ?>" class="link-cart"><?php echo $this->__('Add to Wishlist') ?></a></li>
                    <?php endif; ?>
                    <?php if($_compareUrl=$this->getAddToCompareUrl($_product)): ?>
                        <li><a href="<?php echo $_compareUrl ?>"><?php echo $this->__('Add to Compare') ?></a></li>
                    <?php endif; ?>
                </ul>
                </td>
        <?php $i++; endforeach; ?>
        <?php for($i;$i%4!=0;$i++): ?>
                <td>&nbsp;</td>
            <?php endfor ?>
            </tr>
    </table>
    <script type="text/javascript">decorateTable('new-products-list-table');</script>
</div>

<?php endif; ?>

أي أفكار موضع تقدير.

هل كانت مفيدة؟

المحلول

يجب أن يمنحك استعلام المجموعة التالي ما تريد

$todayDate  = Mage::app()->getLocale()->date()->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);            
$products = $category->
getProductCollection()->
addCategoryFilter($category)->
addAttributeToFilter('news_from_date', array('date' => true, 'to' => $todayDate))->
addAttributeToFilter('news_to_date', array('or'=> array(
    0 => array('date' => true, 'from' => $todayDate),
    1 => array('is' => new Zend_Db_Expr('null')))
), 'left')->            
addAttributeToSelect('*');

يتم تحديد "حداثة" المنتج من خلال سمتين، news_from_date وnews_to_date، لذلك تريد إضافة سمتين إضافيتين إلى عامل التصفية.استدعاءات الطريقة المحددة من الأعلى التي تفعل ذلك هي

addAttributeToFilter('news_from_date', array('date' => true, 'to' => $todayDate))->
addAttributeToFilter('news_to_date', array('or'=> array(
    0 => array('date' => true, 'from' => $todayDate),
    1 => array('is' => new Zend_Db_Expr('null')))
), 'left')->            

لقد تم أخذها مباشرة من كتلة المنتج الجديد في

/app/code/core/Mage/Catalog/Block/Product/New.php

نصائح أخرى

ومليون شكر ألان. التعليمات البرمجية لا تزال قائمة جميع المنتجات ضمن هذه الفئة المعينة، ولكن تغيير طفيف ثابتة عليه. وهنا رمز النهائي لأي شخص قد تكون مهتمة.

$_products = $category->
getProductCollection()->
addCategoryFilter($category)->
addAttributeToFilter('news_from_date', array('date' => true, 'to' => $todayDate))->
addAttributeToFilter('news_to_date', array('or'=> array(
        0 => array('date' => true, 'from' => $todayDate),
        1 => array('is' => new Zend_Db_Expr('null')))
), 'left')->            
addAttributeToSelect('*');

if (($this->getProductCollection()) && $_products->getSize()): ?> 

هل هناك طريقة لعدم تكرار رمز من new.php وتكون قادرة على تطبيق المرشحات لا يزال؟ أنا لست المبرمج في حد ذاته، ولكن أفترض أن ملف سيط تراعي ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top