마 젠토 옵저버 이벤트-작업 순서


9

catalog_model_product_duplicate이벤트에 기능을 주입하려고합니다 . 이 모듈의 일부는 복제 된 제품의 재고 상태도 복제되도록하는 것입니다. 현재는 그렇지 않습니다.

CatalogInventory이 이벤트 를 관찰하고 표준 재고 정보를 설정합니다. 지역 행사 전에 핵심 행사가 해결 될 수 있습니까? 내가 의지 할 수있는 작업 순서가 있습니까?

답변:


11

이벤트가 전달되는 순서는 모듈이로드되는 순서에 따라 다릅니다. CatalogInventory모듈 옵저버가 동작하기 전에 반드시 모듈 옵저버가 실행되도록해야하기 때문에 모듈에 따라 모듈을 구성하기 만하면 Mage_CatalogInventory됩니다. app/etc/modules/My_Module.xml파일 의 코드에 종속 노드를 추가하여이를 수행 할 수 있습니다 .

<config>
    <modules>
        <My_Module>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </My_Module>
    </modules>
</config>

depends가 당신보다 먼저로드 젠토 코어 모듈을 강제로 위의 XML의 노드는, 여기서 구성의 중요한 조각이다.


7

이벤트가 전달되는 순서는 쉽게 보장 할 수 없습니다. 모듈이로드되는 순서에 따라 다릅니다. 일반적으로 모든 핵심 이벤트 관찰자는 커뮤니티 및 로컬 코드 풀 관찰자보다 먼저 호출됩니다.

핵심 모듈의 로컬 또는 커뮤니티 모듈에 대한 종속성을 "가짜"로 지정하여 사용자 지정 마 젠토 옵저버를 강제로 실행시키는 방법이 있습니다. Lee의 답변을 여기에서 살펴보십시오 : 기존 마 젠토 옵저버 전에 커스텀 옵저버를 발사하십시오 .

/app/etc/modules/Groupname_Page.xml

<config>
    <modules>
        <Groupname_Page>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <!-- Your dependencies go here -->
            </depends>
        </Groupname_Page>
        <Enterprise_PageCache>
            <depends>
                <Groupname_Page />
            </depends>
        </Enterprise_PageCache>
    </modules>
</config>

나는 그 의존성이 어떤 결과를 가져올 지 모르기 때문에 개인적으로 그 접근법을 좋아하지 않습니다.

유스 케이스의 경우 데이터 / 상태를 감지하여 실행 여부를 알 수 있어야합니다. 이벤트 순서를 강제하는 것보다 모델에서 데이터 / 상태를 확인하는 것이 좋습니다.


그러나 제 경우에는 재고 품목이 아직 존재하지 않으면 아무 조치도 취하지 않습니다. 나중에 이벤트가 복제 방법의 결과인지 알기 위해 스니핑 할 생각이 있습니까?
philwinkle

5

일반적인 답변

관찰자는 먼저 영역 별로 실행 된 다음 모듈로드 순서에 따라 실행됩니다.

즉, 등록 된 모든 옵저버는 또는에 등록 된 모든 옵저버 보다 먼저<global> 실행 됩니다.<frontend><adminhtml>

영역 내에서 옵저버는 병합 된 구성 XML 트리에 나타나는 순서대로 실행됩니다. 이는 기술적으로 모듈이로드 된 순서를 의미합니다.

모듈 로딩 순서는 다음과 같이 결정됩니다.

  1. 의 종속성 그래프는의 <depends>정의에서 작성 app/etc/modules/*.xml됩니다. X가 Y에 의존하는 경우 Y가 X보다 먼저로드됩니다.

  2. 종속성별로 주문한 후 핵심 모듈이 커뮤니티 및 로컬 모듈보다 우선합니다.

  3. 다른 모든 것은 알파벳 순서로로드됩니다. 파일 이름 app/etc/modules은 실제 모듈 이름이 아니라 비교에 사용됩니다.

따라서 모듈 로딩 순서에 영향을주는 두 가지 옵션이 있습니다.

  1. 관찰자가 실행 한 후 다른 모듈에 의존하거나 다른 모듈을 사용하여 관찰자를 실행하게하십시오.
  2. 모듈 정의 파일의 이름을 바꾸십시오. 파일 이름은 로딩 순서 외에는 중요하지 않으므로 모듈 자체의 이름을 바꿀 필요가 없습니다.

( "3. 핵심 코드 풀에 모듈 추가"는 계산되지 않습니다)

또한보십시오:


1

그냥 제안을 모두 관찰 catalog_model_product_duplicatecatalog_model_product_save_after싱글 관찰자. 에서 catalog_model_product_duplicate설정 인벤토리 데이터 관찰자 데이터와 같은, 그리고에서 catalog_model_product_save_after사용하는 중복 된 제품에 대한 채우기 재고 데이터.


그래서 당신은 이벤트에서 나에게 주어진 객체에 속성을 저장 한 다음 테스트 catalog_model_product_save_after할 수 있습니다. 유일한 함정은 save()아무 생각도 하지 않고 재산을 유지하는 것입니다 ...
philwinkle

제품이 아닌 재고 모델을 저장하므로 루프에 걸리지 않아야합니다.
Petar Dzhambazov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.