Weird problems while getting ID just after saving data - cakephp-2.0

I have different models which are an extension of another one.
classes (SubModel1, SubModel2, ..,6) extends -> HighModel extends -> Appmodel
Everytime I save data in each submodel I call a function in my HighModel to save the id of the just saved SubModel. It works perfectly with five SubModels, but in one the id is always: ($shouldBeThisId - 1)in both add and edit functions.... o_O
Here's my add function:
public function add() {
if ($this->request->is('post')) {
$this->M18Tab->create();
if ($this->M18Tab->save($this->request->data)) {
$data = $this->M18Tab->findById($this->M18Tab->id); //<---problem's here
if($this->M18Tab->M18Model->saveVersion($data)){
$this->Session->setFlash(__('The m18 tab has been saved'));
$this->redirect(array('action' => 'view', $this->M18Tab->id));
} else {
$this->Session->setFlash(__('Error with versioning system'));
}
} else {
$this->Session->setFlash(__('The m18 tab could not be saved. Please, try again.'));
}
}
//view variables
}
ok. so after saving I recall the "just saved data" and pass it to $this->SubModel->HighModel->saveVersion($data). and the weird thing is that if I try to force the id to find:
$data = $this->M18Tab->findById(33);
it'll still find the id preceding the just inserted one :0.
what could this be caused by? the code is the same for all 6 models and in only one I have this issue..

This is more of a comment/suggestion than an answer, but anyway...
If you're adding a new record, after calling save, you can get it's ID via:
$this->MyModel->getInsertId();
See that method in the cookbook. I know the id should also be available at $this->MyModel->id, but since it's not working in this case, you might want to try:
$data = $this->M18Tab->findById($this->M18Tab->getInsertId());

Related

CakePhp save changes only in middle table

Here is the problem what I have
I have 3 tables m:n
Users -> addresses_users -> Addresses
During adding new user I am selecting from dropdown X Addresses and after I click save I have to save new user data (new user in Users table), make mapping in addresses_user table and Addresses table shouldnt be changed, cos I have already those addresses in DB.
So, if i use code like this
input in ctp with
name="addresses[]"
In controller
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->
if ($this->Users->save($user)) {
$this->Flash->success(__('The user has been saved.'));
return $this->redirect(['controller' => 'users', 'action' => 'view/' . $user->id]);
} else {
$this->Flash->error(__('The user could not be saved. Please, try again.'));
}
}
Cakephph makes mapping automatically and want to save new user, mapping and information about addresses.
Is there way to make this automatically with cakephp that he saves new user and make mapping or I should use another input name (that cakephp doesnt make patch with addresses) and after save make foreach with all addresses_id and save values direct to addresses_users table?
Or there is better ideas?

Add a user in Cakephp

