2009-07-29 76 views
5

想想一个小的基本联盟系统。我要像Magento路由器:如何捕获所有网址中的参数?

www.myshop.com/mynewproduct.html?afid=123 

每次afid的URL在URL中发现,一个方法应被调用(基本形成节约“AFID”在会话中,当客户购买的东西,我想跟踪它)。

有人在这里谁知道如何做到这一点?每个提示都被接受;-)

回答

20

你不需要路由器。您需要设置一个事件侦听器,用于触发每次页面加载,然后访问请求集合中的变量。 controller_front_init_routers事件应该这样做。

因此,设置你的模块具有以下

<global> 
    <events> 
     <controller_front_init_routers> 
      <observers> 
       <packagename_modulename_observer> 
        <type>singleton</type> 
        <class>Packagename_Modulename_Model_Observer</class> 
        <method>interceptMethod</method> 
       </packagename_modulename_observer> 
      </observers> 
     </controller_front_init_routers>  
    </events> 
</global> 

然后配置创建下面的类

app/code/local/Packagename/Modulename/Model/Observer.php 
class Packagename_Modulename_Model_Observer { 
    public function interceptMethod($observer) { 
     $request = $observer->getEvent()->getData('front')->getRequest(); 
     $afid  = $request->afid; 

     //do whatever you want with your variable here 
    } 
} 

interceptMethod可以被命名为任何你想要的。

+1

谢谢!那样的方式;-) – Max 2009-07-30 07:13:57

1

我知道这是一个非常古老的答案,但如果我们打算在会话中存储这些参数(这是原始问题的场景),则应该提及我们不应该使用controller_front_init_routers事件。例如,如果您在此时实例化customer/session,那么您将无法再执行客户登录。 Alan自己在http://alanstorm.com/magento_sessions_early中指出了这一点。顺便说一句,感谢艾伦这篇伟大的文章。