2

在magento中是否有可能有一个主题继承自多个其他主题(除了基础)

典型的层次结构是主题 -> 默认 -> 基础。

我想要以下内容:

主题 -> 主题 2 -> 默认 -> 基础

这可能吗?如果没有,任何人都可以提供有关 magento 代码库的任何兴趣点供我研究可能的解决方案。

提前致谢?

4

1 回答 1

0

你寻求的答案在课堂Mage_Core_Model_Design_Package上。特别是_fallback方法:

protected function _fallback($file, array &$params, array $fallbackScheme = array(array()))
{
    if ($this->_shouldFallback) {
        foreach ($fallbackScheme as $try) {
            $params = array_merge($params, $try);
            $filename = $this->validateFile($file, $params);
            if ($filename) {
                return $filename;
            }
        }
        $params['_package'] = self::BASE_PACKAGE;
        $params['_theme']   = self::DEFAULT_THEME;
    }
    return $this->_renderFilename($file, $params);
}

如您所见,它将遍历一系列备用包/主题组合,直到找到一个包含它正在寻找的文件的组合。如果它没有找到它,它最终将使用基本/默认值。

不幸的是,传递给的数据fallbackScheme被硬编码在同一个类中,正如您在这个调用中看到的那样(尽管还有另一种方法可以做类似的事情,即getSkinUrl):

public function getFilename($file, array $params)
{
    Varien_Profiler::start(__METHOD__);
    $this->updateParamDefaults($params);
    $result = $this->_fallback($file, $params, array(
        array(),
        array('_theme' => $this->getFallbackTheme()),
        array('_theme' => self::DEFAULT_THEME),
    ));
    Varien_Profiler::stop(__METHOD__);
    return $result;
}

对于带有 packagesome_package和 theme的典型请求,some_theme它将是这样的:

array(3) {
  [0]=>
  array(0) {
  }
  [1]=>
  array(1) {
    ["_theme"]=>
    string(1) "some_theme"
  }
  [2]=>
  array(1) {
    ["_theme"]=>
    string(7) "default"
  }
}

如果您真的想要多个主题继承,则需要重写上述两个方法并添加额外的回退。

幸运的是,主题将成为 Magento2 中的模块,这将解决这个问题。

于 2012-07-01T13:21:07.260 回答