CakePHP3のFormHelperのデフォルトを変える

CakePHP3でフォームを書く際に、divとかラベルとかの制御はそれぞれのメソッドのパラメータからできたんですが、CakePHP3になってなんかうまくいかないことが多い。

スポンサーリンク

ということで、どうやって変更するかというと…

$myTemplates = [
    'inputContainer' => '


<div class="form-control">{{content}}</div>



',
];
$this->Form->setTemplates($myTemplates);
// 3.4 より前
$this->Form->templates($myTemplates);

$myTemplatesはどうやって書けばいいんだよというのは
vendor\cakephp\cakephp\src\View\Helper\FormHelper.php
$_defaultConfig[‘templates’]に書いてあるのを参考にすればなんとなくわかるかと思います。

で、こんなのいちいちめんどくさーい。という場合はどうするか。
各ControllerもしくはAppControllerでhelperを呼び出す際にデフォルト値を渡してあげればよいようです。
例えばこんな感じ

class AppController extends Controller
{
    public $helpers = [
        'Html',
        'Form' => [
            'templates' => [
                // Used for button elements in button().
                'button' => '<button{{attrs}}>{{text}}</button>',
                // Used for checkboxes in checkbox() and multiCheckbox().
                'checkbox' => '<input type="checkbox" name="{{name}}" value="{{value}}"{{attrs}}>',
・・・・以下省略・・・・
                //Confirm javascript template for postLink()
                'confirmJs' => '{{confirm}}',
            ],
        ]
    ];
}

渡す値は
vendor\cakephp\cakephp\src\View\Helper\FormHelper.php
から持ってきましょう。

因みに、Helperの初期値は必要な部分だけ記述すればマージされると説明書にはあるのですが、どうもマージされるのは1次元までのようで2次元になっている本項目の場合、必要なところだけ書くとエラーになります。全部書かないとダメというのが注意点。
とりあえず、FormHelper.phpから持ってきたパラメータを全部コピーして、必要なところを書き換えるとよいかと思います。

まぁ、setTemplates()で動的に変えることはできるけど、元に戻したりしないといけないので、ものすごく面倒。
cake2の場合は、クラス名とか替えられたのであるていど自由にできたのですが、cake3ではできなくなりました。(できないというか、できたりできなかったりパラメータに一貫性がない・・・)
だから、この方法でヘルパーでの出力は最低限にして、修飾は手書きで対処したほうがよさそうな気がします。

なんだか、CakePHP3って、ところどころ微妙に改悪されているのがすごく腹立たしい…。

参考

Form - 3.10
FormHelper は、フォームの作成を迅速に行い、検証、再配置、レイアウトを効率化します。
Class FormHelper | CakePHP 3.8
スポンサーリンク
タイトルとURLをコピーしました