我假设它是应用程序布局文件之一 - 我想在我的移动模板中编写一个钩子来拉出另一个CMS主页。
编辑:为了澄清,我希望实现一个不同的cms页面,用于移动版本的商店与桌面版本。由于您只能在magento admin中设置一个默认CMS页面,因此在移动模板文件中似乎需要一些自定义编码。
答案 0 :(得分: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静态块。它将使用与桌面主页相同的布局名称,但这已在移动模板中被覆盖。
这可能不是最好的方法,但它不涉及代码更改。
答案 1 :(得分: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');
}
}
$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页面呈现。可能与您的兴趣相关,内容布局块最终看起来像这样
意味着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_after
或model_load_before
事件中的某些内容 - 尽管由于您无法直接更改ID而变得更加棘手。
对于不会离开单个客户系统的代码,我通常选择重写这些天,因为它更快(对客户来说更便宜)并且在开发过程中具有更少的复杂性(即获取和更改所需的信息) 。这种权衡可能会与正在改写课程的其他人发生冲突。
您的milage /哲学可能会有所不同。
祝你好运!