使用magento事件观察器以编程方式更改存储视图

时间:2013-04-19 11:01:50

标签: magento

我正在抓住以下事件来做进一步的逻辑:

core_block_abstract_prepare_layout_before

在Observer类中我这样做:

Mage::app()->setCurrentStore($storeView);

Mage::run($storeCode, "store");

但这会引发异常:

  

Mage注册表项“application_params”已经存在

基本上我要做的是“根据当前的IP更改语言(商店视图)”,我试图通过magento自定义模块来实现这一点。

我希望能够使用magento event observer以编程方式更改magento的默认商店视图?并且可以在不重定向到所选商店的情况下这样做,我的意思是在页面加载之前设置商店视图的值吗?

2 个答案:

答案 0 :(得分:6)

这就是我解决问题的方法。我已经安装了GeoIP扩展。由此我们可以获得基于IP的国家代码。我在观察者中添加了一个函数,这只会在页面加载时触发一次事件controller_action_predispatch,在观察者中,我使用一个开关案例在商店之间切换。这是我的功能&切换案例。

public function getLocationInfoByIp($observer) {

        $geoIP = Mage::getSingleton('geoip/country');
        $cnCode =  $geoIP->getCountry(); 

        switch ($cnCode) {

            case "US": {
                  Mage::app()->setCurrentStore('en');
                  break;
            }
            case "IN": {
                Mage::app()->setCurrentStore('de');
                break;
            }
            default: {
                Mage::app()->setCurrentStore('en');
                break;
            }
       }
 }

答案 1 :(得分:0)

U可以使用ip重定向到商店视图。无需使用Mage :: run

  switch(trim($countryCode))  
                 {  
                       case 'CH':  
                                $url = $siteurl . '?___store=german';  
                                header( 'Location:' . $url);die;  
                       break;  
                       case 'DE':  
                                     $url = $siteurl . '?___store=german';  
                                     header( 'Location:' . $url);die;  
                       break;  
                       case 'IN':  
                                 $url = $siteurl . '?___store=english';  
                                 header( 'Location:' . $url);die;  
                       break;  
                       default:  
                       $url = $siteurl . '?___store=usa';  
                                 header( 'Location:' . $url);die;  
                       break;  
                 }