2010-05-12 1 views
10

내가 말할 수있는 한, Magento 외부에서 스크립트를 실행할 때 관찰자는 이벤트가 발생하면 호출되지 않습니다. 왜? 어떻게 수정해야합니까?Magento : 옵저버를 외부 스크립트에서 작동 시키려면 어떻게합니까?

다음은이 질문에 이끄는 원래의 문제입니다. 문제는 카탈로그 규칙을 적용 할 관찰자가 호출되지 않는다는 것입니다. 이벤트는 시작되지만 관찰자는 다시 시작하지 않습니다.


Magento 세션을로드하는 외부 스크립트를 실행하고 있습니다.

해당 스크립트 내에서 제품을로드하고 많은 속성을 가져옵니다. 한 가지 문제는 getFinalPrice()이 제품에 적용되는 카탈로그 규칙을 적용하지 않는다는 것입니다.

세션을 설정하기 위해 내가 아는 모든 것을하고 있으며, 불필요하다고 생각하는 많은 것들을하고 있습니다. 이 규칙이 적용되는 것 같지는 않습니다. 어떤 통찰력을 감사

require_once "app/Mage.php"; 
umask(0); 
$app = Mage::app("default"); 

$app->getTranslator()->init('frontend'); //Probably not needed 
Mage::getSingleton('core/session', array('name'=>'frontend')); 
$session = Mage::getSingleton("customer/session"); 
$session->start(); //Probably not needed 
$session->loginById(122); 

$product = Mage::getModel('catalog/product')->load(1429); 
echo $product->getFinalPrice(); 

:

다음은 테스트 스크립트입니다.

+2

어떤 이벤트에 연결하려고합니까? 그리고 이벤트 관찰자의 config.xml은 어떻게 생겼습니까? –

답변

11

명령 줄 스크립트를 실행할 때 <global /> 이벤트 만 실행되는 것처럼 보이기 때문에 처음으로 연결하려는 이벤트는 <frontend /> 또는 <admin /> 이벤트입니다.

Magento에는 "영역"이라는 개념이 있습니다. 영역은 일종의 개별 응용 프로그램과 비슷하지만 시스템에 살고 있습니다. (개념은 조금 어둡습니다.) 옵저버와 config.xml을 설정하면 <global /> 태그, <frontend /> 태그 또는 <admin /> 태그 일 수 있습니다.

이벤트와 관련하여 Magento는 특정 요청을 처리해야하는 영역 만로드합니다. 따라서 <global /> 영역이 항상로드됩니다. 그러나 응용 프로그램이 컨트롤러 디스패치에 도달하면 <frontend /> 또는 <admin /> 영역 만로드됩니다. 구체적으로 다음 파일/라인에 있습니다.

File: app/code/core/Mage/Core/Controller/Varien/Action.php 
Mage::app()->loadArea($this->getLayout()->getArea()); 

명령 줄 응용 프로그램에서는 절대로 발생하지 않습니다. <global /> 영역 만로드됩니다.

첫 번째 단락에서 언급했듯이 Magento가 응용 프로그램의 <frontend /> 영역을로드하지 않기 때문에 관찰자가 시작되지 않습니다. 해결책은 관찰자를 <global /> 영역으로 이동해보십시오. 당신은 또한 당신은 아마 웹 브라우저의 상황을 가정하여 생성 된 많은의 <frontend /> 지역에 모든 관찰자를로드 할 것입니다,하지만, 수동으로

Mage::app()->loadArea(Mage_Core_Model_App_Area::AREA_FRONTEND); 

를 호출 시도 할 수 있습니다.

아무 도움이되지 않는다면, 클래스의 dispatchEvent 메소드를 살펴보십시오. 그것이 이벤트 관측자가 호출하는 곳입니다.

+1

Magento 아키텍처의 또 다른 단원입니다. 고마워, 앨런. – Laizer

+1

스텔라가 앨런에게 대답했습니다. 정보 주셔서 감사합니다 :) –