我假设这是一个应用布局文件--我想在我的手机模板中写一个钩子来拉取一个不同的CMS主页。
编辑:为了澄清,我想实现一个不同的cms页面拉动的移动版本的商店与桌面版本的主页。由于您只能在magento管理中设置一个默认CMS页面,因此似乎需要在移动模板文件中进行一些自定义编码。
发布于 2013-06-18 07:13:28
我喜欢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-18 06:12:45
它可能不像您希望的那样直接,但它是如何工作的。
对主页的请求被路由到Mage_Cms_IndexController类的indexAction方法。

如果查看一下indexAction方法,就会发现Magento使用了cms/page辅助对象的renderPage方法来呈现页面内容
#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);
}还有一个在_renderPage方法中加载页面后触发的cms_page_render事件。您可以尝试在观察器中使用不同的ID重新加载传入的页面对象。您还可以考虑在model_load_after或model_load_before事件中做一些事情-尽管这会变得更加棘手,因为您不能直接更改ID。
对于不会离开单个客户端系统的代码,我现在通常选择重写,因为它更快(对客户端来说成本更低),并且在开发过程中不会太复杂(即获取和更改您需要的信息)。权衡的是将来可能会与其他重写类的人发生冲突。
你的经验/哲学可能会有所不同。
祝好运!
https://stackoverflow.com/questions/17155006
复制相似问题