Magento 1에서 블록 클래스를 재정의 / 재 작성하는 방법은 무엇입니까?


12

참고 : 이것은 블록 재 작성이 어떻게 작동 하는지를 완전히 설명하고보다 구체적인 "블록 X를 재정의하는 방법"또는 "재 작성이 작동하지 않는 이유"질문에 대한 중복 대상으로 사용될 수있는 표준 질문입니다.

참조 : Magento 1 재정의에 대한 정식 질문 찾기

사용자 정의 모듈에서 코어 블록 클래스를 변경해야합니다 (메소드 변경 또는 메소드 추가). 단계별로 어떻게해야합니까?

답변:


23

모든 블록 또는 블록 그룹은 config.xml이와 같은 모듈 파일 ( <global>태그 내부 )에 선언됩니다 .
다음은 카탈로그 모듈의 예입니다.

    <blocks><!-- marks definition of a block group -->
        <catalog><!-- unique alias for blocks in the module -->
            <class>Mage_Catalog_Block</class><!-- class prefix for all blocks -->
        </catalog>
    </blocks>

블록이 별칭을 사용하여 인스턴스화 할 수있는이 수단 접두사로 시작하는 클래스 경로의 나머지 부분입니다. 이는 기본적으로에 매핑 됨을 의미 합니다 . catalog/class_name_hereclass_name_here
catalog/class_name_hereMage_Catalog_Block_Class_Name_Here

블록을 다시 쓰려면 Magento_Catalog예제에서 변경하려는 모듈 ( )에 의존하는 모듈을 만들어야합니다 . 태그 아래
에 이것을 추가해야합니다 . config.xml<global>

<blocks>
    <catalog><!-- alias of the block group you are rewriting -->
        <rewrite><!-- reserved tag: specify that you are rewriting something -->
             <class_name_here>YourNamespace_YourModule_Block_Your_New_Class_Here</class_name_here> <!-- tag: the rest of the alias of the class you are rewriting. value: the name of your class that rewrites the core class -->
        </rewrite>
    </catalog>
</blocks>

그런 YourNamespace_YourModule_Block_Your_New_Class_Here다음 ZF 폴더 구조에 따라 클래스를 만들고이 클래스를 원래 클래스로 확장하십시오.

class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
    //your awesome code here
}

완료되면 컴파일을 비활성화하고 다시 활성화하고 (필요한 경우) 캐시를 지우십시오.

추상 블록에서는 작동하지 않습니다.
인스턴스화 된 클래스에서만 작동합니다.

자체 모듈 Marius_Test에 클래스가있는 app \ code \ core \ Mage \ Catalog \ Block \ Product \ View \ Options \ Type \ Select.php 파일을 다시 작성한다고 가정 해 봅시다 .Mage_Catalog_Block_Product_View_Options_Type_Select

그런 다음이 항목이 필요합니다 config.xml.

<blocks>
    <catalog>
        <rewrite>
            <product_view_options_type_select>Marius_Test_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
        </rewrite>
    </catalog>
</blocks>

app \ code \ local \ Marius \ Test \ Block \ Catalog \ Product \ View \ Options \ Type \ Select.php :

class Marius_Test_Block_Catalog_Product_View_Options_Type_Select extends Mage_Catalog_Block_Product_View_Options_Type_Select
{
    //your awesome code here
}

작동하지 않습니다. 나는 클래스를 덮어 시도 Mage_Catalog_Block_Product_View_Options_Type_Select\ 코드 \ 로컬 \ WR \ EPO \ 블록 \ 카탈로그 \ 블록 \ 제품 \보기 \ 옵션 \ 타입 \ Select.php 응용 프로그램 . :이처럼 그것을 시도 codepen.io/anon/pen/WYOqBr
블랙

그리고 그것이 효과가 없다면, 당신은 내 대답이 잘못되었다고 생각하기 때문에 당신은 아마도 당신이 잘못하고 있다고 생각하는 대신 그것을 하향 투표합니다. 어쨌든 ...이 교체 <Mage_Catalog_Block_Product_View_Options_Type_Select> WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select </Mage_Catalog_Block_Product_View_Options_Type_Select>와 함께 <product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>하고 있는지 확인 공백이 내부에 없는지 확인product_view_options_type_select
마리우스

