2010-01-29 24 views
7

Trong Magento bạn có thể ghi đè một khối (hoặc trợ giúp, hoặc mô hình, v.v.) từ một mô đun khác (phổ biến nhất từ ​​mô-đun Magento Adminhtml) . Bây giờ tôi có vấn đề mà tôi muốn ghi đè lên một khối đã được overriden bởi một số phần mở rộng khác. Có cách nào để yêu cầu Magento bỏ qua thẻ <rewrite> trong một số cấu hình mô-đun khác tương tự như thẻ <remove> trong bản cập nhật bố cục không?ghi đè một khối magento trong nhiều mô-đun (và cách bỏ qua các khối khác)

Dưới đây là cấu hình của phần mở rộng khác:

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

Đây là cấu hình của phần mở rộng của tôi:

<blocks> 
     <adminhtml> 
      <rewrite> 
        <catalog_product_grid>Namespace_MyModule_Block_Adminhtml_Catalog_Product_Grid</catalog_product_grid> 
      </rewrite> 
     </adminhtml> 
    </blocks> 

tôi tích hợp các chức năng của các khối từ Symmetrics_DeliveryTime vào khối của riêng tôi và bây giờ tôi muốn magento bỏ qua khối ghi đè từ mô-đun đó.

Có cách nào để làm điều đó hay là cách duy nhất để nhận xét cấu hình (đó là những gì tôi đã làm bây giờ) bao gồm tất cả các rắc rối trong khi cập nhật mô-đun đó sau này?

Trả lời

9

Nếu bạn đặt mô-đun của bạn để 'phụ thuộc' vào một trong đó cũng đang làm một viết lại, cấu hình của bạn sẽ được đọc qua và viết lại nên dính vào, trong thích hợp File trong ứng dụng/etc/modules bạn nên có:

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

công trình tốt ... nhưng bây giờ có một "thực" sự phụ thuộc vào rằng mô-đun khác và Magento sẽ phàn nàn, nếu các mô-đun khác không được cài đặt ... trong trường hợp của tôi điều này là ok nhưng một giải pháp sạch cho nhiều lần viết lại trong Magento sẽ ổn thôi ... có thể một ngày nào đó;) –

0

Tôi đã xem xét quá trình tải lớp và có vẻ như không có giải pháp rõ ràng. Mã tải tên lớp có liên quan là:

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

    ... 

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

Vì vậy, có vẻ như không có điều gì như viết lại được viết lại. Một trong đó được đưa vào mảng cấu hình là một trong đó được nạp, và một khi được lưu trữ nó chỉ đơn giản là được trả lại theo yêu cầu. Tôi không thấy một cách dễ dàng để hack cache. Bạn có thể cố gắng để có được ưu tiên cho mô-đun của bạn (bằng cách đổi tên nó theo thứ tự bảng chữ cái, tôi giả định), nhưng đó là một tổng số hack và có khả năng thất bại bí ẩn sau này. Điều đó giết chết các khả năng cấu hình.

Cũng đáng ghét: có vẻ như Magento chỉ yêu cầu lưới ở hai nơi, trong phạm vi (bạn có thể dễ dàng ghi đè), nhưng cũng trong Mage_Adminhtml_Catalog_ProductController (d'oh!). Tùy thuộc vào trường hợp sử dụng của bạn, hãy cân nhắc việc ghi đè khối sản phẩm danh mục và thay thế chức năng _prepareLayout() bằng chức năng của riêng bạn. Nếu bạn cũng muốn ghi đè bộ điều khiển, bạn sẽ muốn tạo bộ điều khiển riêng của mình (xuống từ Mage_Adminhtml_Catalog_ProductController) và xác định ghi đè trong cấu hình của bạn để trực tiếp admin/catalog/product/grid cho hành động của bạn. Một nỗi đau, nhưng ít nhất là hoàn thành mục tiêu của bạn.

Hy vọng rằng sẽ giúp,

Joe

0

Thay vì viết lại catalog_product_grid, tại sao không mở rộng trên Symmetrics_DeliveryTime_Block_Adminhtml_Catalog_Product_Grid? Bằng cách đó, mô-đun Symmetrics sẽ giữ tất cả các chức năng của nó và bạn có thể thêm các chức năng của bạn.

Vì vậy, thay vì:

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

làm điều này:

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

Dĩ nhiên hơn một phụ thuộc vào ứng dụng của bạn/etc/modules tập tin sẽ là phù hợp.

0

Cách tốt nhất để khắc phục sự cố này bằng cách sử dụng, bố cục sau hoặc trước người quan sát.

app/code/local/My/Module/etc/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> 

hoặc có thể sử dụng sự kiện: core_block_abstract_prepare_layout_after.

Và trong Observer:

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

Trong khi thêm tab sau đó bạn có thể lấy tài liệu tham khảo của sản phẩm tab chỉnh sửa để thêm các trường mẫu của bạn vào đó sử dụng mô-đun bạn.

Hy vọng điều này sẽ rất hữu ích cho một số một :)

Các vấn đề liên quan