【FuelPHP】コントローラーやアクション毎に自動でcss、jsを読み込む
FuelPHPでコントローラーやアクションのページに応じたcssやjsファイルを自動で読み込みたい!
assetsの中でviewsと同じディレクトリ構造でcssやjsのファイルを配置すると、
それに対応するページで自動で読んでくれるようにしたい。
Controllerでそのページ特有のcss,jsファイルを読み込む方法
Controllerで
<?php Asset::css(['style.css'], [], 'style_css', false);
のように書き、 テンプレートで
<?= Asset::render('style_css') ?>
と書くことで、そのページでだけファイル読み込めます。
いちいち書くのが面倒なので、、
public/assets/css
public/assets/js
の中にviewsと同じディレクトリ構造でcssやjsを置くだけで勝手に読んで欲しい。
そこで、controllerの共通部分(Controller_Baseなどを作ってそれを他のControllerで継承する)に
<?php $controller = mb_strtolower(str_replace('Controller/', '', strtr(Request::main()->controller, '_', '/'))); $action = Request::main()->action; if (File::exists(DOCROOT.'assets/css/'.$controller.'.css')) { Asset::css(array($controller.'.css'), array(), 'controller_style_css', false); } if (File::exists(DOCROOT.'assets/css/'.$controller.'/'.$action.'.css')) { Asset::css(array($controller.'/'.$action.'.css'), array(), 'action_style_css', false); } if (File::exists(DOCROOT.'assets/js/'.$controller.'.js')) { Asset::js(array($controller.'.js'), array(), 'controller_script_js', false); } if (File::exists(DOCROOT.'assets/js/'.$controller.'/'.$action.'.js')) { Asset::js(array($controller.'/'.$action.'.js'), array(), 'action_script_js', false); }
と書き、テンプレートには
<?= Asset::render('controller_style_css') ?> <?= Asset::render('action_style_css') ?> <?= Asset::render('controller_script_js') ?> <?= Asset::render('action_script_js') ?>
と書きます。
これで、assetsの中にviewsと同じディレクトリ構造とファイル名でcssやjsを置くと、
それに対応したcontroller、actionでファイルを読み込んでくれます。
例えば、
Userコントローラーにindexアクションとcreateアクションがある場合、
/assets/css/user.css
はindexアクションとcreateアクションの両方で読まれます。
/assets/css/user/index.css
はindexアクションでのみ読まれます。
もっといいやり方あったら教えて下さい。