Magentoの特定のカテゴリの行ごとに新しい製品を表示するにはどうすればよいですか?
-
22-07-2019 - |
質問
タイトルが示すように、ホームページの行で区切られた特定のカテゴリから呼び出される新しい製品を表示したいです。
行1-<!> gt;カテゴリー1の新製品
行2-<!> gt;カテゴリー2の新製品
行3-<!> gt;カテゴリー3の新製品
... etc
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
基本的にI <!>#8217; new.phtml
を複製してnew_category_1.phtml
、new_category_2.phtml
などを呼び出して、<!>#8220; new <!>#8221;カテゴリID 1、カテゴリID 2の製品。それぞれ
Mage::getModel('catalog/category')->getCollection();
、getProductCollection
、およびgetCatId
で遊んだが、<!>#8217; tをnew.phml
(app/design/frontend/default/default/template/catalog/product/
)のコピーで動作させることはできません。
以下のコードは機能しますが、<!> quot; new <!> quot;をロードしません。割り当てられたカテゴリID内の割り当てられた製品は、その中のすべての製品を読み込みます。
<?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> </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('*');
製品<!> quot;新しさ<!> quot; news_from_dateとnews_to_dateの2つの属性によって決定されるため、フィルターに2つの追加属性を追加します。これを行う上記の特定のメソッド呼び出しは次のとおりです
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のコードを複製しないでフィルターを適用できる方法はありますか?私はそれ自体はコーダーではありませんが、中間ファイルがそれを処理すると想定しています。