0

내 목표는 우리 가게의 모든 페이지에 입력 할 때 URL 리퍼러 및 키워드를 저장하는 것입니다. 내 checked this question and its answer 내 문제에 약간의 빛을하려고합니다.magento 접근 referer URL 및 키워드 저장

나는 다음있어 접근 방식은 다음과 같습니다

  1. 는 각 페이지 (테스트, 노력)에로드 할 수 있도록 기본 레이아웃에 충실하는 블록을 가지고. 이 블록은 다음 코드를 사용하여 리퍼러를 읽습니다.

    $ request [ 'url'] = $ this-> getRequest() -> getServer ('HTTP_REFERER');

  2. 다음 함수는 컨트롤러에 $ 요청을 전달합니다. 이 단계에서는 리디렉션을 사용하여 여전히 어떻게하는지 모릅니다. 또는 dispatchEvent를 호출하고 postAction 함수를 갖는 컨트롤러에서?

    //on the phtml file 
    <div> 
        <?php 
          $request['url'] = getRequest()->getServer(‘HTTP_REFERER’); 
          Mage::dispatchEvent("allpagescontroller", $request); 
        ?> 
    </div> 
    
  3. 컨트롤러 내가 CRUD 작업을 수행하는 모든 appropiate 코드를가집니다 모델에 neeeded 값

    //on the controller 
    function postAction ($params) 
    { 
        $referer = $this->getRequest()->getPost(); 
    } 
    
  4. 를 삽입/내 모델을 인스턴스화하고 업데이트 할 setter를 호출합니다

이 정보가 맞습니까? 이러한 단계를 수행하여 Magento MVC 방식을 따르려고합니다. 지금은 phtml 파일의 모든 코드를 가지고 있습니다. 나는 리퍼러를 얻고 그것을 분할하고 모든 것을 저장하기 위해 모델을 인스턴스화합니다. 그러나 이것이 정확하지 않다는 것을 압니다. 대한 config.xml 파일에

지금 내가 가진 :

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Dts_Allpages> 
      <version>0.1.0</version> 
     </Dts_Allpages> 
    </modules> 
    <global> 
     <models> 
      <allpages> 
       <class>Dts_Allpages_Model</class> 
       <resourceModel>allpages_mysql4</resourceModel> 
      </allpages> 
      <allpages_mysql4> 
        <class>Dts_Allpages_Model_mysql4</class> 
       <entities> 
        <keywords> 
         <table>keywords</table> 
        </keywords> 
        <referencedpages> 
         <table>referencedpages</table> 
        </referencedpages> 
       </entities> 
      </allpages_mysql4> 
     </models> 
     <blocks> 
      <allpages> 
       <class>Dts_Allpages_Block</class> 
      </allpages> 
     </blocks> 
     <helpers> 
      <allpages> 
       <class>Dts_Allpages_Helper</class> 
      </allpages> 
     </helpers> 
     <resources> 
      <allpages_write> 
       <connection> 
        <use>core_write</use> 
       </connection> 
      </allpages_write> 
      <allpages_read> 
       <connection> 
        <use>core_read</use> 
       </connection> 
      </allpages_read> 
     </resources> 
    </global>> 
    <frontend> 
     <routers> 
      <allpages> 
       <use>standard</use> 
       <args> 
        <module>Dts_Allpages</module> 
        <frontName>allpages</frontName> 
       </args> 
      </allpages> 
     </routers> 
     <layout> 
      <updates> 
       <allpages> 
        <file>allpages.xml</file> 
       </allpages> 
      </updates> 
     </layout> 
    </frontend> 
</config> 

답변

0

당신의 논리가 젠토 MVC 흐름의 측면에서 올바르지 않습니다. 템플릿은 프로그램 흐름의 마지막 중지 지점이므로 ANY 논리를 템플릿에 삽입하면 안됩니다. 시스템이 불안정한 혼란으로 바뀔 수 있기 때문입니다.

달성하려는 논리에는 전혀보기가 필요하지 않습니다. 그것은 컨트롤러도 필요하지 않습니다. 아시다시피 Magento는 Event-Observer 패턴을 사용하며 작업은이를 요구합니다.

Observer를 작성하고 초기 요청 플로우에서 일부 이벤트를 수신해야합니다. 모든 페이지 요청에서 트리거되는 모든 이벤트를들을 수 있지만 너무 빨라서는 안됩니다. 시스템 자체가 아직 초기화되지 않았고 너무 늦어서는 안되며 다른 시스템 로직의 일부가 가능할 때 , 번을으로 리디렉션하거나 리퍼러으로 약간 변경하십시오. 나는 controller_action_predispatch가 당신의 요구에 맞을 것이라고 생각합니다.

Observer에서 을 가져와 Model 레이어를 사용하여 DB에 저장할 수 있습니다. 즉 따라야 할 올바른 경로가 있다면

+0

다시 EventObservers이 코드는 ... 나는 의심했다.나를 위해 그것을 정리하지 않았다. 따라서 블록, 템플릿 또는 컨트롤러를 추가 할 필요가 없습니다. 이벤트 관찰자의 모든 논리 만 추가하면됩니다. 테스트해볼거야. – Yaroslav

+0

나는 모든 페이지의 프리 디스패치 이벤트를 듣는 방법에 집착하고있다. – Yaroslav

+0

@Yaroslav이 - 다음은 사용자 정의 모듈에 삽입해야 설정의 예' 목록 allpages/관찰자 saveReferrer'당신은 saveReferrer 방법과 관찰자의 모델을 생성해야하며, 모든 페이지 요청시 트리거되어야합니다. –

0

를 사용하여 내 방식에 observer

$url = Mage::helper('core/http')->getHttpReferer() ? Mage::helper('core/http')->getHttpReferer() : Mage::getUrl(); 
Mage::app()->getFrontController()->getResponse()->setRedirect($url); 
Mage::app()->getResponse()->sendResponse(); 
exit;