在magento中是否有可能有一个主题继承自多个其他主题(除了基础)
典型的层次结构是主题 -> 默认 -> 基础。
我想要以下内容:
主题 -> 主题 2 -> 默认 -> 基础
这可能吗?如果没有,任何人都可以提供有关 magento 代码库的任何兴趣点供我研究可能的解决方案。
提前致谢?
你寻求的答案在课堂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 中的模块,这将解决这个问题。