Magento 在自定义模块中分配 visitor_id

Magento assign visitor_id in custom module

我是 Magento 的新手(我使用的是 1.9 版本),在观察者的自定义模块中,我希望拥有所有用户的 visitor_id,但是它仅在页面上执行某些操作后才分配。因此,如果您从某个页面重定向到 Magento 网上商店,那么 Observer 将捕获此操作,但不会找到 visitor_id,因为它尚未分配。我试图用下一个代码解决问题

config.xml:

        <controller_action_predispatch>
            <observers>
                <test_model_observer>
                    <type>singleton</type>
                    <class>Test_Model_Observer</class>
                    <method>setVisitorData</method>
                </test_model_observer>
            </observers>
        </controller_action_predispatch>

Observer.php

public function setVisitorData($observer)
{
    $session = Mage::getSingleton("core/session");
    $visitor_id = $session['visitor_data']['visitor_id'];
    $session_id = $session->getSessionId();
    if (!empty($visitor_id)) {
        Mage::getSingleton('log/visitor')->setId($visitor_id);
        Mage::getSingleton('log/visitor')->setSessionId($session_id);
    } else{
        $log_visitor = Mage::getSingleton('log/visitor')->initServerData()->setFirstVisitAt(now())->setIsNewVisitor(true)->setLastVisitAt(now())->save();
        $visitor_id = $log_visitor->getId();
        $session_id = $log_visitor->getSessionId();
    }
    if (!isset($session['visitor_data'])) {
        $session->setData('visitor_id', $visitor_id);
        $session->setData('session_id', $session_id);
    }
}

(原回答here

它在我浏览页面时有效,但当我只进入管理面板时它会中断尝试创建新的访问者重复 visitor_ids。知道如何解决这个问题吗?它不会破坏其他东西吗? (我的意思是在 Magento 本身调用之前调用该方法在我看来不是最佳实践)

您可以添加条件检查以查看活动页面是否为管理页面,最好的方法是将其添加到扩展程序的帮助程序中,文件应如下所示,文件路径为 {Namespace} /{模块名称}/Helper/Isadmin.php

class {{Namespace}}_{{Modulename}}_Helper_Isadmin extends Mage_Core_Helper_Abstract
    {
        public function isAdmin()
        {
            return (Mage::app()->getStore()->isAdmin() || Mage::getDesign()->getArea() == 'adminhtml') ? 
               true : 
               false ;
        }
    }

查看设计区域的第二次检查将覆盖诸如您的 magento 连接包下载器之类的页面

然后在您的模型中,将以下行添加到函数的开头

public function setVisitorData($observer)
{
    if(Mage::helper('modulename/isadmin')->isAdmin(){
        return;
    }
    $session = Mage::getSingleton("core/session");
    $visitor_id = $session['visitor_data']['visitor_id'];
    $session_id = $session->getSessionId();
    if (!empty($visitor_id)) {
        Mage::getSingleton('log/visitor')->setId($visitor_id);
        Mage::getSingleton('log/visitor')->setSessionId($session_id);
    } else{
        $log_visitor = Mage::getSingleton('log/visitor')->initServerData()->setFirstVisitAt(now())->setIsNewVisitor(true)->setLastVisitAt(now())->save();
        $visitor_id = $log_visitor->getId();
        $session_id = $log_visitor->getSessionId();
    }
    if (!isset($session['visitor_data'])) {
        $session->setData('visitor_id', $visitor_id);
        $session->setData('session_id', $session_id);
    }
}