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


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_duplicate및 catalog_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.