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);
}
ご覧のとおり、探しているファイルを含むものが見つかるまで、フォールバック パッケージ/テーマの組み合わせのリストをループします。見つからない場合は、最終的に 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;
}
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"
}
}
複数のテーマの継承が本当に必要な場合は、上記の 2 つのメソッドを書き直して、フォールバックを追加する必要があります。
幸いなことに、テーマは Magento2 のモジュールになり、この問題は解決されます。