Failure to Update record CakePHP - cakephp

I am currently trying to update my user before sending an email which will have a confirm link with a resetkey for the user to reset the password.
The problem is that the user is not updating whilst the key is being generated.
the code can be seen hereunder
public function forgotpassword() {
if ($this->request->is('post')) {
$mail = $this->request->data['ContactDetail']['email'];
$data = $this->User->find('first', array('conditions' => array('ContactDetail.email' => $mail)));
if (!$data) {
$message = __('No Such E-mail address registerd with us ');
$this->Session->setFlash($message);
} else {
$data['User']['resetkey'] = Security::hash(mt_rand(),'md5',true);
debug($data);
if ($this->User->saveAssociated($data)) {
$this->Session->setFlash(__('The user has been saved.'));
}
else {
$this->Session->setFlash(__('The user could not be updated. Please, try again.'));
}
$key = $data['User']['resetkey'];
$id = $data['User']['id'];
$mail = $data['ContactDetail']['email'];
$email = new CakeEmail('default');
$email->to($mail);
$email->from("xxxx#yahoo.com");
$email->emailFormat('html');
$email->subject('Password reset instructions from');
$email->viewVars(array('key' => $key, 'id' => $id, 'rand' => mt_rand()));
$email->template('reset');
if ($email->send('reset')) {
$message = __('Please check your email for reset instructions.');
$this->Session->setFlash($message);
} else {
$message = __('Something went wrong with activation mail. Please try later.');
$this->Session->setFlash($message);
}
}
$this->redirect('/');
}
}
I checked the execution log of MySQL but all I am seeing are selects no updates or even inserts.
This is probably something very dumb but I can't understand why it doesn't say anything.

Why do you use saveAssociated method for update single field?
Something like this would be easier:
$this->User->updateAll(
array( 'User.resetkey' => $hash ),
array( 'User.id' => $userId )
);

