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);
}
}
我是 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);
}
}