magento report_event 表分析

标签 magento

我需要创建一些关于 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/

相关文章:

mysql 添加复合主键约束

php - 找不到表 "sales_flat_quote_address"- 复制现有 Magento 站点以在本地运行时

magento - magento商店中标题的打洞

Magento 自定义运输模块 - fatal error : Call to a member function setStore()

MySql 停止写入,但继续读取

magento - 如何在magento主页显示产品描述

javascript - 单页结账未继续下一步

php - 自定义 Magento 主题不工作

php - 以编程方式将产品添加到购物车并更改价格

javascript - 扩展 validation.js 并验证单个元素