Menambahkan tautan ke menu kategori

20

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_Catalogmodul 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.phpkelas 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 Brandsmenu tetapi tidak perlu di sini.
Ini berfungsi dengan baik dan menambahkan menu Brandssebagai item terakhir dalam menu.
Masalahnya adalah bahwa saya ingin ini sebagai menu pertama dan pengamat saya dipanggil setelah pengamat Mage_Catalogyang 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_Catalogmodul 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_Nodesuatu Varien_Data_Treeobjek? "
Tolong jangan menyarankan menambahkan Brandssebagai kategori pertama di pohon kategori. Ini bukan pilihan (seperti yang saya katakan ... OCD saya tentang hal-hal ini).

Marius
sumber
Apakah ada alasan untuk tidak membuat kategori kosong dan hanya menampilkan blok CMS? - Saya menerima "ya" sebagai jawaban, hanya untuk memastikan, Anda memikirkan hal ini :)
Fabian Blechschmidt
1
@FabianBlechschmidt. "Ya". Tidak ada gunanya mendapatkan detail, tetapi ada alasan (beberapa dari mereka mungkin sangat bodoh). Saya tidak membuat "aturan" yang satu ini. Jadi harus dilakukan seperti ini.
Marius
@FabianBlechschmidt: Untuk menghapus beberapa "kabut" di sini adalah alasan yang bagus sehingga Anda tidak akan mengatakan saya keras kepala (bahkan jika saya). Tautan khusus (merek, baru, penjualan, dan lainnya) tidak di tempat yang sama untuk semua tampilan toko. Tetapi semua tampilan toko menggunakan kategori yang sama. Jadi saya tidak ingin membuat pohon yang berbeda untuk setiap tampilan toko. Dengan menggunakan pengamat, saya dapat membaca beberapa pengaturan konfigurasi dan mengatur item yang saya inginkan. Saya bahkan dapat menambahkan item menu tergantung pada id tampilan toko.
Marius
Juga tertarik, saya memiliki masalah yang sama, solusi saya adalah untuk menimpa Varien_Data_Tree_Node_Collection dan menambahkan di sini metode untuk mengurutkan node yang saya inginkan, tapi saya mencari cara yang lebih bersih.
Hebat

Jawaban:

10

Setelah berjuang sedikit di sini adalah solusi yang saya temukan. Saya membiarkan pengamat saya mengeksekusi setelah yang masuk Mage_Catalogdan 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:

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);
    //temporary array with nodes
    $menuItems = array();
    //my first menu item
    $menuItems[] = $brandNode;
    //loop through existing menu items, add them to the array and remove them from the    menu
    foreach ($menu->getChildren() as $child){
        //add the item to the temp array
        $menuItems[] = $child;
        //remove item from the menu
        $menu->removeChild($child);
        //I need to add a new menu item after the category with id 6
        //don't worry the id is not hard coded. it comes from a config setting
        //I just added 6 here to make it easier to read
        if ($child->getId() == 'category-node-6'){
            //create a new node as $brandNode called $newNode
            ...
            //add the node to my temp array
            $menuItems[] = $newNode;
        }
    }
    //add other nodes at the end of my temp array
    ...
    //recreate the menu in the order I need
    foreach ($menuItems as $child){
        $menu->addChild($child);
    }
}

Ini akan menyelesaikan masalah saya, tetapi saya berharap metode yang lebih elegan untuk melakukannya.

Marius
sumber
Marius adakah pengamat lain selain page_block_html_topmenu_gethtml_sebelum menambahkan tautan ke menu kategori?
Pradeep Sanku
Alasannya adalah saya telah menggunakan pengamat yang sama tetapi saya memiliki ekstensi untuk megamenu yang tidak memanggil page_block_html_topmenu_gethtml_before.please beri tahu saya
Pradeep Sanku
@PradeepSanku. Saya tidak tahu acara lainnya. Mungkin ekstensi yang Anda gunakan menggantikan sepenuhnya menu utama. Anda harus meminta dukungan pengembang.
Marius
4

Karena tidak ada cara (bukan yang saya tahu) untuk mengurutkan urutan pengamat pada suatu acara ... Saya punya masalah.

Ah, tapi ada! Dalam file deklarasi modul Anda, atur ketergantungan Mage_Catalogke modul Anda, misalnya:

<modules>
    <Your_Module>
        <active>true</active>
        <codePool>local</codePool>
    </Your_Module>
    <Mage_Catalog>
        <depends>
            <Your_Module/>
        </depends>
    </Mage_Catalog>
</modules>

Juga, Anda dapat (saya pikir) menyalin konfigurasi pengamat katalog ke frontendarea acara dan menonaktifkannya di globalarea tersebut. Asumsi saya adalah bahwa globalperistiwa diproses sebelum frontendperistiwa. (Saya tidak tahu mengapa acara ini dikonfigurasi globalsejak awal.)

Dan tentu saja ada opsi lain yang dapat Anda efek melalui penulisan ulang dan PHP.

tanda batas
sumber
Terima kasih. Anda memiliki +1 saya di sini. Saya benar-benar memindahkan acara saya di dalam <global>tag, saya menyatakan Mage_Cataloguntuk 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.
Marius
-1
  1. buat subkategori baru
  2. ganti tautan dengan javascript, misalkan kategori baru Anda "75"
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

" https: // YourNewLinkink "; });

zatanabee
sumber
dan bagaimana saya tahu id elemen jika itu berfungsi dengan id? Ini bukan solusi yang layak. Saya tidak akan menyebutnya solusi.
Marius
ini bekerja pada kode saya ... :)
zatanabee
the id show @ Catalog> kelola kategori
zatanabee