CakePHP trouble using FormHelper for a year menu - cakephp

Cake 2.2.4
I have a database sport_year field set to the YEAR data type.
I've tried two approaches to creating a year menu for my add/edit views, but both have their own problems.
Using $this->Form->input:
echo $this->Form->input('sport_year', array(
'type' => 'date',
'dateFormat' => 'Y',
'name' => 'data[Sport][sport_year]',
'minYear' => date('Y') - 2,
'maxYear' => date('Y') + 1,
'label' => 'Year',
'empty' => '- select -'
));
The code works fine to add or edit data (as does the validation), but when arriving at the edit page existing year data is not properly selected in the form. The data array does show [sport_year] => 2012, but 2012 is not selected in the menu.
echo $this->Form->year(
'sport_year',
date('Y') - 2,
date('Y') + 1,
array(
'name' => 'data[Sport][sport_year]',
'label' => 'Year',
'empty' => '- select -'
)
);
The year helper seems to correctly retrieve and select the existing data, but the label does not work, and it doesn't correctly render the field as required even though my Model has validation set. It does still require the data, but it ignores my Model custom message and is falling back to a save error message in my controller.

$this->Form->year() will never show a label. Only $this->Form->input() adds labels as it is a wrapper method and year() is for creating a year field.
The code in cake is something like:
public function input() {
echo '<div>';
echo $this->label(...);
echo $this->year(...);
echo '</div>';
}
Taking this code, you do not need name as cake will be generating that already. If you are not in the Sport model you can use input('Sport.sport_year', ...)
If you read the docs you should see there is a default option for inputs. you can use that or make sure that $this->request->data['Sport']['sport_year'] is set to the year you want.
You could also set the value option.
echo $this->Form->input('sport_year', array(
'type' => 'date',
'dateFormat' => 'Y',
'minYear' => date('Y') - 2,
'maxYear' => date('Y') + 1,
'label' => 'Year',
'empty' => '- select -',
'default' => date('Y')
));
or
echo $this->Form->input('sport_year', array(
'type' => 'date',
'dateFormat' => 'Y',
'minYear' => date('Y') - 2,
'maxYear' => date('Y') + 1,
'label' => 'Year',
'empty' => '- select -',
'value' => date('Y')
));

For option 1 do this:
echo $this->Form->input('sport_year', array(
...
'selected' => 'data[Sport][sport_year]'
));

Related

CakePHP2 - Default value for input - select with option multiple

I have Form input with multiple select options. I am unable to set default values. This is my code:
<?= $this->Form->input('PaymentMethods', array(
'type' => 'select',
'multiple' => true,
'label' => false,
'options' => array(
'cash'=>'cash',
'invoice'=>'invoice',
'ax'=>'ax',
'ca'=>'ca',
'vi'=>'vi',
'tp'=>'tp',
'dc'=>'dc'
),
'default'=>'ax'
)); ?>
How do I set default values for this input with PHP only?
This is working on my system. You can also set it from controller like this :
$this->request->data[$this->modelClass]['PaymentMethods'] = 'ax';
Please check these url also
CakePHP select default value in SELECT input
http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html
example :
$sizes = array('s' => 'Small', 'm' => 'Medium', 'l' => 'Large');
echo $this->Form->input(
'size',
array('options' => $sizes, 'default' => 'm')
);
Since this is multi-choice select, value given must be array. And the key shouldn't be default, I should've used value instead.
<?= $this->Form->input('PaymentMethods', array(
'type' => 'select',
'multiple' => true,
'label' => false,
'options' => $options,
'value'=> $array_of_data_fetched_from_database
)); ?>

How to populate dropdown in cakephp?

I want top populate dropdown date field in cakephp 2.x.
my date format is 1987-07-05 but when i using cakephp date.
echo $this->form->input('birthday', array(
'type' => 'date',
'id' => 'birthday',
'required' => false,
'empty' => array(
'month' => 'Month', 'day' => 'Day', 'year' => 'Year'
),
'id' => 'birthday',
'minYear' => date('Y') - 16,
'maxYear' => date('Y') - 60,
'label' => FALSE,
'style'=>'width:100px',
'value'=>$getProfile['Performer_detail']['birthday']
));
With the code above, I am getting 3 dropdown fields: Month, Day, and Year: I am also getting 1987-07-05 in $getProfile['Performer_detail']['birthday'] but these 3 fields are not selected.
Please help me.
Use this code -
<?php echo $this->form->dateTime(
'birthday', 'MDY','', array(
'id'=>'birthday','value'=>$getProfile['Performer_detail']['birthday'], 'empty' => array('month' => 'Month', 'day' => 'Day', 'year' => 'Year'),'label'=>'','minYear'=>date('Y')-16,'maxYear'=>date('Y')-60
)
);?>
I am pasting the demo to understand the Date input field in cakephp.
table: users
id int
name varchar
birthday date
add.ctp
<?php
echo $this->Form->create();
echo $this->Form->input('name');
echo $this->Form->input('birthday',array('dateFormat' => 'YDM'));
echo $this->Form->end();
?>
Form will look like this,Notice the values.It will display the current date by default.
I have added one record with name Kevin and Date 2019-5-September.Now this is when i edit the same record
edit.ctp
<?php
echo $this->Form->create();
echo $this->Form->input('name');
echo $this->Form->input('birthday',array('dateFormat' => 'YDM'));
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->end('submit');
?>
As you can see that in both file add.ctp and edit.ctp file i haven't included extra value for the birthday.Cakephp will autofill the field data in edit form if you have correctly followed the cakephp conventions.So here no need to add the $getProfile['Performer_detail']['birthday']

