0

我假设它是应用程序布局文件之一 - 我想在我的移动模板中编写一个挂钩来拉取不同的 CMS 主页。

编辑:澄清一下,我想实现为移动版商店与桌面版的主页拉取不同的 cms 页面。由于您只能在 magento admin 中设置一个默认的 CMS 页面,因此移动模板文件中似乎需要一些自定义编码。

4

2 回答 2

6

我喜欢 Magento 的一件事是能够完成很多事情,只需使用布局文件即可。

我将参考 Alan Storm 的图片来说明我是如何在不更改代码的情况下完成这个确切的任务(我希望你不介意 Alan)。

在此处输入图像描述

如上图所示,完整的操作名称是 cms_index_index。您可以使用 Commerce Bug 等调试工具找到此信息。

由于我们有动作名称,我们可以更改布局文件以指向特定于移动设备的主页。在这种方法中,特定于移动设备的主页实际上是一个静态块。

设置移动设备特定内容后,您可以将以下内容添加到移动模板 local.xml 文件中,以将此块用于您的主页:

<cms_index_index>
      <block type="cms/block" name="cms_page"><action method="setBlockId"><block_id>mobile_home</block_id></action></block>
</cms_index_index>

在这种情况下,我设置了一个 mobile_home 静态块。它将使用与桌面主页相同的布局名称,但这已在移动模板中被覆盖。

这可能不是最好的方法,但它不涉及代码更改。

于 2013-06-17T23:13:28.173 回答
5

它可能不像您希望的那样简单,但这就是它的工作原理。

对主页的请求被路由到类的indexAction方法Mage_Cms_IndexController

在此处输入图像描述

如果你看一下indexAction方法,你可以看到 Magento 使用helper 对象的renderPage方法来渲染页面的内容cms/page

#File: app/code/core/Mage/Cms/controllers/IndexController.php
public function indexAction($coreRoute = null)
{
    $pageId = Mage::getStoreConfig(Mage_Cms_Helper_Page::XML_PATH_HOME_PAGE);
    if (!Mage::helper('cms/page')->renderPage($this, $pageId)) {
        $this->_forward('defaultIndex');
    }
}

$pageId是从 Magento 的系统配置中提取的,是 CMS 页面的 URL 标识符。

如果你跳到renderPage方法

#File: app/code/core/Mage/Cms/Helper/Page.php
public function renderPage(Mage_Core_Controller_Front_Action $action, $pageId = null)
{
    return $this->_renderPage($action, $pageId);
}

它包装了对受保护_renderPage方法的调用。如果你跳到那个方法,页面加载代码是以下部分。

#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action  $action, $pageId = null, $renderLayout = true)
{
    $page = Mage::getSingleton('cms/page');
    //...
    if (!$page->load($pageId)) {
        return false;
    }
    //...
}

这会加载主页的 CMS Page 对象。请注意,该模型是一个单例,这意味着稍后实例化该单例的其他代码将具有相同的页面。在此之后,发生标准的 Magento 页面渲染。可能与您的兴趣相关,内容布局块最终看起来像这样

在此处输入图像描述

这意味着 CMS 页面的块 HTML 由以下代码呈现Mage_Cms_Block_Page

#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _toHtml()
{
    /* @var $helper Mage_Cms_Helper_Data */
    $helper = Mage::helper('cms');
    $processor = $helper->getPageTemplateProcessor();
    $html = $processor->filter($this->getPage()->getContent());
    $html = $this->getMessagesBlock()->toHtml() . $html;
    return $html;
}

getPage方法实例化了我们上面提到的同一个单例。另一个代码是将 CMS 页面{{...}}指令替换为其实际内容。

如果我正在处理这个项目,我会考虑对Mage_Cms_Model_Page看起来像这样的对象进行类重写。

public function load($id, $field=null)
{
    if( ... is mobile site ... AND  ... $id is for the home page ...)
    {
        $id = ... ID of the mobile site, hard coded or pulled from custom config ...;
    }

    return parent::load($id, $field);
}

在方法中加载页面后还会cms_page_render触发事件_renderPage。您可以尝试在观察者中使用不同的 ID 重新加载传入的页面对象。您还可以在model_load_afterormodel_load_before事件中考虑一些东西——尽管这样做会变得更棘手,因为您不能直接更改 ID。

对于不会离开单个客户系统的代码,我现在通常选择重写,因为它在开发过程中更快(对客户来说成本更低)并且复杂性更少(即获取和更改您需要的信息)。权衡是未来可能与正在重写课程的其他人发生冲突。

您的里程/理念可能会有所不同。

祝你好运!

于 2013-06-17T22:12:45.410 回答