श्रेणी मेनू में लिंक जोड़ना


20

मुझे पता है कि यह बहुत सारे सवालों के साथ एक पुराना सवाल है, उनमें से ज्यादातर मेनू टेम्पलेट को संपादित करने का सुझाव देते हैं लेकिन यह मेरे लिए काम नहीं करता है। यह समझाने की कोई आवश्यकता नहीं है कि क्यों, आइए हम "सही" तरीके से काम करने के बारे में थोड़ा ओसीडी महसूस करते हैं।
यह प्रश्न दूसरों के लिए आवश्यक सामग्री के रूप में काम कर सकता है। यहाँ जाता हैं।
Magento 1.7 के साथ शुरू करके शीर्ष मेनू को एक घटना का उपयोग करके बनाया गया है page_block_html_topmenu_gethtml_before:। यह Mage_Catalogश्रेणियों को जोड़ने के लिए मॉड्यूल द्वारा उपयोग किया जाता है । मैं उसका उपयोग करना चाहता हूं। इसके लिए मैंने अपने मॉड्यूल में एक पर्यवेक्षक को इस तरह बनाया है:

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

में Observer.phpकक्षा मैं

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

मेरे पर्यवेक्षक के पास कुछ अन्य कोड हैं जो सभी ब्रांडों को Brandsमेनू के उप-आइटम के रूप में जोड़ता है लेकिन यहां उसके लिए कोई आवश्यकता नहीं है।
यह पूरी तरह से काम करता है और मेनू Brandsमें अंतिम आइटम के रूप में एक मेनू जोड़ता है ।
मुद्दा यह है कि मैं इसे पहले मेनू के रूप में चाहता हूं और मेरे पर्यवेक्षक को Mage_Catalogश्रेणियों में पर्यवेक्षक के बाद बुलाया जाता है । चूंकि किसी घटना पर पर्यवेक्षकों के आदेश को क्रमबद्ध करने का कोई तरीका (ऐसा नहीं है कि मुझे पता है) ... मुझे एक समस्या है
[EDIT]
जैसा कि @Benmark ने सुझाव दिया था कि मैंने बनायाMage_Catalogमॉड्यूल मेरे मॉड्यूल पर निर्भर करता है और अब मेरा मेनू आइटम सूची में पहला है। लेकिन मुझे अभी भी श्रेणियों के बीच और अंत में मेनू जोड़ना है। एक नया मॉड्यूल बनाने से संभवतः मेनू के अंत में आइटम के साथ समस्या का समाधान हो जाएगा, लेकिन मेरे पास अभी भी श्रेणियों के बीच वालों के साथ एक मुद्दा है,
[/ EDIT]
इसलिए मूल रूप से मेरा प्रश्न फिर से शुरू होता है " (कैसे) मैं बच्चे के चारों ओर घूम सकता हूं Varien_Data_Tree_Nodeकिसी Varien_Data_Treeवस्तु में नोड्स ? "
कृपया Brandsश्रेणी के पेड़ में पहली श्रेणी के रूप में जोड़ने का सुझाव न दें । यह एक विकल्प नहीं है (जैसे मैंने कहा ... इन चीजों के बारे में मेरा ओसीडी)।


क्या खाली श्रेणियां नहीं बनाने और केवल सीएमएस ब्लॉक दिखाने का कारण है? - मैं एक उत्तर के रूप में "हाँ" स्वीकार करता हूं, बस सुनिश्चित होने के लिए, आपने इस बारे में सोचा :)
फेबियन बलेचस्मिड

1
@FabianBlechschmidt। "हाँ"। विवरण प्राप्त करने का कोई मतलब नहीं है, लेकिन कारण हैं (उनमें से कुछ बहुत बेवकूफ हो सकते हैं)। मैं इस पर "नियम" नहीं बनाता। तो यह इस तरह किया गया है।
मेरियस

@FabianBlechschmidt: यहाँ "कोहरे" में से कुछ को साफ़ करने का एक अच्छा कारण है, इसलिए आप यह नहीं कहेंगे कि मैं जिद्दी हूँ (भले ही मैं हूँ)। कस्टम लिंक (ब्रांड, नया, बिक्री और अन्य) सभी स्टोर दृश्यों के लिए एक ही स्थान पर नहीं हैं। लेकिन सभी स्टोर व्यू एक ही श्रेणियों का उपयोग करते हैं। इसलिए मैं प्रत्येक स्टोर दृश्य के लिए एक अलग पेड़ नहीं बनाना चाहता। एक पर्यवेक्षक का उपयोग करके, मैं कुछ कॉन्फ़िगर सेटिंग्स पढ़ सकता हूं और आइटम को व्यवस्थित कर सकता हूं जैसा मैं चाहता हूं। मैं भी स्टोर आइटम आईडी के आधार पर मेनू आइटम जोड़ सकते हैं।
मारियस

