카테고리 메뉴에 링크 추가


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카테고리를 추가하는 관찰자 다음에 호출 된다는 것입니다. 이벤트에서 옵저버의 순서를 정렬 할 수있는 방법은 없습니다 (알지 못합니다). ... 문제가 있습니다.
[편집]
@Benmarks가 제안한대로Mage_Catalog모듈은 모듈에 따라 달라지며 이제 메뉴 항목이 목록에서 첫 번째입니다. 그러나 나는 여전히 범주 사이와 마지막에 메뉴를 추가해야합니다. 새 모듈을 만들면 메뉴 끝에있는 항목의 문제가 해결 될 수도 있지만 범주 간 문제에 여전히 문제가 있습니다.
[/ EDIT]
따라서 기본적으로 내 질문은 " (어떻게) 하위로 이동할 수 있습니까? (A)의 노드 Varien_Data_Tree_NodeA의 Varien_Data_Tree객체? " 카테고리 트리에서 첫 번째 카테고리를
추가하지 마십시오 Brands. 이것은 옵션이 아닙니다 (이것들에 대해 내 OCD에 말했듯이).


빈 카테고리를 작성하지 않고 CMS 블록 만 표시해야하는 이유가 있습니까? -나는 "예"를 대답으로 받아들입니다. 확실하게, 당신은 이것에 대해 생각했습니다 :)
Fabian Blechschmidt

1
@FabianBlechschmidt. "예" 세부 사항을 파악할 필요는 없지만 이유가 있습니다 (일부는 바보 일 수 있습니다). 나는 이것에 대한 "규칙"을 만들지 않습니다. 그래서 이렇게되었습니다.
Marius

@FabianBlechschmidt : 여기서 "안개"의 일부를 지우는 것이 좋은 이유이므로 내가 고집에 빠졌다고 말하지 않을 것입니다. 모든 상점보기에서 사용자 정의 링크 (브랜드, 신규, 판매 및 기타)가 동일한 위치에 있지는 않습니다. 그러나 모든 상점보기는 동일한 카테고리를 사용합니다. 따라서 각 상점보기마다 다른 트리를 만들고 싶지 않습니다. 관찰자를 사용하여 일부 구성 설정을 읽고 원하는대로 항목을 정렬 할 수 있습니다. 상점보기 ID에 따라 메뉴 항목을 추가 할 수도 있습니다.
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_ 이외의 다른 관찰자입니까?
Pradeep Sanku

이유는 동일한 관찰자를 사용했지만 page_block_html_topmenu_gethtml_before를 호출하지 않는 megamenu의 확장명을 가지고 있습니다. 알려주세요.
Pradeep

@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. 자바 스크립트로 링크 변경, 예 : 새 카테고리가 "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.