Làm thế nào để viết lại một lớp đã được viết lại?


15

Cập nhật: Tôi thấy rằng lớp tôi thực sự cần phải viết lại SMDesign_SMDZoom_Block_Product_View_Mediavà không SMDesign_ColorswatchProductView_Block_Product_View_Mediagiống như tôi nghĩ ban đầu. Tuy nhiên, vấn đề chính xác vẫn được áp dụng.

Tiện ích mở rộng SMDesign SMZoom viết lại lớp 'catalog / sản phẩm_view_media'. Xml cho điều đó trông như thế này:

       <global>
    ...         
       <blocks>
        <smdzoom>
            <class>SMDesign_SMDZoom_Block</class>
        </smdzoom>
    </blocks>
    <blocks>
        <catalog>
            <rewrite>
                <product_view_media>SMDesign_SMDZoom_Block_Product_View_Media</product_view_media>
            </rewrite>
        </catalog>
    </blocks>
           ....
       </global>

Tôi muốn viết lại lớp này một lần nữa. Tôi muốn viết lại danh mục / sản phẩm_view_media mà mô-đun smdzoom này đang viết lại. Điều này có thể được thực hiện? Cấu hình xml sẽ trông như thế nào trong mô-đun của tôi để làm điều này?

Hiện tại đây là tập tin init xml mô-đun của tôi:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
        </Goorin_SMDZoom>
        <depends>
            <Mage_Catalog />
            <SMDesign_SMDZoom />
        </depends>
    </modules>
</config>

và tệp cấu hình mô-đun:

<global>
        <blocks>
            <gbismdzoom>
                <class>Goorin_SMDZoom_Block</class>
            </gbismdzoom>
            <catalog>
                <rewrite>
                    <product_view_media>Goorin_SMDZoom_Block_Product_View_Media</product_view_media>
                </rewrite>
            </catalog>
        </blocks>
    </global>

Lớp mới của tôi chỉ đơn giản là trông như thế này để thử nghiệm:

class Goorin_SMDZoom_Block_Product_View_Media extends SMDesign_SMDZoom_Block_Product_View_Media
{
    public function _construct() {
        parent::_construct();
    }
}

Tôi đang kiểm tra điều này bằng cách hiển thị các gợi ý đường dẫn mẫu và tôi thấy khối SMDesign vẫn đang được sử dụng trên trang xem sản phẩm. Tôi đang làm gì sai?

Câu trả lời:


13

Tôi đặt <depends>nút ở vị trí sai trong tệp init xml của mô-đun. Nó phải được lồng trong nút của tên mô-đun, như vậy:

<config>
    <modules>
        <Goorin_SMDZoom>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
                <SMDesign_SMDZoom />
            </depends>
        </Goorin_SMDZoom>
    </modules>
</config>

10

Phần này ở đây:

        <colorswatchproductview>
            <rewrite>
                <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
            </rewrite>
        </colorswatchproductview>

sẽ chỉ giúp bạn nếu việc khởi tạo ban đầu được thực hiện thông qua createBlock('colorswatchproductview/product_view_media)
điều này là không thể vì phần mở rộng đầu tiên đang sử dụng viết lại, tức là chúng muốn được hiển thị ở bất cứ đâu
createBlock('catalog/product_view_media') được sử dụng

Một tùy chọn sẽ là sử dụng viết lại cho cùng một khối

  <catalog>
    <rewrite>
      <product_view_media>Goorin_ColorswatchProductView_Block_Product_View_Media</product_view_media>
    </rewrite>
  </catalog>

và sau đó trong lớp khối của bạn mở rộng khối mở rộng khác

class Goorin_ColorswatchProductView_Block_Product_View_Media extends SMDesign_ColorswatchProductView_Block_Product_View_Media

Để làm việc này, tiện ích mở rộng của bạn cần được tải sau lần đầu tiên. Trong các thử nghiệm của tôi ở đây http://magebase.com/magento-tutorials/magento-extension-clashes-winners-and-loosers/ Tôi đã tìm ra thứ tự tải dựa trên thứ tự chữ cái của các tệp ứng dụng / etc / mô-đun / xml của bạn . Ngoài ra, thứ tự này có thể bị ảnh hưởng bằng cách sử dụng nút Phụ thuộc (SMDesign_Colorswatch ProducttView).

Bạn đang thấy thông báo lỗi vì bạn đang cố gắng hiển thị khối riêng lẻ nhưng nó cần một sản phẩm, nó tải từ khối chính của nó:

abstract class Mage_Catalog_Block_Product_View_Abstract extends Mage_Catalog_Block_Product_Abstract
{
    /**
     * Retrive product
     *
     * @return Mage_Catalog_Model_Product
     */
    public function getProduct()
    {
        $product = parent::getProduct();
        if (is_null($product->getTypeInstance(true)->getStoreFilter($product))) {
            $product->getTypeInstance(true)->setStoreFilter(Mage::app()->getStore(), $product);
        }

        return $product;
    }

Tôi đã tắt hướng dẫn của bạn và không thể viết lại lớp, ngay cả với nút phụ thuộc.
Nick Rolando

Hãy thử đổi tên tệp init xml mô-đun của bạn thành z.xml theo sau là làm mới bộ đệm.
Kristof tại Fooman

Xin lỗi tôi đã không trở lại vấn đề này trong một thời gian. Tôi đã đổi tên tệp init xml thành zzz.xml và việc viết lại đã hoạt động! Vì vậy, tôi đoán rằng tôi cần phải tìm ra lý do tại sao <depends>nút không hoạt động ..
Nick Rolando

Tôi +1 cảm ơn vì sự giúp đỡ và dẫn tôi đến câu trả lời :)
Nick Rolando

3

Đây là lý do tại sao viết lại các lớp cốt lõi hút.

Chụp từ đó, nhưng tôi nghĩ rằng cách tốt nhất của bạn là mở rộng việc thực hiện swatch màu của Mage_Catalog_Blog_Product_View_Media và sau đó làm cho mô-đun của bạn phụ thuộc vào mô-đun mẫu màu.

Alan Storm đã trả lời một câu hỏi tương tự ở đây .

Thậm chí tốt hơn là thử và làm bất cứ điều gì bạn đang cố gắng làm thông qua một người quan sát.

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.