Saya tahu ini adalah pertanyaan lama dengan banyak jawaban, kebanyakan dari mereka menyarankan untuk mengedit template menu tetapi itu tidak berfungsi untuk saya. Tidak perlu menjelaskan mengapa, katakanlah saya sedikit OCD tentang melakukan sesuatu dengan cara yang "benar".
Pertanyaan ini dapat berfungsi sebagai bahan untuk orang lain yang membutuhkan. Ini dia.
Dimulai dengan Magento 1.7 menu atas dibangun menggunakan sebuah event: page_block_html_topmenu_gethtml_before
. Ini digunakan oleh Mage_Catalog
modul untuk menambahkan kategori. Saya ingin menggunakannya. Untuk ini, saya telah membuat pengamat dalam modul saya seperti ini:
<global>
<events>
<page_block_html_topmenu_gethtml_before>
<observers>
<my_observer>
<class>mymodule/observer</class>
<method>addItemsToTopmenuItems</method>
</my_observer>
</observers>
</page_block_html_topmenu_gethtml_before>
</events>
</global>
Di Observer.php
kelas saya miliki
public function addItemsToTopmenuItems($observer){
//get the menu object: //Type Varien_Data_Tree_Node
$menu = $observer->getMenu();
//get the tree object in the menu //type Varien_Data_Tree
$tree = $menu->getTree();
//get current page handler
$action = Mage::app()->getFrontController()->getAction()->getFullActionName();
$brandNodeId = 'category-node-brand';
//set the node id, label and url
$data = array(
'name' => Mage::helper('catalog')->__('Brands'),
'id' => $brandNodeId,
'url' => Mage::getUrl('brands'),
'is_active' => ($action == 'brands')
);
//create a node object
$brandNode = new Varien_Data_Tree_Node($data, 'id', $tree, $menu);
//add the node to the menu
$menu->addChild($brandNode);
return $this;
}
Pengamat saya memiliki beberapa kode lain yang menambahkan semua merek sebagai sub-item Brands
menu tetapi tidak perlu di sini.
Ini berfungsi dengan baik dan menambahkan menu Brands
sebagai item terakhir dalam menu.
Masalahnya adalah bahwa saya ingin ini sebagai menu pertama dan pengamat saya dipanggil setelah pengamat Mage_Catalog
yang menambahkan kategori. Karena tidak ada cara (bukan yang saya tahu) untuk mengurutkan urutan pengamat pada suatu acara ... Saya punya masalah
[EDIT]
Seperti yang disarankan @Benmark, saya membuatMage_Catalog
modul tergantung pada modul saya dan sekarang item menu saya adalah yang pertama dalam daftar. Tapi saya masih harus menambahkan menu antara kategori dan di akhir. Membuat modul baru mungkin akan menyelesaikan masalah dengan item di akhir menu, tapi saya masih punya masalah dengan yang ada di antara kategori,
[/ EDIT]
Jadi pada dasarnya pertanyaan saya dilanjutkan ke " (Bagaimana) saya bisa berkeliling anak node dari Varien_Data_Tree_Node
suatu Varien_Data_Tree
objek? "
Tolong jangan menyarankan menambahkan Brands
sebagai kategori pertama di pohon kategori. Ini bukan pilihan (seperti yang saya katakan ... OCD saya tentang hal-hal ini).
sumber
Jawaban:
Setelah berjuang sedikit di sini adalah solusi yang saya temukan. Saya membiarkan pengamat saya mengeksekusi setelah yang masuk
Mage_Catalog
dan memutuskan untuk membuat kembali menu sepenuhnya.Gagasan utamanya adalah untuk mendapatkan semua item menu yang ada menempatkannya dalam array sementara, menghapusnya dari menu kemudian menambahkan tautan saya di antara item yang ada dan pada akhirnya menambahkan semua item ke menu lagi. Sesuatu seperti ini:
Ini akan menyelesaikan masalah saya, tetapi saya berharap metode yang lebih elegan untuk melakukannya.
sumber
Ah, tapi ada! Dalam file deklarasi modul Anda, atur ketergantungan
Mage_Catalog
ke modul Anda, misalnya:Juga, Anda dapat (saya pikir) menyalin konfigurasi pengamat katalog ke
frontend
area acara dan menonaktifkannya diglobal
area tersebut. Asumsi saya adalah bahwaglobal
peristiwa diproses sebelumfrontend
peristiwa. (Saya tidak tahu mengapa acara ini dikonfigurasiglobal
sejak awal.)Dan tentu saja ada opsi lain yang dapat Anda efek melalui penulisan ulang dan PHP.
sumber
<global>
tag, saya menyatakanMage_Catalog
untuk bergantung pada modul saya (bahkan jika saya merasa sedikit 'kotor' melakukan itu) dan itu berhasil, tetapi saya berakhir dengan masalah lain. Saya perlu beberapa item menu lain yang ditempatkan di antara beberapa kategori dan di akhir menu jadi saya masih harus bisa memindahkannya ke sekeliling. Saya akan memperbarui pertanyaan.sumber