メインメニューの各カテゴリのドロップダウンリストにブランドのリストを追加しようとしています。これは「メガメニュー」と考えられると思います。
たとえば、メインカテゴリにカーソルを合わせると、ドロップダウンメニューにサブカテゴリだけでなく、このカテゴリ内のすべての異なるブランドも表示されます。
ブランドは2つの方法で設定されます。
すべての製品には「ブランド」という属性があります。したがって、カテゴリ内のすべての製品を取得して、このカテゴリ内の製品に関連付けられているすべてのブランドのリストを表示することができます。これには、そのメニューアイテムが選択されたときに、そのカテゴリとそのブランド属性のアイテムのフィルターが表示されるように、階層化されたナビゲーションを組み込む必要があります。
この方法の方が簡単だと思います。各ブランドにはすでに独自のカテゴリも作成されており、各製品はメインカテゴリと関連するブランドカテゴリの両方に含まれています。これは元々、すべてのブランドの大きなリストを表示できるようにするために行われました。ナビゲーションループ内のMagentoに、「他の選択されたカテゴリ」を取得する機能はありますか?たとえば、アイテムがカテゴリAにある場合、ドロップダウンリストにはすべてのサブカテゴリだけでなく、製品で選択されている他の関連するトップレベルのカテゴリも表示されます。
Navigation.php(magento 1.6)の変更を含むさまざまなソリューションを試しましたが、特定のカテゴリ内のブランドだけでなく、ショップ内のすべてのブランドを表示することしかできませんでした。以下のコードを参照してください。
// Navigation.php code
// render children
$htmlChildren = '';
$j = 0;
foreach ($activeChildren as $child) {
$htmlChildren .= $this->_renderCategoryMenuItemHtml(
$child,
($level + 1),
($j == $activeChildrenCount - 1),
($j == 0),
false,
$outermostItemClass,
$childrenWrapClass,
$noEventAttributes
);
$j++;
}
if (!empty($htmlChildren)) {
if ($childrenWrapClass) {
$html[] = '<div class="' . $childrenWrapClass . '">';
}
$html[] = '<ul class="level' . $level . '">';
$html[] = $htmlChildren;
// My modifications start here
$product = Mage::getModel('catalog/product');
$attributes = Mage::getResourceModel('eav/entity_attribute_collection')
->setEntityTypeFilter($product->getResource()->getTypeId())
->addFieldToFilter('attribute_code', 'brands');
$attribute = $attributes->getFirstItem()->setEntity($product->getResource());
$manufacturers = $attribute->getSource()->getAllOptions(false);
$html[] = '<ol id="nav-drop-brands">';
foreach ($manufacturers as $manufacturer) {
$html[] = '<li><a href="http://www.domain.com/catalogsearch/advanced/result?manufacturer[]=';
$html[] = $manufacturer['value'];
$html[] = '">';
$html[] = $manufacturer['label'];
$html[] = '</a></li>';
}
$html[] = '</ol>';
// end of my modifications
$html[] = '</ul>';
if ($childrenWrapClass) {
$html[] = '</div>';
}
}
$html[] = '</li>';
$html = implode("\n", $html);
return $html;
}