4

背景

我已经接管了具有自定义主题的 Magento Enterprise 网站的开发。创建自定义主题时,使用的是基本默认模板而不是企业默认模板,因此该主题没有任何企业功能。

我已经设置了一个与此站点上使用的版本号(1.11.1.0)相匹配的 vanilla Magento Enterprise 安装,并且我正在慢慢地通过区分这两个站点并一次将功能添加回一个模块中。

但是,我遇到了横幅功能如何工作的障碍,因此我在尝试调试自定义主题中缺少的内容以使其正常工作时遇到问题。

我所知道的

该功能在我的 vanilla Enterprise 网站上运行良好。

横幅模块没有 XML 布局文件,这是有道理的,因为它们是在管理部分中动态创建的,它允许您选择要将横幅小部件插入的页面/块。

使用商业错误并查看已编译的页面布局 XML,横幅 XML 节点肯定会被插入,因此不会以编程方式(通过 PHP)在其他模板或块中创建。

我已经查看了横幅模块和观察者/事件,但看不到与如何插入节点有任何相关性的任何内容。

它似乎与企业 CMS 模块相结合。

我在 FPC 模块中找到了对横幅的引用,但 FPC 在此站点上未使用,并且在禁用 FPC 时不会命中这些方法。

我已经仔细检查过,模块输出在 Admin Advanced 中没有被禁用。

我正在使用带有企业/默认值的 DesignFallbacks 模块,但这也没有帮助。

我已经在自定义站点上以与 vanilla 企业站点完全相同的方式设置了一些横幅,但是编译的 XML 没有插入横幅节点。

我在 Google 和 Stack Overflow 上进行了搜索,但有关 Enterprise Banners 的信息非常有限,而且我能找到的仅涉及管理部分,而不是它们如何从代码级别运行。

这一切现在导致...

我想知道的

横幅 XML 节点如何/在何处进入布局 XML。

4

1 回答 1

3

Mage_Core_Model_Layout_Updateapp/code/core/Mage/Core/Model/Layout/Update.php包含负责加载包布局 XML 的代码。通常,大部分情况都是在fetchFileLayoutUpdates方法中处理的。

但是,这个类中有一个鲜为人知的方法,名为fetchDbLayoutUpdates. 此方法从数据库加载布局更新 XML并将其与包布局合并。

public function fetchDbLayoutUpdates($handle)
{
    $_profilerKey = 'layout/db_update: '.$handle;
    Varien_Profiler::start($_profilerKey);
    $updateStr = Mage::getResourceModel('core/layout')->fetchUpdatesByHandle($handle);
    if (!$updateStr) {
        return false;
    }
    $updateStr = '<update_xml>' . $updateStr . '</update_xml>';
    $updateStr = str_replace($this->_subst['from'], $this->_subst['to'], $updateStr);
    $updateXml = simplexml_load_string($updateStr, $this->getElementClass());
    $this->fetchRecursiveUpdates($updateXml);
    $this->addUpdate($updateXml->innerXml());

    Varien_Profiler::stop($_profilerKey);
    return true;
}

Mage::getResourceModel('core/layout')资源模型与表对应core_layout_update。在 Magento Enterprise 中,此表是存储横幅相关布局更新的位置。

mysql> select * from core_layout_update\G
*************************** 1. row ***************************
layout_update_id: 1
          handle: cms_index_index
             xml: <reference name="top.container"><block type="enterprise_banner/widget_banner" name="b6d24980179958bad81911d80bce5f36" template="banner/widget/block.phtml"><action method="setData"><name>display_mode</name><value>fixed</value></action><action method="setData"><name>banner_ids</name><value>1</value></action><action method="setData"><name>unique_id</name><value>e2fb0962e605ed01d3759cf531402534</value></action></block></reference>
      sort_order: 0
*************************** 2. row ***************************
layout_update_id: 2
          handle: cms_index_index
             xml: <reference name="footer.before"><block type="enterprise_banner/widget_banner" name="2b2de5c74183936eb4514e860a09e265" template="banner/widget/block.phtml"><action method="setData"><name>display_mode</name><value>fixed</value></action><action method="setData"><name>banner_ids</name><value>2</value></action><action method="setData"><name>unique_id</name><value>1760872fb38c6042c8aee848bf86bf59</value></action></block></reference>

此表并非专门用于横幅更新 — 只是 Enterprise_Banner 模块的开发人员选择使用 的功能fetchDbLayoutUpdates来实现其功能。

于 2013-05-21T04:17:01.667 回答