gpt4 book ai didi

magento report_event 表分析

转载 作者:行者123 更新时间:2023-12-02 16:05:56 25 4
gpt4 key购买 nike

我需要创建一些关于 magento 数据的自定义报告。

我要做的第一项工作是改进集成到 Magento 中的“查看的产品”报告。

我已经设法确定此报告的数据取自“report_event”表,但是我需要了解该数据的一些特殊性。

首先,我假设 event_type_id 为 1(即根据引用表的“catalog_product_view”),列 object_id 和 subject_id 分别存储产品的 ID 和访客的 ID。但是,有大量的 subject_id 为零的条目,但 object_id 保存了有效产品的 id。

我需要知道的是这是如何发生的......即我们如何在report_event表中获取满足以下条件的条目:

事件类型 ID = 1

object_id = [有效产品 ID]

subject_id = 0

非常感谢,期待

最佳答案

TL;博士:

一个report_event.subject_id == 0通常是忽略的用户代理明确排除的路由触发通常由Magento记录的事件的结果。

参见app/code/core/Mage/Log/etc/config.xml :

<config>
<global>
<!-- : -->
<ignoredModules>
<entities>
<install/>
<adminhtml/>
<admin/>
</entities>
</ignoredModules>
<ignore_user_agents>
<google1>Googlebot/1.0 (googlebot@googlebot.com http://googlebot.com/)</google1>
<google2>Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)</google2>
<google3>Googlebot/2.1 (+http://www.googlebot.com/bot.html)</google3>
</ignore_user_agents>
<!-- : -->
</global>
</config>

长答案

为了解释为什么会发生这种情况,我需要更详细地说明。

当任何 Magento Controller 操作即将被调度时, controller_action_predispatch事件将在操作实际发生之前被触发。

再看看app/code/core/Mage/Log/etc/config.xml :

<config>
<frontend>
<events>
<controller_action_predispatch>
<observers>
<log>
<class>log/visitor</class>
<method>initByRequest</method>
</log>
</observers>
</controller_action_predispatch>
<!-- : -->
</events>
</frontend>
</config>

表明,Mage_Log模块定义 controller_action_predispatch 的观察者事件,由方法 Mage_Log_Model_Visitor::initByRequest() 表示:

public function initByRequest($observer)
{
if ($this->_skipRequestLogging || $this->isModuleIgnored($observer)) {
return $this;
}

$this->setData($this->_getSession()->getVisitorData());
$this->initServerData();

if (!$this->getId()) {
$this->setFirstVisitAt(now());
$this->setIsNewVisitor(true);
$this->save();
}
return $this;
}

该属性(property)$this->_skipRequestLogging将是true ,当发送当前请求的用户代理与 <ignored_user_agents /> 之一匹配时(GoogleBot)。

方法$this->isModuleIgnored()仅返回 true ,如果请求路由与 <ignoredModules /> 之一匹配(即 install/adminhtml/admin/ ;在 EE 中也为 api/ )。

关键是,如果其中一个都返回 true ,那么观察者立即退出,即根本不会创建/保存访问者

现在,使用 catalog_product_view 进一步解释以案例为例,看一下另一个配置文件 app/code/core/Mage/Reports/etc/config.xml这次:

<config>
<frontend>
<events>
<catalog_controller_product_view>
<observers>
<reports>
<class>reports/event_observer</class>
<method>catalogProductView</method>
</reports>
</observers>
</catalog_controller_product_view>
<!-- : -->
</events>
</frontend>
</config>

它定义了 catalog_controller_product_view 的观察者事件,代表为 Mage_Reports_Model_Event_Observer::catalogProductView()方法:

public function catalogProductView(Varien_Event_Observer $observer)
{
$productId = $observer->getEvent()->getProduct()->getId();

Mage::getModel('reports/product_index_viewed')
->setProductId($productId)
->save()
->calculate();

return $this->_event(Mage_Reports_Model_Event::EVENT_PRODUCT_VIEW, $productId);
}

该观察者的最后一行调用 _event()方法:

protected function _event($eventTypeId, $objectId, $subjectId = null, $subtype = 0)
{
if (is_null($subjectId)) {
if (Mage::getSingleton('customer/session')->isLoggedIn()) {
$customer = Mage::getSingleton('customer/session')->getCustomer();
$subjectId = $customer->getId();
}
else {
$subjectId = Mage::getSingleton('log/visitor')->getId();
$subtype = 1;
}
}

$eventModel = Mage::getModel('reports/event');
$storeId = Mage::app()->getStore()->getId();
$eventModel
->setEventTypeId($eventTypeId)
->setObjectId($objectId)
->setSubjectId($subjectId)
->setSubtype($subtype)
->setStoreId($storeId);
$eventModel->save();

return $this;
}

看看else block ,尤其是这一行:

$subjectId = Mage::getSingleton('log/visitor')->getId();

当由于忽略的用户代理或排除的路线而根本无法创建/保存访问者时,$subjectId将是null .

自表列subject_id定义为NOT NULL(请参阅app/code/core/Mage/Reports/sql/reports_setup SQL 脚本),0终于得救了。

那是因为Data Type Default Values MySQL 的。

关于magento report_event 表分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10916789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com