귀하의 답변이 정확하지 않았기 때문에 공감했습니다. 단계별로 답변했지만 올바른 결과를 얻지 못했습니다. 클래스 이름을 사용해야한다고 썼으므로 사용했지만 작동하지 않았습니다. product_view_options_type_select실제 클래스 이름 대신 사용해야 합니다 Mage_Catalog_Block_Product_View_Options_Type_Select. 그에 따라 답변을 변경하면 투표하겠습니다.
블랙

당신이 그것을 단계별로 읽는다면 당신은 한 단계를 놓쳤다. 클래스 별칭이 무엇인지 설명하는 곳입니다. 붙여 넣기 만 복사하면 제대로 작동합니다. 17 명이 이해했습니다. 내가 올바르게 설명했다고 생각합니다
Marius

그렇습니다. 그러나 좋은 예가 없어서 우리는 당신의 이론을 올바르게 이해하고 있음을 확신 할 수 있습니다
Black

4

내 관점에서 재정의와 재 작성은이 두 가지가 다릅니다.

우세하다:

디자인 폴백 메커니즘을 사용할 때 재정의를하고 있습니다.

고쳐 쓰기:

클래스에서 magento Core 클래스를 다시 작성할 때 다시 작성합니다.

1) 재정의 예 :

app/code/core/Mage/Catalog/Block/Product/List.php파일 을 재정의 해야하는 경우 아래 표시된 동일한 경로로 로컬 모듈에 복사하십시오.app/code/local/Mage/Catalog/Block/Product/List.php

이것은 magento가 제안하지는 않지만 그렇게 할 수 있습니다.

2) 재 작성 예 :

이 블록 클래스를 다시 작성하려면 Mage_Adminhtml_Block_Sales_Order_Create모듈 config.xml을 다음과 같이 코딩하십시오.

    <global>
        <blocks>
            <adminhtml>
                <rewrite>

                    <sales_order_create>Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create</sales_order_create>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>

그리고 내 수업에서 Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

아래 코드처럼

class Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create extends Mage_Adminhtml_Block_Sales_Order_Create {
      My Function Or funcions That I want to Rewrite..
}

2

여기에 추가해야 할 점은 블록 재 작성 (및 다른 모든 Magento 모듈의 재 작성)은 더 높은 유지 보수 노력을 암시하므로 구성 조작, 이벤트 및 테마 사용자 정의 후에 기능을 확장 할 수있는 마지막 기회로 간주되어야합니다.

잠재적 문제 1 : 사용자 또는 다른 관리자가 Magento의 소스 파일을 업데이트 할 때 다시 작성된 템플릿이 업데이트되지 않습니다. 보안 수정 또는 개선이 코드에 적용되지 않음을 의미합니다. 블록을 포함한 다른 재 작성 클래스에도 동일하게 적용되지만 재 작성 횟수에 따라 다릅니다 (아래 참조).

잠재적 문제 2 : 재 작성된 블록 (또는 다른 클래스)이 귀하 또는 다른 관리자가 설치하려고하는 다른 확장 프로그램에 의해 재 작성된 것처럼 보일 수 있습니다. 그런 다음이 충돌을 해결해야합니다.

대안 1 : 이벤트를 사용하십시오. 즉, 원하는 기능을 달성하는 데 사용될 수있는 이벤트가 있는지 다시 작성하고 확인하려는 코드를 파헤칩니다.

대안 2 : 스마트하게 다시 작성, 즉 둘러보기 : 다시 작성하려는 클래스가 인스턴스화되는 위치를 확인하고 구성 또는 이벤트를 통해 선택되는 클래스에 영향을 줄 수 있는지 확인하십시오. 어쩌면 30 줄 메서드를 원래 클래스에서 다시 작성된 클래스로 복사하는 대신 3 줄 메서드를 재정 의하여 클래스 이름을 대체 할 수있는 클래스가있을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.