val*_*len 0 php magento content-management-system magento-1.7
我假设它是应用程序布局文件之一 - 我想在我的移动模板中编写一个钩子来拉取不同的CMS主页.
编辑:为了澄清,我希望实现为移动版本的商店与桌面版本提供不同的cms页面.由于您只能在magento admin中设置一个默认CMS页面,因此在移动模板文件中似乎需要一些自定义编码.
我喜欢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静态块.它将使用与桌面主页相同的布局名称,但这已在移动模板中被覆盖.
这可能不是最好的方法,但它不涉及代码更改.
它可能不像你想的那样直截了当,但这是如何工作的.
主页的请求被路由到类的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_after
或model_load_before
事件-尽管这得到棘手做到,因为你不能直接更改ID.
对于不会离开单个客户端系统的代码,我通常选择重写这些天,因为它更快(对客户来说更便宜)并且在开发期间具有更少的复杂性(即获取和更改所需的信息).权衡是与未来重写班级的其他人可能的未来冲突.
您的milage /哲学可能会有所不同.
祝好运!
归档时间: |
|
查看次数: |
1429 次 |
最近记录: |