การเพิ่มลิงค์ไปยังเมนูหมวดหมู่


20

ฉันรู้ว่านี่เป็นคำถามเก่าที่มีคำตอบมากมายส่วนใหญ่แนะนำให้แก้ไขเทมเพลตเมนู แต่มันไม่ได้ผลสำหรับฉัน ไม่จำเป็นต้องอธิบายว่าทำไมทำไมสมมติว่าฉันเป็นโรค OCD เล็กน้อยเกี่ยวกับการทำสิ่งต่าง ๆ ในแบบที่ "ถูกต้อง"
คำถามนี้อาจเป็นข้อมูลสำหรับผู้อื่นที่ต้องการ นี่ไง
เริ่มต้นด้วยวีโอไอพี 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ที่เพิ่มหมวดหมู่ เนื่องจากไม่มีทาง (ไม่ใช่ที่ฉันรู้) ในการจัดเรียงลำดับของผู้สังเกตการณ์ในเหตุการณ์ ... ฉันมีปัญหา
[แก้ไข]
ตามที่ @Benmarks แนะนำฉันได้ทำMage_Catalogโมดูลขึ้นอยู่กับโมดูลของฉันและตอนนี้รายการเมนูของฉันเป็นรายการแรกในรายการ แต่ฉันยังต้องเพิ่มเมนูระหว่างหมวดหมู่และท้ายที่สุด การสร้างโมดูลใหม่อาจช่วยแก้ปัญหารายการต่าง ๆ ในตอนท้ายของเมนู แต่ฉันยังคงมีปัญหาเกี่ยวกับสิ่งที่อยู่ในหมวดหมู่
[/ แก้ไข]
ดังนั้นโดยทั่วไปคำถามของฉันจะกลับไปที่ " (ฉัน) โหนดของ a Varien_Data_Tree_NodeในVarien_Data_Treeวัตถุ? "
โปรดอย่าแนะนำให้เพิ่มBrandsหมวดหมู่แรกในแผนผังหมวดหมู่ นี่ไม่ใช่ตัวเลือก (อย่างที่ฉันพูด ... OCD ของฉันเกี่ยวกับสิ่งเหล่านี้)


มีเหตุผลที่จะไม่สร้างหมวดหมู่ที่ว่างเปล่าและแสดงเฉพาะบล็อก CMS หรือไม่ - ฉันยอมรับว่า "ใช่" เป็นคำตอบเพียงเพื่อให้แน่ใจว่าคุณคิดเกี่ยวกับนี้ :)
Fabian Blechschmidt

1
@FabianBlechschmidt. "ใช่" ไม่มีจุดในการรับรายละเอียด แต่มีเหตุผล (บางคนอาจโง่มาก) ฉันไม่ได้ทำ "กฎ" ในอันนี้ ดังนั้นจะต้องทำเช่นนี้
Marius

@FabianBlechschmidt: เพื่อล้าง "หมอก" บางส่วนที่นี่เป็นเหตุผลที่ดีดังนั้นคุณจะไม่พูดว่าฉันหัวแข็ง (แม้ว่าฉันจะเป็น) ลิงก์ที่กำหนดเอง (แบรนด์ใหม่การขายและอื่น ๆ ) ไม่ได้อยู่ในที่เดียวกันสำหรับการดูร้านค้าทั้งหมด แต่มุมมองร้านค้าทั้งหมดใช้หมวดหมู่เดียวกัน ดังนั้นฉันไม่ต้องการที่จะสร้างต้นไม้ที่แตกต่างกันสำหรับแต่ละมุมมองร้านค้า ด้วยการใช้ผู้สังเกตการณ์ฉันสามารถอ่านการตั้งค่าบางอย่างและจัดเรียงรายการตามที่ฉันต้องการ ฉันสามารถเพิ่มรายการเมนูได้ตามรหัสร้านค้า
Marius

สนใจฉันมีปัญหาเดียวกันทางออกของฉันคือการแทนที่ Varien_Data_Tree_Node_Collection และเพิ่มวิธีการเรียงลำดับโหนดตามที่ฉันต้องการ แต่ฉันกำลังมองหาวิธีที่สะอาดกว่า
Fab

คำตอบ:


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 เป็นผู้สังเกตการณ์คนอื่น ๆ นอกจาก page_block_html_topmenu_gethtml_bebe ก่อนเพิ่มลิงก์ไปยังเมนูหมวดหมู่หรือไม่
Pradeep Sanku

เหตุผลที่ฉันใช้ผู้สังเกตการณ์คนเดียวกัน แต่ฉันมีส่วนขยายสำหรับ megamenu ซึ่งไม่ได้เรียก page_block_html_topmenu_gethtml_before.please แจ้งให้เราทราบ
Pradeep Sanku

@PradeepSanku ฉันไม่รู้เหตุการณ์อื่นใด อาจเป็นส่วนขยายที่คุณใช้แทนที่เมนูหลักทั้งหมด คุณควรขอความช่วยเหลือจากผู้พัฒนา
Marius

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ขึ้นอยู่กับโมดูลของฉัน (แม้ว่าฉันจะรู้สึก 'สกปรก' เล็กน้อยในการทำเช่นนั้น) และมันใช้งานได้ แต่ฉันจบลงด้วยปัญหาอื่น ฉันต้องการรายการเมนูอื่น ๆ วางไว้ระหว่างบางหมวดหมู่และท้ายเมนูดังนั้นฉันยังต้องสามารถย้ายรายการเหล่านั้นได้ ฉันจะอัปเดตคำถาม
Marius

-1
  1. สร้างหมวดหมู่ย่อยใหม่
  2. เปลี่ยนลิงค์ด้วย javascript เช่นเดิมหมวดหมู่ใหม่ของคุณคือ "75"
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

" https: // YourNewLinkink "; });


และฉันจะรู้ id ขององค์ประกอบได้อย่างไรถ้ามันควรจะทำงานกับ id ใด ๆ นี่ไม่ใช่วิธีแก้ปัญหาที่ทำงานได้ ฉันจะไม่เรียกมันว่าเป็นวิธีแก้ปัญหา
Marius

มันทำงานบนรหัสของฉัน ... :)
zatanabee

id แสดง @ แคตตาล็อก> จัดการหมวดหมู่
zatanabee
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.