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);
}

ご覧のとおり、探しているファイルを含むものが見つかるまで、フォールバック パッケージ/テーマの組み合わせのリストをループします。見つからない場合は、最終的に 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 のモジュールになり、この問題は解決されます。

于 2012-07-01T13:21:07.260 に答える