Magentoでサブドメイン毎に独自のテーマを管理できるようにskin_dirを階層化する
skin_dirとdesign_dirをフレキシブルにしただけではテーマを動的に管理できない
Magentoのindex.phpを共有するタイプのマーケットプレイスを構築している。
サブドメイン毎にテーマを個別に開発できるようにする必要があるので、標準で、
/skin
になっている階層を
/skin/[サブドメイン名]
という階層にカスタマイズしないといけない。
Magentoの場合は、skin_dirの他に
design_dir
というテーマ関連の階層が存在し、
- skin_dir → 静的ファイル
- design_dir → HTMLを構成するファイル
上の2つの階層にテーマ関連のファイルを保存しているので、双方のディレクトリをサブドメイン単位で動的に設定してみた。
index.phpでテーマディレクトリを階層化
Magentoのindex.phpでグローバルレベルでテーマをサブドメイン単位で階層化することができる。
$new_dirs = array( 'design_dir' => MAGENTO_ROOT."/app/design/".$_SERVER['SERVER_NAME'], 'skin_dir' => MAGENTO_ROOT."/skin/".$_SERVER['SERVER_NAME'] ); Mage::run($mageRunCode, $mageRunType, $new_dirs);
しかし、この設定だけだとskin_dirは、階層化されず画像やCSSが取得できない。
var_dump($this->_data['skin_dir']);
として確認すると、
/skin/[サブドメイン名]
と表示されるものの、
var_dump(Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_SKIN));
フロント側で利用しているskinのパスを表示するMagento関数でパスを確認してみると、
/skin
と表示されデフォルトの設定のままパスが出力される。
おまけではないが、Magentoのデバッグ知識として、テーマのhead領域を出力方法は、
var_dump($this->getLayout()->getBlock('head')->toHtml(););
上のコードで可能であることを補足しておこう。
フロント側でもskin_dirを変更する
フロント側のskin_dirを変更するためには、Magentoの管理画面から設定することが可能。
System → Configuration → サイドバーのWeb
に進むと
- Unsecure
- Secure
を設定する項目が表示され、この画面からフロント側のskin_dirを変更することが出来る。
画像の通り設定すれば、skin_dirは、
/skin/sub2.magento.local
に変更される。
管理画面からではなく、プログラムでセットアップする場合は、
Magentoのストアセットアップスクリプトに書いてある方法をパラメータを変更することで自動セットアップすることが可能。