CakePHP 1.2 - Model validation database table field prefixed with id

Inspect the 'Qty' form input with Firebug
<input id "Item0Quantity">
I am having difficult validating this element produced by this code:
<?php echo $form->input("Item.$id.quantity.", array('label' => 'Qty', 'class' => 'txt'));?>
I am working with a form input element that is prefixed with the database table name (Item) and a unique id, the reason for this is to add some JavaScript functionality. Though it still needs CakePHP validation on the Item model.
Here is the input form element that needs to be validated:
<?php echo $form->input("Item.$id.quantity.", array('label' => 'Qty', 'class' => 'txt'));?>
So how will the will be written in the items model? My attempt:
'Item.$id.quantity' => array(
'rule' => 'numeric',
'allowEmpty' => true,
'message' => 'quanitity mut be numeric'
),
The validation will look the same, still by just the field name:
'quantity' => array(
'rule' => 'numeric',
'allowEmpty' => true,
'message' => 'quanitity mut be numeric'
),
When you use saveAll Cake will iterate through each Item and validate it accordingly.

CakePHP Form Helper input date

I have the following code in my view:
$this->Form->input('born');
Which is a date field and I'm look to see if it is possible to have different empty text for each select box like: [Month |v][Day |v][Year |v].
Has anyone come across doing this? Much help is appreciated.
You can do something like this:
echo $this->Form->input('born', array( 'label' => 'Date of birth',
'dateFormat' => 'DMY',
'minYear' => date('Y') - 70,
'maxYear' => date('Y') - 18 ));
They will be dropdowns not empty text fields. You can read more about the form helper and automagic forms here:
http://book.cakephp.org/#!/view/1390/Automagic-Form-Elements
I have resorted to using jquery to update the cake empty date values
Cake:
echo $this->Form->input('born', array( 'label' => 'Date of birth',
'dateFormat' => 'DMY',
'minYear' => date('Y') - 70,
'maxYear' => date('Y') - 18,
'empty' => true
));
jQuery:
$(function() {
$('.input.date select[name$="[day]"] option[value=""]').html('-- Day --');
$('.input.date select[name$="[month]"] option[value=""]').html('-- Month --');
$('.input.date select[name$="[year]"] option[value=""]').html('-- Year --');
});
echo $this->Form->input('born', array( 'label' => 'Date of birth',
'type'=>'date',
'dateFormat'=> 'DMY',
'minYear' => date('Y') - 70,
'maxYear' => date('Y') - 18 ));
this works form me (CakePHP 2x)
echo $this->Form->input('born', array( 'label' => 'Date of birth',
'dateFormat' => 'DMY',
'minYear' => date('Y') - 70,
'maxYear' => date('Y') - 18,
'empty' => array(
'day' => '-- Day --', 'month' => '-- Month --', 'year' => '-- Year --',
)
));
If you can leave the input blank, try this:
echo $this->Form->input('born', array('empty' => true));
If not, check this answer: https://stackoverflow.com/a/11610483/1001673
It's a bit hacky but it'll do wha you want.

Creating 'select' listboxes using FormHelper in CakePHP

I have two models, Category and Point. The associations are defined as:
Category hasMany Point
Point belongsTo Category
I would like, when adding Points to my database, to be able to select the category it belongs to from a <select> box, along with the rest of the form data.
Where would I need to set the category list and how could I do it? And how would I produce the select box?
I assume it could be done with
$form->input('categorieslist',array('type'=>'select')); //categorieslist needs
//setting somewhere.
Also to generalize a bit:
In a View with access to the Form helper
<?php
echo $form->input( 'dataKey', array(
'type' => 'select',
'options' => array(
'key1' => 'val1',
'key2' => 'val2',
),
));
?>
The above will render a select input with two options. You can also place an empty option as the first item. Passing a value of true will simply append an empty option with a blank value to the beginning of the options rendered in the HTML.
<?php
echo $form->input( 'dataKey', array(
'type' => 'select',
'options' => array(
'key1' => 'val1',
'key2' => 'val2',
),
'empty' => true,
));
?>
You can pass a string to the 'empty' key to have it display custom text as the key field for the empty option.
<?php
echo $form->input( 'dataKey', array(
'type' => 'select',
'options' => array(
'California' => 'CA',
'Oregon' => 'OR',
),
'empty' => 'choose a state',
));
?>
One last example, you can also pre-select an option with the selected key. The value should match the value of one of the select options, not the key.
<?php
echo $form->input( 'dataKey', array(
'type' => 'select',
'options' => array(
'California' => 'CA',
'Oregon' => 'OR',
),
'empty' => 'choose a state',
'selected' => 'California',
));
?>
From the Model
Model->find( 'list', array( ... )); will always return an array formatted for use with select box options. If you pass data to your view stored in a variable with a lowercase plural model name, that is, ( $this->set( 'categories', $categories );, then you will automagically generate drop downs for related models by using the form helper in the view and passing it a data index of the same model name in singular form suffixed with "_id".
Aziz's answer at #2 is the example of that automagic kicking in.
CakePHP 1.3 Form Helper
CakePHP1.2 Form Helper
In the controller:
$categories = $this->Point->Category->find('list');
$this->set(compact('categories'));
In the view:
$form->input('category_id',array('type'=>'select'));

Resources