참고 : 이것은 블록 재 작성이 어떻게 작동 하는지를 완전히 설명하고보다 구체적인 "블록 X를 재정의하는 방법"또는 "재 작성이 작동하지 않는 이유"질문에 대한 중복 대상으로 사용될 수있는 표준 질문입니다.
사용자 정의 모듈에서 코어 블록 클래스를 변경해야합니다 (메소드 변경 또는 메소드 추가). 단계별로 어떻게해야합니까?
참고 : 이것은 블록 재 작성이 어떻게 작동 하는지를 완전히 설명하고보다 구체적인 "블록 X를 재정의하는 방법"또는 "재 작성이 작동하지 않는 이유"질문에 대한 중복 대상으로 사용될 수있는 표준 질문입니다.
사용자 정의 모듈에서 코어 블록 클래스를 변경해야합니다 (메소드 변경 또는 메소드 추가). 단계별로 어떻게해야합니까?
답변:
모든 블록 또는 블록 그룹은 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_here
class_name_here
catalog/class_name_here
Mage_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_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
. 그에 따라 답변을 변경하면 투표하겠습니다.
내 관점에서 재정의와 재 작성은이 두 가지가 다릅니다.
우세하다:
디자인 폴백 메커니즘을 사용할 때 재정의를하고 있습니다.
고쳐 쓰기:
클래스에서 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..
}
여기에 추가해야 할 점은 블록 재 작성 (및 다른 모든 Magento 모듈의 재 작성)은 더 높은 유지 보수 노력을 암시하므로 구성 조작, 이벤트 및 테마 사용자 정의 후에 기능을 확장 할 수있는 마지막 기회로 간주되어야합니다.
잠재적 문제 1 : 사용자 또는 다른 관리자가 Magento의 소스 파일을 업데이트 할 때 다시 작성된 템플릿이 업데이트되지 않습니다. 보안 수정 또는 개선이 코드에 적용되지 않음을 의미합니다. 블록을 포함한 다른 재 작성 클래스에도 동일하게 적용되지만 재 작성 횟수에 따라 다릅니다 (아래 참조).
잠재적 문제 2 : 재 작성된 블록 (또는 다른 클래스)이 귀하 또는 다른 관리자가 설치하려고하는 다른 확장 프로그램에 의해 재 작성된 것처럼 보일 수 있습니다. 그런 다음이 충돌을 해결해야합니다.
대안 1 : 이벤트를 사용하십시오. 즉, 원하는 기능을 달성하는 데 사용될 수있는 이벤트가 있는지 다시 작성하고 확인하려는 코드를 파헤칩니다.
대안 2 : 스마트하게 다시 작성, 즉 둘러보기 : 다시 작성하려는 클래스가 인스턴스화되는 위치를 확인하고 구성 또는 이벤트를 통해 선택되는 클래스에 영향을 줄 수 있는지 확인하십시오. 어쩌면 30 줄 메서드를 원래 클래스에서 다시 작성된 클래스로 복사하는 대신 3 줄 메서드를 재정 의하여 클래스 이름을 대체 할 수있는 클래스가있을 수 있습니다.
Mage_Catalog_Block_Product_View_Options_Type_Select
에 \ 코드 \ 로컬 \ WR \ EPO \ 블록 \ 카탈로그 \ 블록 \ 제품 \보기 \ 옵션 \ 타입 \ Select.php 응용 프로그램 . :이처럼 그것을 시도 codepen.io/anon/pen/WYOqBr