try using
$this->User->saveMany($data, array('deep' => true));
When saving. Also
if (empty($data)) {...
Might be a safer way to go

This will work for you-
$this->User->id = $data['User']['id'];
if ($this->User->save($data)) {
$this->Session->setFlash(__('The user has been saved.'));
}else {
$this->Session->setFlash(__('The user could not be updated. Please, try again.'));
}

Try to debug like:
if ($this->User->saveAssociated($data)) {
$this->Session->setFlash(__('The user has been saved.'));
}
else {
$this->Session->setFlash(__('The user could not be updated. Please, try again.'));
}
$log=$this->User->getDataSource()->getLog(false, false);
echo "<pre>";print_r($log);exit;

Related

on editing inserting a new row instead of updating the current row in cakephp 2x

I m having trouble in updating the student profile form,after i gave the user_id to the student profile.Every time when i try to edit the form, on saving it provide new id to the existing user. I don't know where I'm getting wrong. Plz help.Thanks in Advance.
Here is my add and edit function in Student Profiles controller:
public function add() {
if ($this->request->is('post')) {
$this->StudentProfile->create();
$data = $this->request->data;
$data['StudentProfile']['user_id'] = $this->Auth->user('id');
// code implemented below
//$this->loadModel('User');
if ($this->StudentProfile->save($data)) {
//Update user here if Profile saved successfully
//$this->StudentProfile->id = $this->Auth->user('id');
$this->Session->setFlash(__('Your account profile has been created'));
$this->redirect(array('controller' => 'studentprofiles', 'action' => 'index'));
}else{
$this->Session->setFlash(__('Your Profile was saved, but an error has occurred while updating the Users table'));
//Email your self the user ID here or something ??
}
}
$h=array(
'fields' => array('Height.height'),
'recrusive' => 0
);
$this->loadModel('Height');
$height = $this->Height->find('list',$h);
$this->set(compact('height'));
}
public function edit($id = null) {
if (!$this->StudentProfile->exists($id)) {
throw new NotFoundException(__('Invalid student profile'));
}
if ($this->request->is(array('post', 'put'))) {
$this->request->data['StudentProfile']['user_id'] = $this->Auth- >user('id');
// code implemented below
// $this->loadModel('User');
if ($this->StudentProfile->save($this->request->data)) {
//$this->StudentProfile->id = $this->Auth->user('id');
$this->Session->setFlash(__('The student profile has been saved.'), 'default', array('class' => 'alert alert-success'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The student profile could not be saved. Please, try again.'), 'default', array('class' => 'alert alert-danger'));
}
} else {
$options = array('conditions' => array('StudentProfile.' . $this- >StudentProfile->primaryKey => $id));
$this->request->data = $this->StudentProfile->find('first', $options);
}
$h=array(
'fields' => array('Height.height'),
'recrusive' => 0
);
$this->loadModel('Height');
$height = $this->Height->find('list',$h);
$this->set(compact('height'));
}
Can't believe I'm replying to my own question . Well In case anyone have the same above problem,the solution is just add the following code after this-
$this->request->data['StudentProfile']['user_id'] = $this->Auth->user('id');
// add this code to avoiding giving new id to existing user on edit:
$this->request->data['StudentProfile']['id'] = $id;
A better way of saving edited information is to set the ID on the model before the save like so
$this->StudentProfile->id = $this->Auth->user('id');
If you initiate a save after setting the above then the row will be edited and not add a new row.

Cakephp multiple records using foreach

I am trying to insert multiple records using cakephp.My controller code are given below :
if (!empty($this->request->data)) {
foreach($this->request->data['Deal']['deal_date'] as $key => $data)
{
$this->Deal->create();
$this->Deal->id = $id;
$this->request->data['Deal']['deal_date'] = $data;
$this->request->data['Deal']['recur'] = $this->request->data['Deal']['recur'][$key];
if ($this->Deal->save($data)) {
$this->Session->setFlash(__('The deal has been saved'));
//$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The deal could not be saved. Please, try again.'));
}
}
}
Its not inserting data into database properly.I used array in all the input fields.Any Idea?
Use saveAll or saveMany
if (!empty($this->request->data)) {
$records = array();
foreach($this->request->data['Deal']['deal_date'] as $key => $data) {
$record = $this->request->data;
$record['Deal']['id'] = $id; // are you sure you need this ?
$record['Deal']['deal_date'] = $data;
$record['Deal']['recur'] = $this->request->data['Deal']['recur'][$key];
$records[] = $record;
}
if ($this->Deal->saveMany($records)) {
$this->Session->setFlash(__('The deal has been saved'));
} else {
$this->Session->setFlash(__('The deal could not be saved. Please, try again.'));
}
}
//try this
if (!empty($this->request->data)) {
$myData = array();
foreach($this->request->data['Deal']['deal_date'] as $key => $data)
{
$this->Deal->create();
$myData['Deal']['deal_date'] = $data;
$myData['Deal']['recur'] = $this->request->data['Deal']['recur'][$key];
if ($this->Deal->save($myData)) {
$this->Session->setFlash(__('The deal has been saved'));
//$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The deal could not be saved. Please, try again.'));
}
unset($myData);
}
}
For inserting many rows use savemany or saveall as mention by cornelb,
but try to debug why your code is not working by printing sql log
if (!empty($this->request->data)) {
foreach($this->request->data['Deal']['deal_date'] as $key => $data)
{
$this->Deal->create();
$this->Deal->id = $id;
$this->request->data['Deal']['deal_date'] = $data;
$this->request->data['Deal']['recur'] = $this->request->data['Deal']['recur'][$key];
if ($this->Deal->save($data)) {
$log=$this->Deal->getDataSource()->getLog(false, false);
echo "<pre>";print_r($log);exit;
$this->Session->setFlash(__('The deal has been saved'));
//$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The deal could not be saved. Please, try again.'));
}
}
}

Validation not working with saveMany

Validations are not working with saveMany for all values.its only working for first value. I am using translate behavior.
My code:
public function admin_add() {
if ($this->request->is('post')) {
$this->FaqCategory->create();
$this->request->data['FaqCategory']['name'] = Inflector::slug($this->request->data['FaqCategory']['name'], $replacement = '-');
if ($this->FaqCategory->saveMany($this->request->data)) {
$this->Session->setFlash('The faq category has been saved', 'default', array('class' => 'success'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The faq category could not be saved. Please, try again.'));
}
}
$languages = $this->Language->getlangs();
$this->set('langs', $languages);
}
Try this: $this->FaqCategory->saveMany($this->request->data, array('validate' => true));

Changing single variable value in AppController

I have a Horse object that has a completed variable (text). I want to be able to click set complete in the View and then have that horse's completed variable set to "yes." After this, we would redirect the user to tasks/index. My thinking is to create setcomplete($id) function in Controller, so I could pass /setcomplete/4 and that horse's flag would change.
I have created a basic view for it, but the idea is that I would not need a view, but I do not know how to get around that....I was thinking of using $this->render() or something of this nature.
This is the basic code...pass in the id and then change the variable, then redirect to tasks/index.
I am not getting an error....its just not working, that's all.
public function setcomplete($id = null) {
if (!$this->Task->exists($id)) {
throw new NotFoundException(__('Invalid task'));
}
if ($this->request->is(array('post', 'put'))) {
$this->set('completed', 'yes');
if ($this->Task->save($this->request->data)) {
$this->Session->setFlash(__('The task has been updated.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The task could not be saved. Please, try again.'));
}
} else {
}
}
According to my understanding of your problem. you want to set the completed to yes for Task model.
i think you've done in a wrong way here.
what about the $this->request->data here?
Does it contain the data you want to save for the task model like the structure as below
Array(
'Task' => Array(
'id' => 4, // for eg..
'completed' => 'yes'
)
)
if not
you can solve the problem by doing like this. [Assuming you don't have $this->request->data]
public function setcomplete($id = null) {
if (!$this->Task->exists($id)) {
throw new NotFoundException(__('Invalid task'));
}
$this->Task->id = $id;
$this->Task->set('completed', 'yes')
if ($this->Task->save()) {
$this->Session->setFlash(__('The task has been updated.'));
return $this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The task could not be saved. Please, try again.'));
}
}

how I want the user id become static

I'm kind new to the cakephp and I want to know how to static the id where the id is on drop down or list. I have do hidden but its not enter the database. This is my coding:
This is in the controller
function add() {
if (!empty($this->data)) {
$this->Post->create();
if ($this->Post->save($this->data)) {
$this->Session->setFlash(__('The post has been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The post could not be saved. Please, try again.', true));
}
}
$users = $this->Post->User->find('list');
$this->set(compact('users'));
$this->set('userid',$this->Auth->user('id'));
}
this coding is in the ctp
<?php
echo $this->Form->input('user_id');
?>
The best way is to not send the user id to the browser and back at all, since that opens the possibility of form tinkering and security breaches/invalid results. Just inject the user id into the data before saving:
function add() {
if (!empty($this->data)) {
$this->Post->create();
// setting user id
$this->data['Post']['user_id'] = $this->Auth->user('id');
if ($this->Post->save($this->data)) {
$this->Session->setFlash(__('The post has been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The post could not be saved. Please, try again.', true));
}
}
$users = $this->Post->User->find('list');
$this->set(compact('users'));
}

Resources