たこぼんげブログ

大学院博士課程から脱落してWEB業界に就職しました。

【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アクションでのみ読まれます。

もっといいやり方あったら教えて下さい。