Magento的主页在哪里拉?

时间:2013-06-17 19:11:37

标签: php magento content-management-system magento-1.7

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

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

2 个答案:

答案 0 :(得分:6)

我喜欢Magento的一件事就是能够通过播放布局文件来完成很多事情。

我将参考Alan Storm的图片来说明我如何完成这项确切的任务而不必更改代码(我希望你不要介意Alan)。

enter image description here

如上图所示,完整操作名称为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静态块。它将使用与桌面主页相同的布局名称,但这已在移动模板中被覆盖。

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

答案 1 :(得分:5)

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

主页请求将路由到indexAction类的Mage_Cms_IndexController方法。

enter image description here

如果您查看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');
    }
}

$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方法的调用。如果你跳转到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;
    }
    //...
}

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

enter image description here

意味着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_aftermodel_load_before事件中的某些内容 - 尽管由于您无法直接更改ID而变得更加棘手。

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

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

祝你好运!