CakePHP3でページごとに読み込むJavaScript、CSSを変える処理の解説
2019/09/28
CakePHP3で JavaScriptを読み込む処理
CakePHP3で JavaScriptを読み込む処理の基本形から、JavaScriptの処理をブロック化してバッファリングする方法を解説していきます。
また、JavaScriptだけではなく、CSSも含めて、特定のページに特定の JavaScript、CSSを呼び出す方法を解説しています。
この記事は、下記のオフィシャルサイトを参考に書いています。
https://book.cakephp.org/3.0/ja/views/helpers/html.html#javascript
https://book.cakephp.org/3.0/ja/views.html#view-blocks
CakePHP3で JavaScriptを読み込む処理の基本形
CakePHP3で JavaScriptを読み込む処理の基本形・その1
CakePHP3で JavaScriptを読み込む処理の基本形として、アプリ内に JavaScriptのファイルが置いてある場合の処理方法です。
標準的に JavaScriptを置く場所は「/webroot/js」です。
JavaScriptのファイル名は「script-file.js」とします。
記述する対象ファイルは、以下です。
/src/Template/Layout/default.ctp
記述する内容は、以下の通りです。
1 |
<?= $this->Html->script('script-file') ?> |
上記のように記述すると、下記の様に出力されます。
1 |
<script src="/js/script-file.js"></script> |
HtmlHelperを使って呼び出す場合は、拡張子の「.js」の部分は記述しません。
また、HtmlHelperを使って記述するメリットは、環境が変わった時にも柔軟に対応できることです。
そのため、開発段階で「まずは動作させたい」と考えているときは、HtmlHelperを使わなくても問題ありません。
CakePHP3で JavaScriptを読み込む処理の基本形・その2
その1では、標準的な場所である「/webroot/js」にある場合の記述方法でしたが、それ以外の場所にある場合は、ファイルまでのパスを含めて記述します。
「/otherdir/script-file.js」を呼び出す場合は、以下のようになります。
1 |
<?= $this->Html->script('/otherdir/script-file') ?> |
CakePHP3で JavaScriptを読み込む処理の基本形・その3
その3では、外部のサイトにある JavaScriptを読み込む場合の処理の解説です。
実際によく使うであろう「jquery.com」にある「jquery-1.12.4.js」の JavaScriptを読み込む方法は下記の様になります。
1 |
<?= $this->Html->script('//code.jquery.com/jquery-1.12.4.js') ?> |
CakePHP3で JavaScriptを読み込む処理の基本形・その4
HtmlHelperでは複数の JavaScriptをまとめて読み込む方法も提供されています。
複数の JavaScriptをまとめて読み込む場合は、下記の様に配列で JavaScriptを指定します。
1 |
<?= $this->Html->script(['script-file1','script-file2','script-file3']) ?> |
上記のように記述すると、下記の様に出力されます。
1 2 3 |
<script src="/js/script-file1.js"></script> <script src="/js/script-file2.js"></script> <script src="/js/script-file3.js"></script> |
CakePHP3で JavaScriptをブロック化しバッファリングする
「CakePHP3で JavaScriptをブロック化しバッファリングする」と書いてしまうと、私のように、何を言っているのか分からない方もあるかと思います。
書き換えると「JavaScriptを、特定のページだけに、特定の JavaScriptを読み込めるようにしたいときに使える仕組み」です。
もっと平たく言うと、「この JavaScriptは、このページだけで読み込みたい。」「ページごとに読み込む JavaScriptを振り分けたい。」というときに使える仕組みです。
例えば「CakePHP3にデイトピッカー jQuery UI DatePickerを実装する手順の解説」「jQuery UI DatePickerの導入の方法。および、カスタマイズ方法の解説」「jQuery UI DatePickerに時間を入力できる機能を追加する方法解説」の解説の中で利用していますが、「DatePicker」の JavaScriptは、「DatePicker」を使うページが表示されるときだけ読み込まれるようにしています。
そのため、ここでのサンプルもその「DatePicker」を元に解説していきます。
また、「DatePicker」と同じくらい入力フォームに導入する場面があると思われる WYSIWYGエディタの導入方法については下記に記事を書いていますので、あわせて参考にしてください。
WYSIWYGエディタのCKEditor 4を設置、カスタマイズ、日本語化の方法を解説
WYSIWYGエディタのCKEditor 5を設置、カスタマイズ、日本語化の方法を解説
CakePHP3にWYSIWYGエディタのCKEditor4を設置、カスタマイズ方法を解説
ブロック化してバッファリングする JavaScriptを記述する
まずは、処理に必要な JavaScriptを記述します。
記述する対象ファイルは、以下です。
/src/Template/*****/add.ctp
/src/Template/*****/edit.ctp
下記のソースコードを追記します。
追記する箇所は、ファイルのどこでも OKですが、個人的には分かりやすさを優先して、ファイルの先頭に追記しています。
1 2 3 4 5 |
<?= $this->Html->scriptStart(['block' => true]) ?> $( function() { $( "#datepicker" ).datepicker(); } ); <?= $this->Html->scriptEnd() ?> |
「scriptStart」「scriptEnd」と書かれていますので、分かると思いますが、1行目がスクリプトのスタートの記述で、最後の行が終了の記述です。
この中に記述されたスクリプトをブロック化してバッファリングするための処理になります。
上記のように記述すると、下記の内容がバッファリングされます。
1 2 3 4 5 |
<script> $( function() { $( "#datepicker" ).datepicker(); } ); </script> |
バッファリングした JavaScriptを編集する処理を記述
前項でバッファリングした JavaScriptを HTMLに編集する処理は以下の通りです。
記述する対象ファイルは、以下です。
/src/Template/Layout/default.ctp
記述するソースコードは以下になります。
1 |
<?= $this->fetch('script') ?> |
これを記述した場所に、先にバッファリングした JavaScriptのソースコードが記述されます。
そのため、「<head>~</head>」の間に記述するのか、「</body>」の直前に記述するのかは、適宜決めてください。
(表示スピードを高速化するため、一般的には「</body>」の直前に置くことが多いです。)
こうすることにより、バッファリングした JavaScriptがあるテンプレート(ここでは、「add.ctp」「edit.ctp」)が呼ばれたときのみ、「DatePicker」の JavaScriptが読み込まれることになり、テンプレートごとに必要となる JavaScriptを個別に読み込むことができるようになります。
ちなみに、「$this->fetch('script')
」は、デフォルトのテンプレートにはあらかじめ記述がありますので、わざわざ追加する必要はなさそうです。
CakePHP3で JavaScriptをブロック化しバッファリングする・その2
先の項目は、JavaScriptの処理を下記の様に「scriptStart()」「scriptEnd()」を使って、JavaScriptをブロック化して、JavaScriptを書く場所と、編集する場所の自由度を増やす、という仕組みでした。
1 2 3 |
<?= $this->Html->scriptStart(['block' => true]) ?> : <?= $this->Html->scriptEnd() ?> |
じゃぁ、外部のファイルを読み込むときはどうするの?
という場合の対処方法がこの項の解説です。
外部ファイルを読み込むときはもっと簡単で、下記の様に、JavaScriptを読み込む処理に「,[‘block’ => true]」を追加するだけです。
1 |
<?= $this->Html->script('script-file',['block' => true]) ?> |
これで、「script-file.js」はブロック化されますので、下記の「fetch()」が記述されているところに編集されます。
1 |
<?= $this->fetch('script') ?> |
CakePHP3で CSSをブロック化しバッファリングする
先の項目は、JavaScriptを読み込む処理に「,[‘block’ => true]」を追加することで、JavaScriptをブロック化する処理の説明でした。
これと同じ方法で CSSもブロック化することが可能です。
CSSの標準的な読み込みの方法は、下記の通り JavaScriptとほぼ同じで、「script」を「CSS」に置き換えるだけです。
1 |
<?= $this->Html->css('teststyle') ?> |
これに、「,[‘block’ => true]」を追加することで、CSSをブロック化することができます。
1 |
<?= $this->Html->css('teststyle',['block' => true]) ?> |
呼び出す方法も「fetch()」の「script」を「CSS」に置き換えるだけです。
1 |
<?= $this->fetch('css') ?> |
CakePHP3でなんでもブロック化して編集する
先の項目では、JavaScriptと CSSを呼び出す HtmlHelperを利用してブロック化する処理を解説してきました。
ですが、CakePHP3では、JavaScriptや CSSだけではなく、何でもブロック化することができて、それを自由に望む場所に編集することができる仕組みが用意されています。
JavaScriptをブロック化する方法・CakePHP3.4
下記を「add.ctp」「edit.ctp」に記述します。
これで、「start()」「end()」で囲まれた記述がブロック化されます。
1 2 3 4 5 6 7 |
<?= $this->start('testscript') ?> <script> $( function() { $( "#datepicker2" ).datepicker(); } ); </script> <?= $this->end() ?> |
「start()」のパラメーターとして記述してある「testscript」が、ブロックの名前として指定したものです。
そして、それを下記の通り「default.ctp」に記述します。
1 |
<?= $this->fetch('testscript') ?> |
これで、前項で説明した JavaScriptと同じ内容が編集されます。
JavaScriptをブロック化する方法・CakePHP3.6 2018.05.09 追記
CakePHP 3.4では上記の記述方法でも問題ありませんでしたが、CakePHP3.6では「Warning (4096): Object of class App\View\AppView could not be converted to string [APP/Template\Topics\add.ctp, line **]」のエラーが出る場合があるようです。
その場合は、下記の様に記述を変更します。
1 2 3 4 5 6 7 |
<?php $this->start('testscript') ?> <script> $( function() { $( "#datepicker2" ).datepicker(); } ); </script> <?php $this->end() ?> |
何が違うかというと、1行目と最後の行の「<?=」となっていたところが「<?php」となっている点です。
CakePHP3.4で上記の記述方法をしてもエラーは出ませんので、常に上記の記述方法を採っても問題なさそうです。
テンプレートファイル(エレメント)をブロック化する方法
上記の例は JavaScriptなので紛らわしいですが、下記の様に、テンプレートファイル(エレメント)を読み込む場合にも使えます。
1 2 3 |
<?= $this->start('sidebar') ?> <?= $this->element('sidebar/recent_topics'); ?> <?= $this->end() ?> |
下記を「default.ctp」に記述することでその場所に読み込んだテンプレートファイルが編集されます。
1 |
<?= $this->fetch('sidebar') ?> |
これを利用することで、特定の画面にだけ表示するサイドバーの処理を簡単に実装することができるようになります。
ブロック化を利用して OGPやパンくずを設定する方法・CakePHP3.6 2019.09.28 追記
ここで紹介したブロック化の処理を利用することで OGPを設定することもできるようになります。
レイアウトファイルに OGPを編集する箇所に「fetch」を記述し、テンプレートファイル側で OGPに記載する内容を編集する、という仕組みです。
詳しくは下記の記事を参考にしてください。
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のOGPはHTMLヘルパーの$this->Html->meta()を使って設定
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP3のfriendsofcake/searchでツリーカテゴリーの子階層も含めて検索する方法
CakePHP3のツリービヘイビアを使ったツリーカテゴリーの子階層も含めての検索を検索プラグイン「friendsofcake/search」を使って実現する方法を解説しました。
-
CakePHP3、CakePHP4のdatetime型カラムの日時の扱い。秒まで表示する方法
CakePHP3の日時カラムで秒まで扱う場合はdate()、strtotime()関数ではうまくいかない。CakePHP3であらかじめ用意された「i18nFormat()」を使用する。
-
CakePHP3でWarning Error: SplFileInfo::openFile()エラーが発生した場合の対処方法
CakePHP3のキャッシュファイルのパーミッションエラー Error: SplFileInfo::openFile()が発生した場合の対応方法解説。app.phpにキャッシュファイルのパーミッション設定を行い、既存のファイルは削除。
-
CakePHP3のルーティング(routes.php)の変更が反映されない時はキャッシュのクリアを
CakePHP3でルーティングの設定変更をしたけど反映されない!そんなときは慌てず騒がずキャッシュをクリアしよう!ルーティングの設定もキャッシュされることがあるらしい。
-
CakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でレコードを追加、更新(Insert、Update)する記述方法を解説。1件ずつ処理、全件をまとめて処理、条件に該当する複数件のレコードを処理方法をサンプルコードを用いて解説。
-
CakePHP3のデバッグキット(DebugKit)を強制的に有効、無効に変更する方法
CakePHP3に付属しているデバッグのためのツール、デバッグキットを強制的に有効化、無効化する方法を解説。初期設定では開発環境としてありそうなドメインの場合のみ有効になるように設定されている。
-
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でajaxを利用する処理の実装方法を解説。プルダウンを変更するとデータベースの値を取得し検索結果の内容を変更するというような処理を想定。CakePHP3.6以降の CSRF対策対応済。
-
CakePHP4のCakeDC/Usersのログイン時のリダイレクトとユーザ権限管理の設定解説
CakeDC謹製UsersプラグインのCakePHP4版の紹介。ログイン認証後にリダイレクトする先の設定方法についての解説と実運用するために必要なコツを解説。便利な仕組みも仕様の理解があって初めてうまく使いこなせる。
-
CakePHP3の更新画面でUpload Plugin 3.0を使う方法、viewで使う方法解説・その3
CakePHP3でファイル、画像をアップロードするプラグイン、upload plugin 3を導入する手順を解説した記事。3部作のその3で記事を更新する際のファイルの取り回しなどについてを解説。
-
CakePHP 2.3 Search Pluginで検索処理 その1設置方法
CakePHPの検索プラグイン Search Pluginの設置方法と基本的な検索処理の解説です。