Thêm liên kết vào menu danh mục


20

Tôi biết đây là một câu hỏi cũ với rất nhiều câu trả lời, hầu hết trong số họ đề nghị chỉnh sửa mẫu menu nhưng điều đó không hiệu quả với tôi. Không cần phải giải thích tại sao, giả sử tôi là một chút OCD về việc làm mọi thứ theo cách "đúng".
Câu hỏi này có thể phục vụ như là tài liệu cho những người khác cần. Ở đây đi.
Bắt đầu với Magento 1.7, menu trên cùng được tạo bằng một sự kiện : page_block_html_topmenu_gethtml_before. Điều này được sử dụng bởi các Mage_Catalogmô-đun để thêm các thể loại. Tôi muốn sử dụng nó. Đối với điều này, tôi đã tạo một người quan sát trong mô-đun của mình như thế này:

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

Trong Observer.phplớp tôi có

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

Người quan sát của tôi có một số mã khác thêm tất cả các nhãn hiệu dưới dạng các mục con của Brandsmenu nhưng không cần điều đó ở đây.
Điều này hoạt động hoàn hảo và thêm một menu Brandsnhư một mục cuối cùng trong menu.
Vấn đề là tôi muốn đây là menu đầu tiên và người quan sát của tôi được gọi sau khi người quan sát trong Mage_Catalogđó thêm các danh mục. Vì không có cách nào (không phải tôi biết) để sắp xếp thứ tự của người quan sát về một sự kiện ... Tôi có một vấn đề
[EDIT]
Như @Benmark đề nghị tôi đã thực hiệnMage_Catalogmô-đun phụ thuộc vào mô-đun của tôi và bây giờ mục menu của tôi là đầu tiên trong danh sách. Nhưng tôi vẫn phải thêm các menu giữa các danh mục và cuối cùng. Tạo một mô-đun mới có thể sẽ giải quyết vấn đề với các mục ở cuối menu, nhưng tôi vẫn gặp vấn đề với các mục giữa các danh mục,
[/ EDIT]
Vì vậy, về cơ bản câu hỏi của tôi tiếp tục là " (Làm thế nào) tôi có thể di chuyển xung quanh con các nút của a Varien_Data_Tree_Nodetrong một Varien_Data_Treeđối tượng? "
Vui lòng không đề xuất thêm Brandsdanh mục đầu tiên trong cây danh mục. Đây không phải là một lựa chọn (như tôi đã nói ... OCD của tôi về những điều này).


Có một lý do để không tạo các danh mục trống và chỉ hiển thị một khối CMS? - Tôi chấp nhận "có" như một câu trả lời, chỉ để chắc chắn, bạn đã nghĩ về điều này :)
Fabian Blechschmidt

1
@FabianBlechschmidt. "Có". Không có điểm nào trong việc nhận được thông tin chi tiết, nhưng có những lý do (một số trong số chúng có thể khá ngu ngốc). Tôi không thực hiện "quy tắc" về điều này. Vì vậy, nó đã được thực hiện như thế này.
Marius

@FabianBlechschmidt: Để xóa một số "sương mù" ở đây là một lý do chính đáng để bạn sẽ không nói tôi bướng bỉnh (ngay cả khi tôi). Các liên kết tùy chỉnh (nhãn hiệu, mới, bán hàng và những thứ khác) không ở cùng một nơi cho tất cả các lượt xem cửa hàng. Nhưng tất cả các lượt xem cửa hàng sử dụng cùng một danh mục. Vì vậy, tôi không muốn tạo một cây khác nhau cho mỗi lượt xem cửa hàng. Bằng cách sử dụng trình quan sát, tôi có thể đọc một số cài đặt cấu hình và sắp xếp các mục theo ý muốn. Tôi thậm chí có thể thêm các mục menu tùy thuộc vào id xem cửa hàng.
Marius

Cũng quan tâm, tôi có cùng một vấn đề, giải pháp của tôi là ghi đè Varien_Data_Tree_Node_Collection và thêm vào đây một phương pháp để sắp xếp các nút theo ý muốn, nhưng tôi đang tìm cách sạch hơn.
Fab

Câu trả lời:


10

Sau khi vật lộn một chút ở đây là giải pháp tôi tìm thấy. Tôi để người quan sát của mình thực thi sau khi người trong Mage_Catalogvà quyết định tạo lại toàn bộ menu.
Ý tưởng chính là lấy tất cả các mục menu hiện có đặt chúng vào một mảng tạm thời, loại bỏ chúng khỏi menu sau đó thêm liên kết của tôi giữa các mục hiện có và cuối cùng thêm tất cả các mục vào menu. Một cái gì đó như thế này:

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

Điều này để giải quyết vấn đề của tôi, nhưng tôi hy vọng cho một phương pháp thanh lịch hơn để làm điều đó.


Marius có bất kỳ người quan sát nào khác ngoài page_block_html_topmenu_gethtml_b Before để thêm liên kết vào menu danh mục không?
Pradeep Sanku

Lý do là tôi đã sử dụng cùng một người quan sát nhưng tôi đã có một tiện ích mở rộng cho megamothy không gọi page_block_html_topmenu_gethtml_b Before.please cho tôi biết
Pradeep Sanku

@PradeepSanku. Tôi không biết bất kỳ sự kiện nào khác. Có thể phần mở rộng bạn đang sử dụng thay thế hoàn toàn menu chính. Bạn nên yêu cầu nhà phát triển hỗ trợ.
Marius

4

Vì không có cách nào (không phải tôi biết) để sắp xếp thứ tự của người quan sát về một sự kiện ... tôi có một vấn đề.

À, nhưng có! Trong tệp khai báo mô-đun của bạn, đặt phụ thuộc Mage_Catalogvào mô-đun của bạn, ví dụ:

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

Ngoài ra, bạn có thể (tôi nghĩ) sao chép cấu hình người quan sát danh mục vào frontendkhu vực sự kiện và hủy kích hoạt nó trong globalkhu vực. Giả định của tôi là globalcác sự kiện được xử lý trước frontendcác sự kiện. (Tôi không biết tại sao sự kiện này được định cấu hình globalở vị trí đầu tiên.)

Và tất nhiên, có những tùy chọn khác mà bạn có thể thực hiện thông qua việc viết lại và PHP.


Cảm ơn. Bạn có +1 của tôi ở đây. Tôi thực sự đã chuyển sự kiện của mình bên trong <global>thẻ, tôi tuyên bố Mage_Catalogphụ thuộc vào mô-đun của mình (ngay cả khi tôi cảm thấy hơi 'bẩn' khi làm điều đó) và nó hoạt động, nhưng tôi kết thúc với một vấn đề khác. Tôi cần một số mục menu khác được đặt giữa một số danh mục và ở cuối menu để tôi vẫn cần có thể di chuyển chúng. Tôi sẽ cập nhật câu hỏi.
Marius

-1
  1. tạo danh mục con mới
  2. thay đổi liên kết với javascript, ví dụ như danh mục mới của bạn là "75"
jQuery(document).ready(function(){
    document.getElementById("menu75").getElementsByTagName("a")[0].href =

" https: // YourNewLinkink "; });


và làm thế nào để tôi biết id của phần tử nếu nó được cho là hoạt động với bất kỳ id nào? Đây không phải là một giải pháp khả thi. Tôi sẽ không gọi nó là một cách giải quyết.
Marius

nó hoạt động trên mã của tôi ... :)
zatanabee

chương trình id @ Catalog> quản lý danh mục
zatanabee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.