2010-01-29 2 views
7

Magento에서는 다른 모듈 (Magento Adminhtml 모듈에서 가장 일반적인 모듈)에서 블록 (또는 도우미, 모델 등)을 재정의 할 수 있습니다. . 이제 나는 다른 확장에 의해 이미 오버라이드 된 블록을 오버라이드시키고 싶다. 레이아웃 업데이트에서 <remove> 태그와 비슷한 다른 모듈 구성에서 magento가 <rewrite> 태그를 무시하도록 지시 할 수 있습니까? 여기여러 모듈에서 마젠타 블록을 재정의하는 방법 (다른 모듈을 무시하는 방법)

<blocks> 
     <adminhtml> 
      <rewrite> 
        <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
      </rewrite> 
     </adminhtml> 
    </blocks> 

내 확장의 구성 : 여기

은 다른 확장의 구성입니다 난 내 자신의 블록으로 Symmetrics_DeliveryTime에서 블록의 기능을 통합
<blocks> 
     <adminhtml> 
      <rewrite> 
        <catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
      </rewrite> 
     </adminhtml> 
    </blocks> 

그리고 지금 magento가 해당 모듈에서 무시하는 블록을 무시하기를 원합니다.

Magento 방법이 있나요 아니면 그 모듈을 나중에 업데이트하는 동안 모든 번거 로움을 포함하여 구성을 주석 처리하는 유일한 방법입니까?

답변

9

당신이 모듈을 설정하는 경우, 사용자의 설정 마지막으로 읽은되고 재 작성 적절한에 충실해야한다고도 재 작성을하고있어 사람에 '의존' 당신은이 있어야 응용 프로그램을/etc/모듈 내에서 파일을 대신 catalog_product_grid를 다시 작성

<config> 
    <modules> 
    <Your_Module> 
     <active>true</active> 
     <codePool>local</codePool> 
     <depends> 
     <Other_Module/> 
     </depends> 
    </Your_Module> 
    <modules> 
<config> 
+0

작품에 도움이 될 것입니다 ... 내 경우에 이것은 괜찮지 만 magento에서 다중 재 작성을위한 깨끗한 해결책은 괜찮을 것입니다 ... 아마 언젠가;) –

0

클래스 로딩을 살펴본 결과 깨끗한 해결책이없는 것 같습니다. 관련 클래스 이름로드 코드는 다음과 같습니다.

if (isset($this->_classNameCache[$groupRootNode][$group][$class])) { 
     return $this->_classNameCache[$groupRootNode][$group][$class]; 
    } 

    ... 

    if (isset($config->rewrite->$class)) { 
     $className = (string)$config->rewrite->$class; 

다시 작성된 다시 작성과 같은 것은 없습니다. 구성 배열에 들어간 것은로드 된 것으로, 일단 캐시되면 요청 된대로 단순히 반환됩니다. 캐시를 쉽게 해킹 할 수있는 방법이 없습니다. 모듈에 우선권을 주려고 할 수 있습니다. (알파벳순으로 이름을 바꾸면됩니다.)하지만 그것은 총 해킹이며 이후에 신비하게 실패 할 가능성이 있습니다. 그것은 설정 가능성을 죽입니다.

불쾌한 점 : Magento는 내의 두 곳에서만 그리드를 요청하는 것처럼 보입니다 (쉽게 덮어 쓸 수 있음). Mage_Adminhtml_Catalog_ProductController (도 있습니다!). 유스 케이스에 따라 카탈로그 제품 블록을 재정의하고 _prepareLayout() 기능을 자신의 제품으로 교체하는 것이 좋습니다. 제어기를 재정의하려는 경우 자신의 제어기 (Mage_Adminhtml_Catalog_ProductController의 하위)를 작성하고 구성 내에 다시 쓰기를 정의하여 admin/catalog/product/grid을 사용자 조치로 지정해야합니다. 고통은 있지만 적어도 목표를 달성합니다. 도움이

희망,

0

, 왜 Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid에 연장하지? 그렇게하면 Symmetrics 모듈은 모든 기능을 유지하고 추가 할 수 있습니다.

그래서 대신 :

<blocks> 
    <adminhtml> 
     <rewrite> 
       <catalog_product_grid>Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
     </rewrite> 
    </adminhtml> 
</blocks> 

이 작업을 수행합니다 귀하의 응용 프로그램은/etc에 의존하는 것보다 물론

<blocks> 
    <adminhtml> 
     <rewrite> 
       <deliverytime_catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</deliverytime_catalog_product_grid> 
     </rewrite> 
    </adminhtml> 
</blocks> 

/모듈 파일을 피팅 할 것이다.

0

옵저버 전후의 레이아웃을 사용하여이 문제를 극복하는 가장 좋은 방법입니다.

응용 프로그램/코드/지역/내/모듈/기타/config.xml에

<config> 
<adminhtml> 
    <events> 
     <core_block_abstract_prepare_layout_before> 
      <observers> 
       <mymodule> 
        <!-- Add column to catalog product grid --> 
        <class>mymodule/adminhtml_observer</class> 
        <method>onBlockHtmlBefore</method> 
       </mymodule> 
      </observers> 
     </core_block_abstract_prepare_layout_before> 
    </events> 
</adminhtml> 

또는 이벤트 사용할 수 있습니다 core_block_abstract_prepare_layout_after합니다.

그리고 관찰자의

:

class My_Module_Model_Adminhtml_Observer 
{ 
    public function onBlockHtmlBefore(Varien_Event_Observer $observer) { 
    $block = $observer->getBlock(); 
    if (!isset($block)) return; 

    switch ($block->getType()) { 
     case 'adminhtml/catalog_product_grid': //or here you can put any other block 

      /*For example i am using Mage_Adminhtml_Block_Catalog_Product_Grid, and want to add a column*/ 

      $block->addColumn('COLUMN_ID', array(
       'header' => Mage::helper('mymodule')->__('COLUMN HEADER'), 
       'index' => 'COLUMN_ID', 
      )); 
      break; 

      case 'adminhtml/catalog_product_edit_tabs': 

      /*Or i want to add new tab to admin product edit*/ 
       /* @var $block Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs */ 
      $block->addTab('tab_name', array(
         'label'  => Mage::helper('catalog')->__('Tab Tilte'), 
         'content' => $block->getLayout()->createBlock('modulename/adminhtml_product_edit_tabname')->toHtml(), 
         'after'  => 'inventory', 
      )); 
      break; 
    } 
    } 
} 

탭을 추가하는 동안 당신은 당신이 모듈 사용하여 해당로 양식 필드를 추가 할 제품의 편집 탭의 참조를 취할 수 있습니다.

희망이 잘 ...하지만 지금은 불평 다른 모듈과 마 젠토에 "진짜"의존성이있다, 다른 모듈이 설치되어 있지 않은 경우 어떤 일 :

관련 문제