I've read CakePHP multiple checkbox array HTML the right way but getting strange results. I have a list of tags (from a Model called Tag). I want to loop through these and output checkboxes for them in a View.
So I have obtained the Tag data in my Controller with:
$tags = $this->Tag->find('list', ['order' => ['name' => 'ASC']]);
$this->set('tags',$tags);
When I loop through it in my View I am trying to output the checkboxes in between Bootstrap markup:
<?php echo $this->Form->create('GroupTag'); ?>
<?php foreach ($tags as $tag_id => $tag): ?>
<div class="checkbox">
<label>
<?php echo $this->Form->checkbox('tag_id[]', array( 'value'=> $tag_id)); ?>
<?php echo $tag; ?>
</label>
</div>
<?php endforeach; ?>
I copied the syntax for tag_id[] from the post I linked to.
But when I inspect the markup it's producing the following as the name attribute for each <input type="checkbox">:
data[GroupTag][tag_id[]]
Should this not be
data[GroupTag][tag_id][]
?
The idea is that I have multiple checkboxes with a name attribute tag_id[] and then in the Controller I can loop through what has been checked.
Please can someone advise on this as I can't get it working and have looked into examples provided on here/docs.
Try this
$this->Form->checkbox('tag_id.', array( 'value'=> $tag_id))
You can also do this:
$this->Form->input('GroupTag.tag_id', [
'type' => 'select',
'multiple' => 'checkbox',
'options' => $tag_id
]);
FormHelper::select(string $fieldName, array $options, array $attributes)
Example:
$options = array(
'Value 1' => 'Label 1',
'Value 2' => 'Label 2'
);
echo $this->Form->select('Model.field', $options, array(
'multiple' => 'checkbox'
));
Output:
<div class="input select">
<label for="ModelField">Field</label>
<input name="data[Model][field]" value="" id="ModelField"
type="hidden">
<div class="checkbox">
<input name="data[Model][field][]" value="Value 1"
id="ModelField1" type="checkbox">
<label for="ModelField1">Label 1</label>
</div>
<div class="checkbox">
<input name="data[Model][field][]" value="Value 2"
id="ModelField2" type="checkbox">
<label for="ModelField2">Label 2</label>
</div>
</div>
Related
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?
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
Cookbook > Views > Helper > Form > Options for Control
API > \Cake\View\StringTemplate
I have a column in my table named 'availability_option' with type enum('0', '1', '2'). Zero means 'Fixed Price', One means 'Auction', Two means 'Both'.
I want to generate 2 checkboxes dynamically One for Fixed Price and another 'Auction'.
How is it possible?
I didi it static.
But it should not be the right syntax of yii.
<input value="0" id="fixedprice" type="checkbox" name="ProductShop[availability_option][]">
<label for="fixedprice">Fixed Price</label>
<input value="1" id="auctionprice" type="checkbox" name="ProductShop[availability_option][]">
<label for="auctionprice">Auction</label>
I want it dynamically, So how is it possible?Any idea?
Use checkboxList():
<?= $form->field($model, 'attribute_name')->inline(true)->checkboxList([0 => 'Fixed Price', 1 => 'Auction']) ?>
http://www.yiiframework.com/doc-2.0/yii-bootstrap-activefield.html#inline%28%29-detail
I was facing The same problem and I solved It by doing like this :
<?php echo $form->field($model, 'name[]')->checkboxList(['a' => 'Item A', 'b' => 'Item B', 'c' => 'Item C']); ?>
Note that the checkboxList expects the first argument of the passed array to be of string type as well so you may need to make changes to your array.
Generated HTML will be as:
<label><input type="checkbox" name="fomrmName[name][]" value="'1'"> a</label>
another way by which I solved My problem was to wrap the checkbox in foreach block like following:
<?php foreach($vendorsData as $value){?>
<li><?= $form->field($ucVendors, 'vendor_id['.$value.']')->checkbox(array('label'=>$value)); ?>
and the Generated html is as:
<label><input type="checkbox" id="usedcarvendors-vendor_id-value" name="UsedCarVendors[vendor_id][value]" value="1"> value</label>
Reference Link here
So Here is how the select boxes are being created:
echo $this->Form->select('weekdays', array(
'1'=>__('Manday'),
'2'=>__('Tuesday'),
'3'=>__('Wednesday'),
'4'=>__('Thursday'),
'5'=>__('Friday'),
'6'=>__('Satruday'),
'7'=>__('Sunday')),
array('multiple'=>'checkbox', 'class'=>'checkbox2'));
which outputs 7 checbox with the following HTML markup:
<div class="checkbox2">
<input type="checkbox" name="data[Event][weekdays][]" value="1" id="EventWeekdays1" />
<label for="EventWeekdays1">Monday</label>
</div>
But the expected output that is needed is this:
<div class="checkbox2">
<input type="checkbox"
name="data[Event][EventWeekdays1]"
id="EventWeekdays1" class="css-checkbox" value="1" />
<label for="EventWeekdays1" class="css-label">Mandag</label>
</div>
I have been through documentation but cannot seem to find an option to add clases to both input and label attributes when using Form->select
Any help or guidance is much appreciated.
Using just FormHelper-approved things:
$options = array(
'1'=>__('Manday'),
'2'=>__('Tuesday'),
'3'=>__('Wednesday'),
'4'=>__('Thursday'),
'5'=>__('Friday'),
'6'=>__('Satruday'),
'7'=>__('Sunday'));
$this->Form->input('weekdays', array(
'type' => 'select',
'div' => array('class'=>'checkbox2'),
'multiple'=>'checkbox',
'class'=>'css-checkbox',
'options' => $options,
'label' => array('class'=>'css-label')));
Docs here
I think after reading your question you would be better off building the markup yourself and loop trough your $options on the checkboxes you need, so:
$options = array(
'1'=>__('Manday'),
'2'=>__('Tuesday'),
'3'=>__('Wednesday'),
'4'=>__('Thursday'),
'5'=>__('Friday'),
'6'=>__('Satruday'),
'7'=>__('Sunday'));
<div class="checkbox2">
<?php foreach($options as $k => $v): ?>
<input type="checkbox"
name="data[Event][EventWeekdays<?php echo $k ?>]"
id="EventWeekdays<?php echo $k ?>" class="css-checkbox" value="<?php echo $v ?>" />
<label for="EventWeekdays<?php echo $k ?>" class="css-label">Mandag</label>
<?php endforeach; ?>
</div>
Not the better way to do it, but it works and can be a solution to your problem. Hope it helps!
I'm developing an app in cakePHP and I'd like to use Foundation Tooltips into it.
I need to add data-tooltip to the input in order to make it work, but I don't know how to do it with the cakePHP form helper.
Right now I'm using:
<?php echo $this->Form->input('title', (array( 'label' => __('title'),
'class' => 'has-tip',
'title' => __('Tooltip for initiative title'),
)));
And is returning this:
<input name="data[Initiative][title]" class="has-tip" title="Tooltip for initiative title" maxlength="255" type="text" id="InitiativeTitle" required="required">
When I need this:
<input data-tooltip name="data[Initiative][title]" class="has-tip" title=...>
I've tried adding 'data-tooltip'to the input array with no luck, but I'm sure it has to be an easy way of doing it.
Thanks in advance and sorry for my English.
<?php echo $this->Form->input('title', array( 'label' => __('title'),
'class' => 'has-tip',
'title' => __('Tooltip for initiative title'),
'data-tooltip'=>""
));
CakePHP usually place labels before the input, so doing this:
echo $this->Form->input('subject');
We obtain this:
<div class="input text required">
<label for="TicketSubject">Subject</label>
<input name="data[Ticket][subject]" maxlength="255" type="text" id="TicketSubject">
</div>
Is there any way to place the label after the input to obtain this?
<div class="input text required">
<input name="data[Ticket][subject]" maxlength="255" type="text" id="TicketSubject">
<label for="TicketSubject">Subject</label>
</div>
Thanks.
The proper way is using the the 'format' option.
$this->Form->input('subject', array(
'format' => array('before', 'input', 'between', 'label', 'after', 'error')
));
Didn't anyone read the API :)
You can try this:
echo $this->Form->input('subject', array('label' => false, 'after' => $this->Form->label('Subject:')));
You can do like this also -
echo $this->Form->input('subject', array('label' => false, 'after' => '<label for="subject">Subject</label>'));