Edited at

CakePHP 3.0(beta)のStringTemplateTraitを試してみた

More than 5 years have passed since last update.


StringTemplateTrait


前提条件


  • CakePHP 3.0(beta1)を利用(2014/09/11)

Cake3ではHelper等がレンダリングするHtmlをStringTemplateTraitという機能を使うことで実現しています。


この機能をうまく使うことで出力されるHtmlを自由に修正することが出来ます。


※例) ページャーやformののHtml等

テンプレートの書き換え自体はStringTemplate,InstanceConfigTraitが行います。


使い方1

 テンプレートの書き換えはconfigメソッドで行います。


 以下の場合はSetFlashのテンプレートを書き換えます。

<?php $this->Session->config('templates.flash', '<div>真テンプレート</div>'); ?>

<?= $this->Session->flash(); ?>


使い方2

 中カッコ({})を2個重ねることで変数が展開されます。

 以下の場合は$messageが展開されます。

<?php $this->Session->config('templates.flash', '<div>{{message}}</div>'); ?>

<?= $this->Session->flash('flash', ['message'=>'ここの変数が展開される']); ?>


継承

 毎回configで指定するのは手間なので継承して、$this->templater()->config()で書き換えおくと便利かもしれません

class FormHelper extends \Cake\View\Helper\FormHelper {

public function __construct(\Cake\View\View $View, array $config = []) {
parent::__construct($View, $config);

// テンプレートの書き換え
$this->templater()->config('error', '<div class="error-message">エラーです!=>{{content}}</div>');
}
}


テンプレート外出し

 configで指定するテンプレート自体を外出しすることもできます。

// ctpファイル

// templatesに外出しするテンプレートファイル名を指定する
<?= $this->Form->create($account, ['templates'=>'template']); ?>

//App/Config/template.php
$config = [
'button' => '<button{{attrs}}>{{text}}</button>',
'checkbox' => '<input type="checkbox" name="{{name}}" value="{{value}}"{{attrs}}>',
'checkboxContainer' => '<div class="checkbox">{{input}}{{label}}</div>',
'dateWidget' => '{{year}}{{month}}{{day}}{{hour}}{{minute}}{{second}}{{meridian}}',
'error' => '<div class="error-message">エラーです!=>{{content}}</div>',
'errorList' => '<ul>{{content}}</ul>',
'errorItem' => '<li>{{text}}</li>',
'file' => '<input type="file" name="{{name}}"{{attrs}}>',
'fieldset' => '<fieldset>{{content}}</fieldset>',
'formstart' => '<form{{attrs}}>',
'formend' => '</form>',
'hiddenblock' => '<div style="display:none;">{{content}}</div>',
'input' => '<input type="{{type}}" name="{{name}}"{{attrs}}>',
'inputsubmit' => '<input type="{{type}}"{{attrs}}>',
'label' => '<label{{attrs}}>{{text}}</label>',
'legend' => '<legend>{{text}}</legend>',
'option' => '<option value="{{value}}"{{attrs}}>{{text}}</option>',
'optgroup' => '<optgroup label="{{label}}"{{attrs}}>{{content}}</optgroup>',
'select' => '<select name="{{name}}"{{attrs}}>{{content}}</select>',
'selectMultiple' => '<select name="{{name}}[]" multiple="multiple"{{attrs}}>{{content}}</select>',
'radio' => '<input type="radio" name="{{name}}" value="{{value}}"{{attrs}}>',
'radioContainer' => '{{input}}{{label}}',
'textarea' => '<textarea name="{{name}}"{{attrs}}>{{value}}</textarea>',
'formGroup' => '{{label}}{{input}}',
'checkboxFormGroup' => '{{input}}{{label}}',
'groupContainer' => '<div class="input {{type}}{{required}}">{{content}}</div>',
'groupContainerError' => '<div class="input {{type}}{{required}} error">{{content}}{{error}}</div>',
'submitContainer' => '<div class="submit">{{content}}</div>',
];