Kategori menüsüne bağlantılar ekleme


20

Bunun çok fazla cevabı olan eski bir soru olduğunu biliyorum, çoğu menü şablonunu düzenlemeyi önerir, ancak bu benim için çalışmıyor. Nedenini açıklamaya gerek yok, diyelim ki işleri “doğru” şekilde yapma konusunda biraz OKB.
Bu soru muhtaç başkaları için maddi olarak kullanılabilir. İşte gidiyor.
Magento 1.7 ile başlayarak üst menü bir olayı kullanılarak inşa edilmiştir: page_block_html_topmenu_gethtml_before. Bu, Mage_Catalogmodül tarafından kategorileri eklemek için kullanılır . Bunu kullanmak istiyorum. Bunun için modülümde şöyle bir gözlemci oluşturdum:

<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>

Gelen Observer.phpsınıfta ben

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;
}

Gözlemcimin tüm markaları Brandsmenünün alt öğeleri olarak ekleyen başka bir kodu var, ancak burada buna gerek yok.
Bu mükemmel çalışır ve menüde Brandsson öğe olarak bir menü ekler .
Sorun bu ilk menü olarak istiyorum ve benim gözlemci sonra Mage_Catalogkategoriler ekler gözlemci sonra çağırılır . Bir etkinlikte gözlemcilerin sırasını sıralamanın bir yolu olmadığından (bilmediğimden) ... bir sorunum var
[DÜZENLEME]
@Benmarks önerdiği gibiMage_Catalogmodül modülüme bağlıdır ve şimdi menü öğem listede ilk sırada yer alıyor. Ama yine de kategoriler arasında ve sonunda menüler eklemem gerekiyor. Yeni bir modül oluşturmak muhtemelen menünün sonundaki öğelerle ilgili sorunu çözecektir, ancak yine de kategoriler arasındakilerle ilgili bir sorunum var,
[/ EDIT]
Temelde sorum şu şekilde devam ediyor: (Nasıl) çocuk etrafında hareket edebilirim Varien_Data_Tree_Nodebir Varien_Data_Treenesnenin düğümleri ? "
Lütfen Brandskategori ağacına ilk kategori olarak eklenmesini önermeyin . Bu bir seçenek değil (dediğim gibi ... bunlar hakkında OKB'm).


Boş kategoriler oluşturmamak ve yalnızca bir CMS bloğu göstermek için bir neden var mı? - Bir cevap olarak "evet" i kabul ediyorum, sadece emin olmak için bunu düşündün :)
Fabian Blechschmidt

1
@FabianBlechschmidt. "Evet". Ayrıntılara girmenin bir anlamı yok, ama nedenleri var (bazıları oldukça aptal olabilir). Ben bu konuda "kurallar" yapmıyorum. Yani böyle yapıldı.
Marius

@FabianBlechschmidt: "Sis" in bir kısmını temizlemek için iyi bir sebep bu yüzden inatçı olduğumu söylemeyeceksin (ben de olsam). Özel bağlantılar (markalar, yeni ürünler, satışlar ve diğerleri) tüm mağaza görünümleri için aynı yerde değildir. Ancak tüm mağaza görünümleri aynı kategorileri kullanır. Bu yüzden her mağaza görünümü için farklı bir ağaç oluşturmak istemiyorum. Bir gözlemci kullanarak, bazı yapılandırma ayarlarını okuyabilir ve öğeleri istediğim gibi düzenleyebilirim. Mağaza görünümü kimliğine bağlı olarak menü öğelerini bile ekleyebilirim.
Marius

Ayrıca, aynı sorun var, benim çözüm Varien_Data_Tree_Node_Collection geçersiz kılmak ve burada düğümleri istediğim gibi sıralamak için bir yöntem eklemek, ama daha temiz bir yol arıyorum.
Fab

Yanıtlar:


10

Burada biraz mücadele ettikten sonra bulduğum çözüm. Gözlemcimin bir tanesinin ardından çalışmasına izin Mage_Catalogverdim ve menüyü tamamen yeniden oluşturmaya karar verdim.
Ana fikir, mevcut tüm menü öğelerini geçici bir diziye koymak, onları menüden kaldırmak, sonra mevcut öğeler arasında bağlantılarımı eklemek ve sonunda tüm öğeleri tekrar menüye eklemek. Bunun gibi bir şey:

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);
    }
}

Bu benim sorunumu çözmek için dikişler, ama bunu yapmak için daha zarif bir yöntem umuyorum.


Marius, kategori menüsüne bağlantılar eklemek için page_block_html_topmenu_gethtml_before dışında başka bir gözlemci var mı?
Pradeep Sanku

Nedeni ben aynı gözlemci kullanmıştı ama ben page_block_html_topmenu_gethtml_before.p call çağırmıyor megamenu için bir uzantısı vardı
Pradeep Sanku

@PradeepSanku. Başka bir olay bilmiyorum. Belki de kullandığınız uzantı ana menünün yerine geçer. Geliştiriciden destek istemelisiniz.
Marius

4

Bir olaya gözlemcilerin sırasını sıralamanın bir yolu (bildiğim değil) olmadığı için ... bir sorunum var.

Ah, ama var! Modül bildirim dosyanızda, modülünüzün bağımlılığını ayarlayın Mage_Catalog, örn:

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

Ayrıca, katalog gözlemcisi yapılandırmasını frontendolay alanına kopyalayabilir ve alanda devre dışı bırakabilirsiniz global. Benim varsayımım globalolayların olaylardan önce işlenmiş olmasıdır frontend. (Bu olayın neden globalilk başta yapılandırıldığını bilmiyorum .)

Ve elbette yeniden yazma ve PHP ile etkileyebileceğiniz başka seçenekler de var.


Teşekkürler. Burada + 1'im var. Aslında olayımı <global>etiketin içine taşıdım , modülüme Mage_Catalogbağlı olduğumu beyan ettim (bunu yaparken biraz 'kirli' hissetsem bile) ve işe yarıyor, ancak başka bir sorunla karşılaşıyorum. Bazı kategoriler arasında ve menünün sonunda yer alan bazı menü öğelerine ihtiyacım var, bu yüzden onları hala hareket ettirebilmeliyim. Soruyu güncelleyeceğim.
Marius

-1
  1. yeni alt kategori oluştur
  2. javascript ile bağlantıyı değiştirin, eski kategoriniz "75"
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

" https: // YourNewLinkink "; });


ve herhangi bir kimlikle çalışması gerekiyorsa öğenin kimliğini nasıl bilebilirim? Bu uygun bir çözüm değildir. Buna bir çözüm bile demeyeceğim.
Marius

benim kod üzerinde çalışıyor ... :)
zatanabee 28:17

id id @ Katalog> kategorileri yönet
zatanabee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.