カスタム カテゴリ属性を作成しました。ここで、Topmenu.php の _getHtml() 関数でその値にアクセスする必要があります。
誰でもこれを行う方法を教えてもらえますか?:)
どんな助けでも大歓迎です:)
カスタム カテゴリ属性を作成しました。ここで、Topmenu.php の _getHtml() 関数でその値にアクセスする必要があります。
誰でもこれを行う方法を教えてもらえますか?:)
どんな助けでも大歓迎です:)
アンドリューの答えは、私が通常行う方法です。ただし、カスタム属性を追加する場合、およびカテゴリフラットテーブルを有効にしているかどうかに関係なくストアを機能させる場合は、コードに次のものが追加されていることを確認する必要があることに注意してください。
モジュールのconfig.xml
:
...
<frontend>
<category>
<collection>
<attributes>
<my_attribute /><!-- your attribute code here -->
</attributes>
</collection>
</category>
</frontend>
...
これにより、デフォルトのカテゴリコレクションがで作成されたときに属性が確実に読み込まれますMage_Catalog_Model_Resource_Category_Tree::_getDefaultCollection()
。これは、ストアがカテゴリフラットテーブルを使用しないように設定されている場合にうまく機能します。フラットテーブルを使用する場合は、に属性を追加する必要もありますMage_Catalog_Model_Resource_Category_Flat::_loadNodes
。選択が作成される以下のコードを見つけて、そこに属性コードを追加します。
$select = $_conn->select()
->from(
array('main_table' => $this->getMainStoreTable($storeId)),
array('entity_id',
new Zend_Db_Expr('main_table.' . $_conn->quoteIdentifier('name')),
new Zend_Db_Expr('main_table.' . $_conn->quoteIdentifier('path')),
'is_active',
'is_anchor',
'my_attribute')) /* add your attribute code here */
その後、属性がオブザーバーに表示されます。言うまでもなく、上書きを使用して実行し、コアコードを変更しないでください。
何らかの変更を加えない限り、TopMenu ブロック内でそのようなデータを取得することはできません。
ナビゲーションは、カテゴリが何であるかという概念を持たない一般的なツリー構造を使用して構築されますが、これはカテゴリを使用して別の場所で構築されます。
Topmenu.php の中を見ると、ナビゲーションが構築されている場所がわかります。
Mage::dispatchEvent('page_block_html_topmenu_gethtml_before', array(
'menu' => $this->_menu
));
これにより、オブザーバーがアタッチされたイベントが発生し、ナビゲーション項目が作成されます。これはたまたま次のようになります。
Model: Mage_Catalog_Model_Observer
Method: _addCategoriesToMenu()
その後、新しい属性を Node データに追加できます。これは、Topmenu.php 内で使用できるようになります。
例:
$categoryData = array(
'name' => $category->getName(),
'id' => $nodeId,
'url' => Mage::helper('catalog/category')->getCategoryUrl($category),
'is_active' => $this->_isActiveMenuCategory($category),
'my_attribute' => $category->getData('my_attribute') // Add our data in...
);
これを Topmenu::_getHtml() 内で使用できるはずです。
echo $child->getData('my_attribute');
Gabriel Queiroz Silvaの回答を完了するだけです:
Mage_Catalog_Model_Resource_Category_Flat::_loadNodes メソッドを編集またはオーバーライドする代わりに、observer を使用できます。
Mage::dispatchEvent('catalog_category_flat_loadnodes_before', array('select' => $select));