1

我最近为我的 Magento 网站开发了一个新的移动主题,包含与普通桌面主题不同的 CSS/JS/layout/template 文件。

如果检测到移动用户代理字符串,我在设计部分使用 Magento 的“匹配表达式”功能切换到移动主题。

我希望移动站点的主页与桌面站点不同,但是这两个主题都在正常的商店视图之外运行,所以我不知道该怎么做。

是否可以按主题设置不同的主页,而不是按商店查看?

因此,如果桌面用户导航到 www.example.com/,他们会看到 CMS 页面“home”,但如果移动用户导航到相同的 URL,他们会看到 CMS 页面“mobile-home”?

4

3 回答 3

2

@Marius 的回答是正确的,当只考虑安装 Magento 库存时,您无法分离 CMS 页面的布局,但是话虽如此,Magento 仍然是 OOP 和 PHP,所以有一种方法可以设置一个工具来做你想做的事。

它的诀窍是创建一个自定义布局处理程序,该处理程序被添加到 CMS 的页面布局中,这样,您可以通过 layout.xml 文件在页面上指定您想要的内容。

我自己做了这个,所以这是可能的。

创建一个自定义模块,该模块具有一个布局文件和一个观察者模型,该模型具有可以在以下事件上触发的功能。

<controller_action_layout_load_before>

然后可以使用此功能来确定您在哪个页面上。这是我在函数中用于注入布局句柄的代码(这可以大大改进以获得更好的可伸缩性)

// Triggered on the controller_action_layout_load_before Event
public function addCustomHandles( $observer ) {
    $update = Mage::getSingleton('core/layout')->getUpdate();

    if ( Mage::app()->getFrontController()->getRequest()->getModuleName() == 'cms' ) {
        $update->addHandle( 'cmslayouthandler_cms_page_' . Mage::getSingleton('cms/page')->getIdentifier() );
    }
}

此函数获取布局单例,确认它在 CMS 页面上,并根据当前选定的页面构造一个处理程序。它将添加如下处理程序:

'cmslayouthandler_cms_page_home'

然后,您将能够在您创建的模块布局文件中更新该页面的布局,有点像这样:

<layout version="1.0.0">
<cmslayouthandler_cms_page_home>
    <reference name="content">
        <block type="core/template" name="home_page" template="page/template/home.phtml" />
    </reference>
</cmslayouthandler_cms_page_home>
</layout>

考虑到通过 Magento 管理面板创建的 CMS 页面需要在“内容”部分中有一个值,您可以轻松地放置一个空白的虚拟值或直接通过数据库将值清零,我个人更喜欢第一种方法。

祝你好运!

于 2013-10-13T23:18:57.773 回答
1

我最终尝试了上述 Marius 的建议,并cms.xml使用我自己的模板进行了编辑以覆盖索引页面(即主页),该模板有效:

<cms_index_index translate="label">
    <reference name="content">
       <block type="catalog/navigation" name="alternative_home" template="alternative_home.phtml" />
    </reference>
    <remove name="cms.wrapper"/>
</cms_index_index>

您可能还希望尝试覆盖cms_index_defaultindex

于 2013-10-27T19:12:19.553 回答
0

同一个商店视图中不能有 2 个主页。
但是您可以在同一页面上添加两个页面内容的内容,并隐藏不需要的内容。如果您在移动设备上隐藏桌面内容,反之亦然。

于 2013-10-13T18:25:02.697 回答