Magento主题继承了1个以上的包

时间:2012-07-01 11:04:36

标签: php magento

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

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

我想要以下内容:

主题 - > theme2 - >默认 - >基地

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

提前致谢?

1 个答案:

答案 0 :(得分: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);
}

正如您所看到的,它将遍历一个回退包/主题组合列表,直到找到包含它正在查找的文件的组合。如果没有找到它,最终将使用base / default。

不幸的是,传递给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;
}

对于包含some_package和主题some_theme的典型请求,它将是以下内容:

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

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

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