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のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつテンプレートファイルがどこにあるか、設定情報ファイルがどこにあるか、を説明しつつカスタマイズの方法を解説します。
-
-
CakePHP3で保存前にバリデーション結果を取得する2つの方法
CakePHP3でデータベースに値を保存する前にバリデーションを行い、その結果によって処理を振り分ける方法について解説。「$topic->errors()」と「$topic->hasErrors()」の2つの方法がある。
-
-
CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつ、テンプレートファイル、設定情報ファイルの場所とそれらをカスタマイズする方法を説明します。
-
-
CakePHP3で「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」などのエラーが出たときの確認するポイント
CakePHP3の開発で発生する「SQLSTATE[23000]: Integrity constraint violation」「SQLSTATE[42S22]: Column not found」のエラーには特有の原因もあるため、その説明と対処方法の解説。
-
-
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。
-
-
CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)
CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。
-
-
CakePHP5系でDeprecatedを回避しfindListでキーと値のカラムを指定して取得する方法
CakePHP4のfindListでキーと値のカラムを指定してテーブルにアクセスする方法がCakePHP5では「Deprecated(非推奨)」となった。推奨の記述方法を解説。
-
-
CakePHP3のアソシエーションでJOINのタイプのLEFT、INNERを切り替えながら使う方法
CakePHP3でテーブルのアソシエーションしたデータの取得をコントローラー側でINNERかLEFTを指定する方法を解説。TableファイルにINNERで指定していてもController側で変更ができる。
-
-
CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う
CakePHP3、CakePHP4では処理を高速化する手法の一つとしてキャッシュを利用している。しかし、その情報は元の情報を更新しても反映されない場合がある。そんなときはキャッシュを削除する必要がある。
-
-
CakePHP3でデータを保存する save()で発生するエラーを確認する方法を解説
CakePHP3でデータ保存処理のログを取得する方法。save()では true、falseの戻り値しか取得できないが、saveOrFail()と try…catch文を使いエラーログ、エンティティを取得し、不具合の解析を行う。