Magento的主页在哪里拉?

val*_*len 0 php magento content-management-system magento-1.7

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

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

CCB*_*urn 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>
Run Code Online (Sandbox Code Playgroud)

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

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


Ala*_*orm 5

它可能不像你想的那样直截了当,但这是如何工作的.

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

在此输入图像描述

如果你看看indexAction方法,你可以看到Magento使用辅助对象的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');
    }
}
Run Code Online (Sandbox Code Playgroud)

$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);
}
Run Code Online (Sandbox Code Playgroud)

它包含对受保护_renderPage方法的调用.如果您跳转到THAT方法,页面加载代码是以下部分.

#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;
    }
    //...
}
Run Code Online (Sandbox Code Playgroud)

这会加载主页的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;
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

还有cms_page_render在页面加载_renderPage方法后触发的事件.您可以尝试在观察者中使用不同的ID重新加载传入的页面对象.你也可以考虑在一些model_load_aftermodel_load_before事件-尽管这得到棘手做到,因为你不能直接更改ID.

对于不会离开单个客户端系统的代码,我通常选择重写这些天,因为它更快(对客户来说更便宜)并且在开发期间具有更少的复杂性(即获取和更改所需的信息).权衡是与未来重写班级的其他人可能的未来冲突.

您的milage /哲学可能会有所不同.

祝好运!