CakePHP 3.4 use setTemplates() multiple times

472 views Asked by At

I'm trying to use setTemplates() multiple times in a view, but it doesn't work as expected.

I have two templates which I want to set when I need them.

$bootstrapTemplate = [
    'inputContainer' => '<div class="form-group {{type}}{{required}}">{{content}}</div>',
];

$bootstrapTemplateInputGroup = [
    'inputContainer' => '<div class="form-group {{type}}{{required}}">{{content}}</div>',
    'input' => '<div class="input-group"><div class="input-group-addon">€</div><input type="{{type}}" name="{{name}}"{{attrs}}/></div>'
];

I start to set the templates like this

$this->Form->setTemplates($bootstrapTemplate);

$this->Form->control('title', ['class' => 'form-control', 'label' => __('Titel')]);

// OUTPUT - correct
// <div class="form-group text required"><label for="title">Titel</label><input type="text" name="title" class="form-control" required="required" maxlength="255" id="title"></div>

$this->Form->setTemplates($bootstrapTemplateInputGroup);
echo $this->Form->control('price', ['class' => 'form-control', 'id' => 'price_eur', 'label' => __('Preis EUR')]).'</div>';

// OUTPUT - correct
<div class="form-group number required"><label for="price_eur">Preis EUR</label><div class="input-group"><div class="input-group-addon">€</div><input type="number" name="price" class="form-control" id="price_eur" required="required" step="any"></div></div>

Now I want to switch back to $bootstrapTemplate which doesn't seem to work. Instead the $bootstrapTemplateInputGroup is used

$this->Form->setTemplates($bootstrapTemplate);
echo $this->Form->control('user_zip', ['class' => 'form-control', 'id' => 'user_zip', 'label' => __('PLZ')])

// OUTPUT - wrong
<div class="form-group text"><label for="user_zip">PLZ</label><div class="input-group"><div class="input-group-addon">€</div><input type="text" name="user_zip" class="form-control" id="user_zip"></div></div>

My expected output is the template of $bootstrapTemplate like:

<div class="form-group text required"><label for="user_zip">PLZ</label><input type="text" name="user_zip" class="form-control" required="required" maxlength="255" id="user_zip"></div>

What am I doing wrong here?

1

There are 1 answers

1
ndm On BEST ANSWER

FormHelper::setTemplates() doesn't overwrite the complete existing set of templates, it merges it with the given templates, ie the input template set with the second call, will remain changed.

You either have to push() to (store) and pop() from (restore) the template stack using the underlying templater to avoid that:

$this->Form->templater()->push();
$this->Form->templater()->add($bootstrapTemplateInputGroup);
$this->Form->templater()->pop();

or use the FormHelper::create() method's templates option to apply the templates to the specific FormHelper::control() call(s) only:

echo $this->Form->control('title', ['templates' => $bootstrapTemplate, /*...*/]);
echo $this->Form->control('price', ['templates' => $bootstrapTemplateInputGroup, /*...*/]);
echo $this->Form->control('user_zip', ['templates' => $bootstrapTemplate, /*...*/]);

See also