how to save select option value in database on cakephp - cakephp

I wanna save a selected option in database in cakephp.
here is my add.ctp code
<?php
$options = array('0' => 'male', '1' => 'female');
echo $this->Form->select('gender', $options, array('escape' => false,'id'=>'gender'));
?>
and this is my action :
$user=$this->Users->newEntity();
if($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data);
print_r($user);
$this->Users->save($user);
}
But when I run it just the value 1 saved on database even I choose male.
please help.

The type of gender on database was bit I changed it to INT and every thing works correctly.

Related

cakephp canot save form control field in database

i am trying to make an simple cakephp aplication!
I have a form that creates a new article.. my problem is that i have an input field for the artice slug but when i cakephp submits te form the slug field in database remains empty..
here is the add method from my articleController
public function add(){
$article = $this->Articles->newEntity(); //gffdgfd
if ($this->request->is('post')){
$this->Articles->patchEntity($article, $this->request->data());
if($this->Articles->save($article)){
$this->Flash->success(__('Your Article has been saved!'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Cannot save article! Please try again!!'));
}
$this->set('article', $article);
}
and my add.ctp
<h1>Add Article</h1>
<?php
echo $this->Form->create($article);
echo $this->Form->control('user_id', ['type' => 'hidden', 'value'=> 1 ]);
echo $this->Form->control('published', ['type' => 'hidden', 'value'=> 1 ]);
echo $this->Form->control('title');
echo $this->Form->control('slug');
echo $this->Form->control('body', ['rows' => 5 ]);
echo $this->Form->button(__('Save Article'), ['class' => 'button', 'style' => 'margin-right:10px; margin-left:10px']);
echo $this->Html->link('Back', ['action' => 'index'], ['class' => 'button']);
echo $this->Form->end();
?>
If slug field is present in your request data, then you should check if this field is accessible for assignment in your entity. Look at file src/Model/Entity/Article.php, on top of class body you will have an array named $_accessible - check if your slug field is present, and if not, set it to true:
protected $_accessible = [
/* other fields */
'slug' => true
];
Please check more about assignment of properties in docs: CakePHP 3 Entities - Mass Assignment

How to write an approve action in cakephp

i want to create an simple application that will allow graduating students to register for graduation attendance. From the application form the student enter the details that's saved to the students table waiting for approval. The admin then approves the request and the record is inserted in the approved table and deleted from the students table. How can i write the approve action and how can i move the record to the approved table in cakephp 2.6.3.
thanks in advance
I would use one and same table to save this data. Use the table students. Add a approved column to the table where 0 = not approved, 1 = approved. When students are entering their data and saves it to students table, make sure approved = 0. Then admin can go change this value to 1 if student is approved.
// StudentsController.php
public function approve($id = null) {
if (!$this->Student->exists($id)) {
throw new NotFoundException(__('Invalid'));
}
if ($this->request->is(array('post', 'put'))) {
if ($this->Student->save($this->request->data)) {
$this->Session->setFlash(__('The student has been saved.'), 'default', array('class' => 'notice success'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The student could not be saved. Please, try again.'), 'default', array('class' => 'notice error'));
}
} else {
$options = array('conditions' => array('Student.' . $this->Student->primaryKey => $id));
$this->request->data = $this->Student->find('first', $options);
}
}
app/View/Students/approve.ctp:
<h1><?php echo __('Approve student');?></h1>
<?php echo $this->Form->create('Student'); ?>
<?php
echo $this->Form->input('id');
echo $this->Form->input('approved', array('label' => __('Approve'), 'options' => array(
'0' => __('Not approved'),
'1' => __('Approved'),
)));
?>
<?php echo $this->Form->end(array('label' => __('Save'), 'class' => 'button')); ?>
Sorry for not answering your exact question, but I really think it is unnecessary to use two tables to identify who are not approved vs approved students.

Cakephp: combine input values to create hidden name input

I've searched high and low for a solution but can't seem to get this figured out. What I'm trying to do is upon adding a product, I want the name field to be populated from the inputs in the form. So the name would include the values the user selects for type_id,category_id and subcategory_id. Does anyone know of a way to accomplish this?
Add product View page
<fieldset>
<legend><?php echo __('Add Product'); ?></legend>
<?php
echo $this->Form->input('type_id');
echo $this->Form->input('category_id', array('label' => 'Vendor'));
echo $this->Form->input('subcategory_id', array('label' => 'Model'));
echo $this->Form->input('location', array('label' => 'Location'));
echo $this->Form->input('sku', array('label' => 'Asset Tag'));
echo $this->Form->input('mac');
echo $this->Form->input('description', array('label' => 'Notes'));
echo $this->Form->input('name', array( 'value' => ['type_id']['category_id'] , 'type' => 'hidden'));
//echo $this->Form->input('cost');
// echo $this->Form->input('Tag');
?>
</fieldset>
Product controller add function
public function add() {
if ($this->request->is('post')) {
$this->Product->create();
if ($this->Product->save($this->request->data)) {
$this->Session->setFlash(__('The product has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The product could not be saved. Please, try again.'));
}
}
$subcategories = $this->Product->Subcategory->find('list',array('order'=>'Subcategory.name asc'));
$categories = $this->Product->Category->find('list',array('order'=>'Category.name asc'));
$types = $this->Product->Type->find('list',array('order'=>'Type.name asc'));
$this->set(compact('subcategories', 'categories', 'types'));
}
In order to do it the way you are trying to do it, you would have to use client-side javascript to update the input value "on-the-fly", but that's not very safe and can easily be messed with. It would make much more sense to drop the name input altogether and just handle this in the beforeSave method of your Product model (or alternatively by defining the name value in your Controller just before saving).
public function beforeSave($options = array()) {
// Generate the name based on type and category
$this->data['Product']['name'] = $this->data['Product']['type_id'] .
$this->data['Product']['category_id'];
return true;
}
Update based on your comment.
In order to get the names, just find those names (assuming your models are associated) and define those:
public function beforeSave($options = array()) {
// Get the type name
$type = $this->Type->field('name', array(
// Set the condition for the field
'Type.id' => $this->data['Product']['type_id']
));
// Get the category name
$category = $this->Category->field('name', array(
// Set the condition for the field
'Category.id' => $this->data['Product']['category_id']
));
// Generate the name based on type and category
$this->data['Product']['name'] = $type . $category;
return true;
}

multiple checkboxes with cakephp 1.2

I have a page with a list of books, and every row has a checkbox. (I'm using cakephp 1.2).
I want to let the user to save multiple books.
For now I have this checkbox in my view (in a cycle, where I get the list of all books):
<?php echo $form->input('salva', array('value' => $cdBiblio['CdBiblio']['codiceBiblio'], 'label' => '', 'type' => 'checkbox')); ?>
This form:<?php echo $form->create('cd_biblios', array('action' => 'save')); ?>
And this button:
<?php echo $form->end('Add All');?>
In the controller, I have something like this for debugging:
debug($this->data);
foreach($this->data['cd_biblios']['salva'] as $item) {
debug($item);
}
But it's not working.
I noticed that it takes only the last book id of the list with debug($this->data); and if I check more than 1 book, it show 0 or the last book id, for example:
Array (
[cd_biblios] => Array
(
[salva] => 0
) )
SOLVED:
In the view I use Danial's code.
In the controller I use this code:
if(!empty($this->data)) {
$item=$this->data;
debug($item);
$dim=count($item['Model']['field']);
$i=0;
for ($i=0;$i<$dim;$i++)
if ($item['Model']['field'][$i]!=0)
{
$data = $this->Session->read('libri');
$data[] = $item['Model']['field'][$i];
$this->Session->write('libri', $data);
}
$this->Session->setFlash(__('I libri sono stati salvati', true));
$this->redirect($this->referer());
}
In View:
<?php
foreach($array as $each_elem) {
echo $form->checkbox(
'Model.field',
array(
'id'=>'abcd_'.$each_elem['Model']['id'],
'value' => $each_elem['Model']['id'],
'hiddenField' => false,
'name' => 'data[Model][field][]',
'label' => false,
'div' => false,
));
}
?>
On submit the form, you will get the checked values in controller in $this->request->data
You have a conception problem.
Your checkboxes must be inside a form, because they are input tags. So, to send those values to the controller you'll need to submit that form. In your code, i see that "Add All" is just a link. And a link won't submit the form.
Change your link to a button :)
Hope this helps

how to combine two HABTM saves in one form in CakePHP?

I have two models Business and User. They are related by a HABTM relationship.
Everything is working with the baked controllers, models and views.
Now I'm trying to combine the two models in one form so the user can enter a business name with is user info.
Here's the form :
Form->create('User'); ?>
Form->input('Business.name', array('label' => __('Business name')));
echo $this->Form->input('User.email');
echo $this->Form->input('User.firstname');
echo $this->Form->input('User.lastname');
echo $this->Form->input('User.password');
echo $this->Form->input('User.phone_cell', array('type' => 'text'));
echo $this->Form->input('User.phone_home', array('type' => 'text'));
echo $this->Form->input('User.phone_work', array('type' => 'text'));
?>
Form->end(__('Submit')); ?>
The only way I was able to make it work was to save the User first and then get the user id and save the business after by adding the user array with the new id.
if ($this->User->save($this->request->data)) {
$this->request->data['User'] = array('User' => array(0 => $this->User->id));
if ($this->User->Business->save($this->request->data)) {
// User saved
} else {
// User not saved
}
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
I tried the saveAll method without success. Is is possible to optimize this the CakePHP way for a single save ?
Thanks
I was able to get it to work myself with a couple models named User and Group. Here's some snips from my code to show how I did it:
UsersController.php
public function edit($id = null)
{
$this->User->id = $id;
if ($this->request->is('get')) {
//On page load load the user data
$this->request->data = $this->User->read();
} else {
//Saving
if ($this->User->save($this->data)) {
//....snipped...
} else {
$this->Session->setFlash('Unable to update the user.');
}
}
//Build $groups array for form
// Only admins can assign admin rights
if ($this->isMember('Admin')) {
$this->set('groups',$this->User->Group->find('list'));
} else {
$this->set('groups',$this->User->Group->find('list',array(
'conditions' => array(
'Group.name !=' => 'Admin'
)
)));
}
//...more snipping...
}
edit.ctp (View)
echo $this->Form->create('User', array('action' => 'edit'));
echo $this->Form->input('User.username');
echo $this->Form->input('Group',array(
'type' => 'select',
'multiple' => true,
'label' => "Group (Select multiple entries with CTRL)",
'size' => count($groups)
)
);
//More snipping
With that example to work from, how are you validating that the Business.name entered is valid and can be matched to the HABTM relation? Mine forces a selection list in this case. My Model is extremely simple so I didn't include that.
What are your outputs to debug($this->data); vs. debug($this->request->data)?

Resources