1

是否可以从布局文件中加载另一个主题的模板文件?所以而不是像

<reference name="head">
    <block type="page/template_links" name="customvars" as="customVars" template="page/html/customvars.phtml"/>
</reference>

一个人可能有:

 <reference name="head">
    <block type="page/template_links" name="customvars" as="customVars" template="page/html/customvars.phtml" template="otherTheme" />
</reference>

或者:

<reference name="head">
    <block type="page/template_links" name="customvars" as="customVars" template="/app/design/frontend/default/otherTheme/page/html/customvars.phtml"/>
</reference>
4

3 回答 3

1

如果您看一下,Mage_Core_Block_Template::getTemplateFile()这在标准 Magento 中是不可能的。

public function getTemplateFile()
{
    $params = array('_relative'=>true);
    $area = $this->getArea();
    if ($area) {
        $params['_area'] = $area;
    }
    $templateName = Mage::getDesign()->getTemplateFilename($this->getTemplate(), $params);
    return $templateName;
}

您需要的是在代码中设置$params['_package']$params['_theme']。作为起点,您可以将此信息存储在块参数中,然后将其复制到$params数组中。

但是您可以为产品和类别包指定自定义主题 - 也许这已经有用了?

于 2012-11-21T09:51:18.960 回答
0

使用事件观察器可以在渲染指令编译之前注入自定义渲染配置。碰巧,这与控制器操作执行相切,考虑到请求对象的参与,这似乎是合适的。要观察的事件是controller_action_layout_load_before,这是观察者逻辑:

class Some_Observer
{
    /**
     * Observer to inject update handles via query string.
     *
     *
     * @param Varien_Event_Observer $o
     * @return void
     */
    public function addQueryStringHandle(Varien_Event_Observer $o)
    {
        $update  = $o->getLayout()->getUpdate();
        /* @var $update Mage_Core_Model_Layout_Update */

        $query = $o->getAction()->getRequest()->getQuery();

        if (is_array($query) && count($query)) {
            foreach ($query as $name => $param) {
                if($this->_isValidXmlName($name)) {
                    $update->addHandle('QS_'.$name); // QS_ prefix should prevent collisions
                }
            }
        }
    }

    /**
     * Check validity of arbitrary external string as XML safe
     *
     * @link http://stackoverflow.com/a/2519943/833795
     * @param string $name
     * @return bool
     */
    protected function _isValidXmlName($name)
    {
        try {
            new DOMElement($name);
            return true;
        } catch(DOMException $e) {
            return false;
        }
    }
}

可以通过将以下内容添加到./index.php的末尾来检查效果:

Zend_Debug::dump(Mage::app()->getLayout()->getUpdate()->getHandles());

应该测试这个解决方案,尤其是在启用布局缓存的情况下。将某些参数列入白名单甚至可能是谨慎的。

于 2012-11-23T19:58:26.197 回答
0

我正在为任何想要实现这一目标的人添加这个答案。

要从不同的主题加载模板,您只需保持 local.xml 相同(通常的配置),然后在控制器中添加此代码,指定包和主题以用于在以下位置查找模板文件:

Mage::getSingleton('core/design_package')
->setPackageName('package')
->setTheme('theme');

此代码取自 Magento 在使用“自定义设计”时如何为类别页面应用不同的主题。它在我的一个现场网站上进行了测试和工作。

于 2016-04-25T09:02:25.267 回答