標準のHelperを拡張してカスタマイズする方法
CakePHP3、CakePHP4共通です。
CakePHP5ではAppView::loadHelper()がAppView::addHelper()に変更されています。
CakePHP2ではAppControllerの$helpersプロパティでHelperを指定します。
[参考記事] CakePHP2の場合
活用例
Formヘルパー指定の簡略化
一覧ページの検索フォームでページ番号などのパラメータを付与しない
AppView.phpのinitialize()に次のように書くとViewでHelperを呼び出すことができます。
$this->loadHelper('【Viewでのプロパティ名】', ['className' => '【呼び出されるクラス名】']);
標準のHelper(組み込みヘルパー/コアヘルパー)を別のクラスを使用するよう指定できます。
$this->loadHelper('Form', ['className' => 'CustomForm']);
テンプレートを指定する場合は配列に追加します。
$this->loadHelper('Form', ['className' => 'CustomForm', 'templates' => 'form-templates']);
独自のHelperはsrc/View/Helper配下に配置します。
例
src/View/AppView.php
class AppView extends View
{
/**
* Initialization hook method.
*
* Use this method to add common initialization code like loading helpers.
*
* e.g. `$this->loadHelper('Html');`
*
* @return void
*/
public function initialize(): void
{
// 拡張Helperを使用する
$this->loadHelper('Flash', ['className' => 'CustomFlash']);
$this->loadHelper('Form', ['className' => 'CustomForm']);
$this->loadHelper('Html', ['className' => 'CustomHtml']);
$this->loadHelper('Paginator', ['className' => 'CustomPaginator']);
$this->loadHelper('Url', ['className' => 'CustomUrl']);
}
}
src/View/Helper/CustomFlashHelper.php
<?php
declare(strict_types=1);
namespace App\View\Helper;
use Cake\View\Helper\FlashHelper;
/**
* FlashHelperの拡張ヘルパー
*
* @link https://book.cakephp.org/4/ja/views/helpers/flash.html
*/
class CustomFlashHelper extends FlashHelper
{
}
src/View/Helper/CustomFormHelper.php
<?php
declare(strict_types=1);
namespace App\View\Helper;
use Cake\View\Helper\FormHelper;
/**
* FormHelperの拡張ヘルパー
*
* @property \Cake\View\Helper\HtmlHelper $Html
* @property \Cake\View\Helper\UrlHelper $Url
* @link https://book.cakephp.org/4/ja/views/helpers/form.html
*/
class CustomFormHelper extends FormHelper
{
}
src/View/Helper/CustomHtmlHelper.php
<?php
declare(strict_types=1);
namespace App\View\Helper;
use Cake\View\Helper\HtmlHelper;
/**
* HtmlHelperの拡張ヘルパー
*
* @property \Cake\View\Helper\UrlHelper $Url
* @link https://book.cakephp.org/4/ja/views/helpers/html.html
*/
class CustomHtmlHelper extends HtmlHelper
{
}
src/View/Helper/CustomPaginatorHelper.php
<?php
declare(strict_types=1);
namespace App\View\Helper;
use Cake\View\Helper\PaginatorHelper;
/**
* PaginatorHelperの拡張ヘルパー
*
* @property \Cake\View\Helper\UrlHelper $Url
* @property \Cake\View\Helper\NumberHelper $Number
* @property \Cake\View\Helper\HtmlHelper $Html
* @property \Cake\View\Helper\FormHelper $Form
* @link https://book.cakephp.org/4/ja/views/helpers/paginator.html
*/
class CustomPaginatorHelper extends PaginatorHelper
{
}
src/View/Helper/CustomUrlHelper.php
<?php
declare(strict_types=1);
namespace Cake\View\Helper;
use Cake\View\Helper\UrlHelper;
/**
* UrlHelperの拡張ヘルパー
*
* @link https://book.cakephp.org/4/ja/views/helpers/url.html
*/
class CustomUrlHelper extends UrlHelper
{
}
Formヘルパー指定の簡略化
サイト全てで、$this->Form->control()に同じ指定をしていた場合にCustomFormHelperでcontrol()の指定をすると簡略化できます。
<?= $this->Form->control('title', ['label' => false, 'class' => 'form-control']); ?>
これを↓のように簡略化することができます
<?= $this->Form->control('title'); ?>
この例の場合は下記のように書きます。
class CustomFormHelper extends FormHelper
{
/**
* ラベルとラッパー div を備えたフォーム コントロール要素を生成します。
*
* @param string $fieldName This should be "modelname.fieldname"
* @param array<string, mixed> $options Each type of input takes different options.
* @return string Completed form widget.
* @link https://book.cakephp.org/4/ja/views/helpers/form.html#creating-form-controls
* @psalm-suppress InvalidReturnType
* @psalm-suppress InvalidReturnStatement
*/
public function control(string $fieldName, array $options = []): string
{
if (!isset($options['label'])) {
$options['label'] = false;
}
if (!isset($options['class'])) {
$options['class'] = 'form-control';
}
return parent::control($fieldName, $options);
}
}
一覧ページの検索フォームでページ番号などのパラメータを付与しない
一覧ページに検索フォームをつけた場合、ページ番号やソートなどのクエリパラメータはoptionでurlを指定しないとフォームのactionに引き継がれます。
<?= $this->Form->create($searchForm, ['url' => ['action' => 'index']]) ?> これを↓のように簡略化することができます <?= $this->Form->create($searchForm) ?>
この例の場合は下記のように書きます。
class CustomFormHelper extends FormHelper
{
/**
* HTML フォーム要素を返します。
*
* @param mixed $context The context for which the form is being defined.
* Can be a ContextInterface instance, ORM entity, ORM resultset, or an
* array of meta data. You can use `null` to make a context-less form.
* @param array<string, mixed> $options An array of html attributes and options.
* @return string An formatted opening FORM tag.
* @link https://book.cakephp.org/4/ja/views/helpers/form.html#Cake\View\Helper\FormHelper::create
*/
public function create($context = null, array $options = []): string
{
// 一覧ページの検索フォームでページ番号などのパラメータを付与しないようurlを指定する
if ($this->_View->getRequest()->getParam('action') == 'index') {
if (!isset($options['url'])) {
$options['url'] = ['action' => 'index'];
}
}
return parent::create($context, $options);
}
}
関連記事
- 標準のValidatorを拡張してカスタマイズする方法
- カラム一覧を取得する方法
- テンプレート(template)側でログイン情報を取得する方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 国際化i18n(多言語化)
- URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
- CakePHP4系の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation
- Seedを実行した後にシーケンスを更新する方法(duplicate key valueエラー)
- SQLクエリー(SQL文)を直接実行する方法
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- 1つのフィールドにバリデーションエラーを1つだけ表示させる方法
- CakePHP3
- CakePHPのバージョンごとのシステム要件
- AuthコンポーネントのパスワードをCakePHPを使用せずハッシュ化する方法(パスワードの生成ルール)
- CakePHP3系の入手方法・インストール方法
スポンサーリンク





