3

商品のランディング ページをカスタマイズして、同じカテゴリ内の他のすべての商品のスクロール可能なビューをすべて含めようとしています。私はほとんどそこにいますが、現在表示している製品が含まれているカテゴリだけでなく、すべてのカテゴリの製品を表示しています。以下は、私の製品 view.phtml に追加したコードです。スクロール可能なコンテナ。現在のカテゴリの製品のみを表示するように制限するのに役立つ人はいますか? 製品ページの 1 つのサンプルは、製品ビュー ページで表示できます。

バージョンはmagento 1.6.1です

私の製品ビューのカスタマイズはこちら

<div class="coll_container">
<!-- "previous page" action -->
<a class="prev browse left"></a>
<div id="collection" class="scrollable">


<?php                        
$cat_id = Mage::getModel('catalog/layer')->getCurrentCategory()->getId(); // set      current category id
$category = Mage::getModel('catalog/category')->load($cat_id);
$productCollection = Mage::getResourceModel('catalog/product_collection')
                         ->addCategoryFilter($category);

$products = $category->getProductCollection()->addCategoryFilter($category)->addAttributeToSelect('*');
?>

<ul>

<?php foreach ( $products as $_product ): ?>
<li class="item"><?php if($_product->isComposite() || !$_product->isSaleable()):   ?>     
<?php endif; ?>
      <a class="item-link" href="<?php echo $_product->getProductUrl() ?>"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'thumbnail')->keepAspectRatio(true)->keepFrame(false)->resize(150,225) ?>" alt="<?php echo $this->htmlEscape($_product->getName()) ?>" width="150" height="225" /></a>

     <div class="tooltip">
                    <span class="indicator"><!-- --></span>
                    <div class="tooltip-content">
                <a href="<?php echo $_product->getProductUrl() ?>"><?php echo   $this->htmlEscape($_product->getName()) ?></a>
            <!-- Price -->
       <p class="price"> <?php echo $this->getPriceHtml($_product, true) ?>    </p>        
        </div><!-- End Tooltip content -->
        </div><!-- End Tooltip -->
   </li>
<?php endforeach; ?> 
</ul>




</div><!-- End Collection -->
<!-- "next page" action -->
<a class="next browse right"></a>

</div><!-- End coll_container -->
4

1 に答える 1

3

$productCollectionコレクションを2 回取得するという冗長性に加えて(後者はループに使用されます) 、ランディング ページが次のように書き換えられていれ$productsば、コードは正しく機能し、コレクションには現在のカテゴリの製品のみが含まれます。

catalog/category/view/id/<id> OR
catalog/product/view/id/<id>/category/<id>

しかし、そうではありません。

catalog/product/view/id/<id>

これは、レジストリ キーが設定さMage_Catalog_Model_Layer::getCurrentCategory()れているかどうかに依存するためです。current_categoryが設定されていない場合、メソッドは現在のストアのルート カテゴリ ID を返します。これにより、すべてのカテゴリcurrent_categoryの製品が表示される理由が説明されます。

public function getCurrentCategory()
{
    $category = $this->getData('current_category');
    if (is_null($category)) {
        if ($category = Mage::registry('current_category')) {
            $this->setData('current_category', $category);
        }
        else {
            $category = Mage::getModel('catalog/category')->load($this->getCurrentStore()->getRootCategoryId());
            $this->setData('current_category', $category);
        }
    }

    return $category;
}

Magento OOB では、レジストリ キーcurrent_categoryは別の場所に設定されますが、この場合は次の 2 つだけが重要です。

Mage_Catalog_CategoryController::_initCatagory()*
Mage_Catalog_Helper_Product::initProduct()

前者は通常、

Mage_Catalog_CategoryController::viewAction()

後者はいくつかの場所で呼び出されます。

Mage_Catalog_ProductController::viewAction()

ただし、この場合のみ、次のcatalogようなパラメーターcatalog/<id>が渡された場合。

書き換え

問題を解決する 1 つの可能性は、次を使用するランディング ページの書き換えを追加することです。

catalog/product/view/id/1/category/3

スタイルtarget_pathS.

ほんの一握りの製品しかない場合は、管理者バックエンドの「URL 書き換え管理」を使用して手動でこれを行うことができます。

多くの製品がある場合は、プログラムで行うこともできます。

商品のカテゴリ ID を直接使用する

この問題を解決する別の方法として、表示中の製品から直接カテゴリ ID を取得し、それを使用してコレクションをフィルタリングする方法があります。

$aCategoryId = $this->getProduct()->getCategoryIds();
if (!$aCategoryId) {
    echo "This product is not assigned to any categories.";
}
$iCategoryId = $aCategoryId[0];
$oCategory = Mage::getModel('catalog/category')->load($iCategoryId);
$oProductCollection = $oCategory
    ->getProductCollection()
    ->addCategoryFilter($oCategory)
    ->addAttributeToSelect('*')
    ->addFieldToFilter('entity_id', array('neq' => $this->getProduct()->getId()));
foreach ($oProductCollection as $oProduct) {
    var_dump($oProduct->getName());
}

表示された製品自体をコレクションから除外するフィルターを追加したことに注意してください。


_initCatagory* これはタイプミスではなく、実際には a と書かれ_initCategoryています。少なくとも CE 1.6.2 ではそうではありません (他はまだチェックしていません)。

于 2012-08-16T22:30:07.137 に答える