製品アイテムの属性に基づくカテゴリの並べ替え
-
16-10-2019 - |
質問
私のプロジェクトでは、デフォルトでは、以下に示すようにFrontendに表示されるいくつかのカテゴリがあります。
category-1
sub-category-1
sub-category-2
category-2
sub-category-1
category-3
category-4
category-5
上記のカテゴリは、属性値に基づいてソートする必要があります item_branch
それぞれに割り当てられます 製品 (カテゴリやサブカテゴリではありません)。この属性には、次の値があります。
- バツ
- y
- z
したがって、ソートされた製品リストは次のようになります。多くの関係者から多くの関係)
X
category-1
sub-category-2
category-2
sub-category-1
category-3
Y
category-1
sub-category-1
sub-category-2
Z
category-2
sub-category-1
category-3
category-4
category-5
上記の並べ替えを達成するために、私は心に2つのアプローチがあります。
最初の1つは、管理パネル(x、y、zなどの値が可能)にドロップダウン属性を作成し、属性セットのグループに割り当てることです。
2番目は、新しいカタログを追加することです
item_branch
カテゴリ付きX
,Y
とZ
また、製品を作成している間、両方のカテゴリを割り当てます。すなわちcategory-1
とY
(例えば).
上記のアプローチでは、どれが良いですか?それとも、もっと良いアプローチはありますか?
PHPコードで説明してください。私はPHPに慣れていないので。
解決
わかりました、私は私の解決策を説明しようとします、私はここで最も重要なポイントを挙げますが、あなたはMagentoレイアウト、ブロック、カスタムモジュールの作成などのいくつかの経験をする必要があります。
1.質問で想定した属性を作成します。
2.上記で作成された特定のカテゴリと属性値に接続する製品を構成します。
3.例で与えられたカスタムブロックを作成します(/app/code/local/Some/Module/Block/Catalog/Navigation.php
):
class Some_Module_Block_Catalog_Navigation extends Mage_Core_Block_Template
{
protected $_attributeCode = 'item_branch';
/**
* @return Mage_Catalog_Model_Resource_Eav_Attribute
*/
public function getAttribute()
{
$attribute = Mage::getModel('catalog/resource_eav_attribute')
->loadByCode(Mage_Catalog_Model_Product::ENTITY, $this->_attributeCode);
return $attribute;
}
protected function _construct()
{
$this->addData(array(
'cache_lifetime' => false,
'cache_tags' => array(Mage_Catalog_Model_Category::CACHE_TAG),
));
}
public function getCacheKeyInfo()
{
$shortCacheId = array(
'CATALOG_NAVIGATION',
Mage::app()->getStore()->getId(),
Mage::getDesign()->getPackageName(),
Mage::getDesign()->getTheme('template'),
'template' => $this->getTemplate(),
'name' => $this->getNameInLayout(),
$this->_attributeCode
);
return $shortCacheId;
}
public function getCategoryUrl($category)
{
if ($category instanceof Mage_Catalog_Model_Category) {
$url = $category->getUrl();
} else {
$url = $this->_getCategoryInstance()
->setData($category->getData())
->getUrl();
}
return $url;
}
public function getTree()
{
$attributeId = $this->getAttribute()->getId();
$websiteId = Mage::app()->getWebsite()->getId();
$resource = new Mage_Catalog_Model_Resource_Setup('core_setup');
$categories = Mage::getModel('catalog/category')->getCollection();
$categories
->addFieldToSelect(array('category_id' => 'entity_id', 'parent_id'))
->getSelect()
->join(array('cp' => $resource->getTable('catalog_category_product')), 'cp.category_id=main_table.entity_id', 'product_id')
->join(array('pw' => $resource->getTable('catalog_product_website')), "pw.product_id=cp.product_id AND pw.website_id = $websiteId", 'website_id')
->join(array('av' => $resource->getTable('catalog_product_entity_int')), "av.entity_id=pw.product_id AND av.attribute_id = $attributeId", array('option_id' => 'value'))
->join(array('ov' => $resource->getTable('eav_attribute_option_value')), 'ov.option_id=av.`value` AND ov.store_id = 0', array('option_value' => 'value'))
->order(array('option_value', 'category_id'));
$query = $categories->getSelectSql(true);
$data = $resource->getConnection()->fetchAll($query);
$tree = array();
foreach ($data as $row) {
$optionValue = $row['option_value'];
if (!isset($tree[$optionValue])) {
$tree[$optionValue] = array(
'label' => $optionValue,
'categories' => array()
);
}
$parentCategory = $row['parent_id'];
if (!isset($tree[$optionValue]['categories'][$parentCategory])) {
$tree[$optionValue]['categories'][$parentCategory] = array(
'category_id' => $parentCategory,
'sub_categories' => array(),
);
}
$categoryId = $row['category_id'];
$tree[$optionValue]['categories'][$parentCategory]['sub_categories'][$categoryId] = $categoryId;
}
return $tree;
}
}
このブロックを作成して、このナビゲーションを構築するためにカスタムカテゴリナビゲーションのキャッシュを実現しました。DBから追加のデータをロードする必要があります。ただし、ブロックを使用せずに上記のコードでツリービルドロジックを使用できます。
4. local.xmlレイアウトを使用して、フロントエンドにこのナビゲーションを追加します(/app/design/frontend/default/default/layout/local.xml
):
<?xml version="1.0"?>
<layout version="0.1.0">
<catalog_category_default translate="label">
<reference name="left">
<block type="some_module/catalog_navigation" name="catalog.leftnav" before="currency"
template="catalog/navigation/myleft.phtml"/>
</reference>
</catalog_category_default>
<catalog_category_layered translate="label">
<reference name="left">
<block type="some_module/catalog_navigation" name="catalog.myleft"
template="catalog/navigation/myleft.phtml"/>
</reference>
</catalog_category_layered>
</layout>
5.ナビゲーションブロックテンプレートを作成します(/app/design/frontend/default/default/template/catalog/navigation/myleft.phtml
):
<?php /* @var $this Some_Module_Block_Catalog_Navigation */ ?>
<?php $tree = $this->getTree(); ?>
<?php $categories = Mage::getModel('catalog/category')->getCollection()->addAttributeToSelect('name'); ?>
<?php $_count = count($tree) ?>
<?php if ($_count): ?>
<div class="block block-layered-nav">
<div class="block-title">
<strong><span><?php echo $this->__('Browse By ') . $this->getAttribute()->getFrontendLabel() ?></span></strong>
</div>
<div class="block-content">
<?php foreach ($tree as $label => $optionCategory): ?>
<div>
<h5><?php echo $label ?></h5>
<ul>
<?php foreach ($optionCategory['categories'] as $parent): ?>
<?php $_category = $categories->getItemById($parent['category_id']) ?>
<li>
<a href="<?php echo $this->getCategoryUrl($_category) ?>"><?php echo $this->htmlEscape($_category->getName()) ?></a>
<ul>
<?php foreach ($parent['sub_categories'] as $categoryId): ?>
<?php $_category = $categories->getItemById($categoryId) ?>
<li>
--<a href="<?php echo $this->getCategoryUrl($_category) ?>"><?php echo $this->htmlEscape($_category->getName()) ?></a>
</li>
<?php endforeach ?>
</ul>
</li>
<?php endforeach ?>
</ul>
</div>
<?php endforeach; ?>
</div>
</div>
<?php endif; ?>
6.このメニューの設計を修正して、必要に応じてCSSクラスとルールを追加できます。
ちなみに、属性タイプを選択する必要があります。ロジックを理解してストアに調整してみてください。これは完璧な結果をもたらします。コードを理解して調整せずにコピー/ペーストで機能しないかもしれません。私の結果を参照してください:
PS:たぶん、このソリューションには、私が感じなかったいくつかのバグや問題があり、コメントが高く評価されます。