इसके अलावा दिलचस्पी है, मुझे भी यही समस्या है, मेरा समाधान है Varien_Data_Tree_Node_Collection को ओवरराइड करना और यहाँ नोड्स को सॉर्ट करने के लिए एक तरीका जोड़ना, जैसा कि मैं चाहता हूं, लेकिन मैं एक क्लीनर तरीके की तलाश कर रहा हूं।
फैब

जवाबों:


10

यहां थोड़ा संघर्ष करने के बाद मैंने जो समाधान पाया है। मैंने अपने पर्यवेक्षक को एक के बाद एक निष्पादन करने दिया Mage_Catalogऔर मेनू को पूरी तरह से फिर से बनाने का फैसला किया।
मुख्य विचार यह है कि सभी मौजूदा मेनू आइटम को एक अस्थायी सरणी में रखा जाए, उन्हें मेनू से हटा दें, फिर मौजूदा आइटम के बीच मेरे लिंक जोड़ें और अंत में सभी आइटमों को फिर से मेनू में जोड़ें। कुछ इस तरह:

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

यह मेरी समस्या को हल करने के लिए है, लेकिन मैं इसे करने की एक और अधिक सुंदर विधि की उम्मीद कर रहा हूं।


श्रेणी मेनू में लिंक जोड़ने के लिए Marius, पेज_ब्लॉक_एचटीएमएल_टॉपमेनू_गेटबुक_बेबर के अलावा कोई अन्य पर्यवेक्षक है?
प्रदीप सांकू

कारण यह है कि मैंने उसी पर्यवेक्षक का उपयोग किया था, लेकिन मेरे पास मेगामेनु के लिए एक एक्सटेंशन था जो पेज_ब्लॉक_एचटीएमएल_टॉपमेनू_गॉट कॉम_बेग.प्लग नहीं कर रहा है। कृपया मुझे बताएं
प्रदीप सांकू

@PradeepSanku। मैं किसी अन्य घटना को नहीं जानता। हो सकता है कि आप जिस एक्सटेंशन का इस्तेमाल कर रहे हैं, वह पूरी तरह से मेन मेन्यू हो। आपको डेवलपर से समर्थन के लिए पूछना चाहिए।
मेरियस

4

चूंकि एक घटना पर पर्यवेक्षकों के आदेश को हल करने के लिए कोई रास्ता नहीं है (ऐसा नहीं है कि मुझे पता है) ... मुझे एक समस्या है।

आह, लेकिन वहाँ है! अपनी मॉड्यूल घोषणा फ़ाइल में, अपने मॉड्यूल की निर्भरता सेट करें Mage_Catalog, जैसे:

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

इसके अलावा, आप (मुझे लगता है) frontendघटना क्षेत्र में कैटलॉग ऑब्जर्वर कॉन्फिग को कॉपी कर सकते हैं और इसे globalक्षेत्र में निष्क्रिय कर सकते हैं। मेरी धारणा यह है कि globalघटनाओं से पहले की frontendघटनाओं को संसाधित किया जाता है । (मुझे नहीं पता कि यह घटना globalपहली जगह के तहत क्यों कॉन्फ़िगर की गई है।)

और निश्चित रूप से अन्य विकल्प हैं जो आप फिर से लिखना और PHP के माध्यम से प्रभावित कर सकते हैं।


धन्यवाद। आपके पास मेरा +1 है। मैंने वास्तव में अपने कार्यक्रम को <global>टैग के अंदर स्थानांतरित कर दिया, मैंने Mage_Catalogअपने मॉड्यूल पर निर्भर होने की घोषणा की (भले ही मुझे ऐसा करने में थोड़ा 'गंदा' लगता है) और यह काम करता है, लेकिन मैं एक अन्य मुद्दे के साथ समाप्त होता हूं। मुझे कुछ श्रेणियों के बीच और मेनू के अंत में कुछ अन्य मेनू आइटम की आवश्यकता है, इसलिए मुझे अभी भी उन्हें घेरने में सक्षम होने की आवश्यकता है। मैं सवाल को अपडेट करूंगा।
मेरियस

-1
  1. नई उपश्रेणी बनाएँ
  2. जावास्क्रिप्ट के साथ लिंक बदलें, अपनी नई श्रेणी "पूर्व" है
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

" https: // YourNewLinkink "; });


और अगर मैं किसी भी आईडी के साथ काम करना चाहता हूं तो मुझे तत्व की आईडी कैसे पता चलेगी? यह एक व्यवहार्य समाधान नहीं है। मैं इसे वर्कअराउंड भी नहीं कहूंगा।
मेरियस

यह मेरे कोड पर काम करता है ... :)
zatanabee

आईडी शो @ कैटलॉग> श्रेणियों का प्रबंधन
16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.