There is a problem when I write an add() function for UsersController.
public function add() {
if ($this->request->is('post')) {
$this->request->data['User']['book_id'] = $this->Book('id');
if ($this->User->saveAssociated($this->request->data)){
$this->request->data['User']['book_id'] = "ff";
$this->Session->setFlash(__('Save User'));
return $this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(__('User Error.'));
}
}
If I add a User I want to save the book ID in my User book_id.
Anyone know how to deal with this problem? Thanks!
When you're adding a new user, does he get to select a book from a drop down(in the form)? If so, $this->request->data['User']['book_id'] will already contain the Book id.
There's no need to explicitly write $this->request->data['User']['book_id'] = $this->Book('id'); like you have done.
The way I see it, the add.ctp view file should contain a select box containing a list of all books which the user can select. On selecting one of those and submitting the form, $this->request->data['User']['book_id'] will automatically store the book_id, without having to write anything in the controller.
Please specify the add.ctp form fields so that I can assist you better.
Thanks!

Saving related model data (3 levels)

Really struggling with saving model info a few levels down.
Firstly, I have a expenseClaim – that hasMany expenses (expenses belongTo expenseClaim).
Expenses HABTM ExpenseCode. (these are things like train fare, petrol costs etc).
So, I have a Add a new Expense page – (ExpenseClaimsController /add).
This kinda looks a bit like a spreadsheet and it allows you to enter multiple rows (each row being a expense). On each row theres a drop down to select the expenseCode. The issue is that the expenseCode is not getting written to the join table (expenses_expense_codes).
If I add a single expense, through the unused and soon to be removed expenseController /add it works fine, so the issue is saving assoisiated models, models. Cant figure out how to do this as expenseCode is not directly related to the expenseClaim model and therefore not saving when I do ExpenseClaimsController /add.
Hope that makes sense….
Heres my ExpenseClaimsController code:
public function add() {
if ($this->request->is('post')) {
//debug($this->request->data);
// Test
$this->loadModel('ExpenseCode');
// Create the claim and the expenses
$this->ExpenseClaim->create();
$this->ExpenseClaim->Expense->create();
// Set the user ID
$this->request->data['ExpenseClaim']['user_id'] = $this->Auth->user('id');
// Set the claim status based on which submit btn was pressed
if ($this->request->data['submit'] == 'Submit') {
$this->request->data['ExpenseClaim']['claim_status_id'] = '2';
} else {
$this->request->data['ExpenseClaim']['claim_status_id'] = '1';
}
// Set the claim status
$now = date('Y-m-d H:i:s');
$this->request->data['ExpenseClaim']['date_submitted'] = $now;
// Save both expenses and the expense claim
if ($this->ExpenseClaim->saveAll($this->request->data)) {
$this->Session->setFlash('The expense claim has been saved', 'flash_success');
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash('The expense claim could not be saved. Please, try again.', 'flash_failure');
}
}
$users = $this->ExpenseClaim->User->find('list');
$claimStatuses = $this->ExpenseClaim->ClaimStatus->find('list');
$expenseCodes = $this->ExpenseClaim->Expense->ExpenseCode->find('list');
$mileageRate = $this->Auth->user('mileage_rate');
$this->set(compact('users', 'claimStatuses', 'expenseCodes', 'mileageRate'));
// Set errors for top of page
$this->set('errors', $this->ExpenseClaim->validationErrors);
}
Can anyone point me in the right direction? Thanks in advance.
Managed to track down the issue, I had to rename the field in ExpenseClaim add to
$this->Form->input('Expense.0.ExpenseCode.ExpenseCode');
This then solved the issue.
Hopefully this will help someone.

CakePHP - Passing Data Between Models

This is my last hope...I have been trying to figure this out all day and I am out of gas. I have an appointment application that an operator inputs phone, business, name, and call result (Customers Controller). The call result then goes to the Appointments controller. Lets say the operator setups up an appointment, I then now need to setup an appointment for the customer I just entered. But when I try and setup a new appointment for the new customer I just get sent back to the Appointments index view instead of the form. What am I doing wrong? I need some other eyes on this. My development team has all been laid off and I am the last one left, so I don't have anyone to bounce ideas and code off. Please help. I don't even know if I am asking the right question at this point.
function step1() {
$this->set('title_for_layout','Make a New Call');
if (!empty($this->data)) {
$this->Customer->create();
$this->data['Customer']['user_id'] = $this->Auth->user('id');
if ($this->Customer->save($this->data)) {
$this->Session->setFlash(__('The customer has been saved', true));
//??? WHAT DO I PUT HERE TO GO TO THE APPOINTMENTS CONTROLLER WITH THIS CUSTOMER DATA
} else {
$this->Session->setFlash(__('The customer could not be saved. Please, try again.', true));
}
}
}
Try this after saving the data
if ($this->Customer->save($this->data)) {
$this->Session->setFlash(__('The customer has been saved', true));
$id = $this->ModelName->getInsertID();
$this->redirect("customers/index/$id");
Now you've the id and fetch the data over there.
Or if you want to pass the entire array to that function then try this link simple cakephp problem
Where did you get $customer ? it isn't initialize
so you can save data in session
but it isn't good idea
$this->Session->write('data',$this->data);
also uoy can transfer customer id to another controller like this
$this->redirect("/appointments /step2/{$id}/");
// this is in appointments controller
function step2($id = null){
if($id){
$this->loadModel('Customer');
$customer = $this->Customer->findById($id);
}
}
something like this, hope it helps

Commenting system for CakePHP blog tutorial

I'm building off the CakePHP tutorial for the blog engine by adding comments to each post. I am able to add comments by selecting the post that it should be attached to, via a select box. I would like to be able to click an "Add Comment" link within the post and have the association to the post formed programatically. I am unsure how I can pass the post_id to the add method within my comments_controller. The body of my add method is the auto-generated scaffold code. Is it as easy as adding a $postId argument to the add method and write this to the post_id in my comments model? This doesn't feel right though, since I would expect add to be called when my submit button is click on my comments add view.
Thanks all.
EDIT - Added the code that I'm working with currently. It is just the add method in my comments_controller.
function add($postid = null) {
if(!empty($this->data) {
$this->Comment->create();
$this->Comment->post_id = $postid;
if ($this->Comment->save($this->data)) {
$this->Session->setFlash(__('The Comment has been saved', true));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The Comment could not be saved. Please,
try again.', true));
}
}
$this->set('post_id', $postid);
print_r($postid);
}
function add($postid = null) {
if(!empty($this->data) {
$this->Comment->create();
$this->data['Comment']['post_id'] = $postid; // see how it needs to be?
...then save the data...
Create your link at the bottom of your blog post as,
<?php echo $html->link('Add Comment', array('controller'=>'Comments','action'=>'add',$post->id)) ?>
Then you can, in your Comments controller's Add method,
function add($postid){
$this->data->Comment->post_id = $postid;
$this->data->Save();
}
Similar to this would do you just fine I'd say. Then your url would be example.com/comments/add/3 Double check the code though, as it's first thing in the morning and we've run out of milk, so I have had no coffee! ;)

Resources