The point is that what you are trying to do, I and others do all the time without any problems and without having to specify a field whitelist array ... you are calling your data using a method which sets the model data during retrieval, I don't know exactly why this is creating your problem, but I assume that if you don't use Model::read() your data will save correctly.
Whilst I agree it seems logical to only try saving the data you pass as part of the save call, why labour on this point, if not using Model::read() allows it to work? Give in to the conventions and the learning curve becomes for less steep, 99% of the times I have gone hunting for a bug in the core, I have eventually realised I was mistaken. HTH, Paul. On Oct 1, 12:28 pm, dtemes <[email protected]> wrote: > I see your point there in using find instead of read, but I still > think that a save operation should only take into account the passed > data (plus the special fields creatd and modified), looking at the api > and teh core code I can see there is a white list of fields to be > updated, you can specify the array of fields to update when calling > save, but if you omit it i would expect the keys available in the data > that is going to be saved to be used as whitelist. > > Call it atomicity, encapsullation or separation of concerns, when you > are working in a complex application, and specially if you follow the > fat model skinny controller approach, you can not be sure of what is > happening behind the scenes in related models, behaviours, callbacks, > filters... > > Having to go with something like "Update fields A,B and C of record 2, > but take only into account fields A,B and C" seems very redundant to > me. > > I wonder if this is just you and me or other people following the > thread can bring some light. > > Regards > > On 30 sep, 11:33, WebbedIT <[email protected]> wrote: > > > > > > > > > Ahh, try using: > > $this->User->find('first', array('conditions'=>array('User.id'=>1))); > > > Instead of: > > $this->User->read(null, 1); > > > By using Model::read() you're setting the data array at the same time > > as extracting your data. > > > Extract fromhttp://book.cakephp.org/view/1029/read: > > "read() is a method used to set the current model data (Model::$data)-- > > such as during edits ..." > > > HTH, Paul > > > On Sep 30, 9:04 am, dtemes <[email protected]> wrote:> I have created a test > > function in the controller to illustrate it. > > > Remember that I am updating the user from the groups controller. The > > > relation is User belogs to Group, and Group hasMany User > > > > function test(){ > > > $this->Group->User->recursive=-1; > > > $user1=$this->Group->User->read(null,1); > > > > $user2=array('User'=>array('id'=>2, > > > > > > 'first_name'=>'New name1', > > > ) > > > ); > > > DEBUG($user1); > > > DEBUG($user2); > > > > if ($this->Group->User->save($user2,false)){ > > > echo "Save ok"; > > > } > > > else > > > { > > > echo "Error saving"; > > > } > > > > $this->render('view'); > > > } > > > > This is the output: > > > > For $user1: > > > > Array > > > ( > > > [User] => Array > > > ( > > > [id] => 1 > > > [username] => dtemes > > > [first_name] => xxxxx > > > [last_name] => > > > [email] => [email protected] > > > [created] => 2010-02-05 23:59:21 > > > [password] => xxxxxx > > > [enabled] => 1 > > > [role_id] => 1 > > > [modified] => 2011-09-25 23:15:34 > > > [activation_key] => d6e1f8fe5b5a40d5b403bb596f2cece0 > > > [payment] => 1 > > > [tutor1] => > > > [tutor2] => > > > [tutor3] => > > > [position] => 5 > > > [optout] => 0 > > > [country] => > > > [school_id] => 1 > > > [group_id] => 1 > > > ) > > > > ) > > > > For $user2: > > > > Array > > > ( > > > [User] => Array > > > ( > > > [id] => 2 > > > [first_name] => New name1 > > > ) > > > > ) > > > > and finally, the update query..... > > > > UPDATE `users` SET `id` = 2, `username` = 'xxxxx', `first_name` = 'New > > > name1', `last_name` = '', `email` = '[email protected]', `created` = > > > '2010-02-05 23:59:21', `password` = 'xxxxxx', `enabled` = 1, `role_id` > > > = 1, `modified` = '2011-09-25 23:15:34', `activation_key` = > > > 'd6e1f8fe5b5a40d5b403bb596f2cece0', `payment` = 1, `tutor1` = '', > > > `tutor2` = '', `tutor3` = '', `position` = 5, `optout` = 0, `country` > > > = '', `school_id` = 1, `group_id` = 1 WHERE `users`.`id` = 2 > > > > Regards > > > > On 29 sep, 08:48, WebbedIT <[email protected]> wrote: > > > > > So you're re-checking UserA on every page load to compare if anything > > > > hs changed, it would be more efficient to update the session after a > > > > user's profile has been updated, then you only need to refer to the > > > > session. > > > > > I am 99.9% certain this is not a bug as I update data in this way all > > > > the time. > > > > > - How are you reading the UserA data before saving UserB? > > > > - Can you show us these lines of code in your controller? > > > > - If you comment out the reading of UserA before save does the data > > > > array save correctly? > > > > - Have you echoed $this->data before and after save to see what it > > > > contains? > > > > > HTH, Paul > > > > > On Sep 28, 9:55 pm, dtemes <[email protected]> wrote:> You are right > > > > that userA data is available in the session, and even > > > > > accessible via $this->Auth, but some userA data can be modified > > > > > outside of cake (or a cake task run via cron for instance) so I need > > > > > to read userA before saving userB. > > > > > > From my point of view a call to model->save where the data passed > > > > > contains the primary key is to be considered an update, and as such, > > > > > only fields in the data array should be updated (plus the modified > > > > > field if it exists in the database) . > > > > > > Cake experts out there, please advise if I should try to build a test > > > > > case and file a bug. > > > > > > Regards > > > > > > On 28 sep, 10:00, WebbedIT <[email protected]> wrote: > > > > > > > Login should be an action conducted at least two page requests > > > > > > before > > > > > > you edit UserB and as such why are you reading UserA's data when > > > > > > saving UserB's edited data? > > > > > > > Once a user is authenticated their data is readily available in the > > > > > > session, sounds like your doing an extra call and putting that data > > > > > > into $this->data at some point. > > > > > > > HTH, Paul. > > > > > > > On Sep 27, 12:25 pm, dtemes <[email protected]> wrote: > > > > > > > > It's part of the same query, no after/beforeSave running. > > > > > > > > The model in question is the User model. These are my steps > > > > > > > > 1. Read the logged in user (Lets call it UserA) > > > > > > > 2. Select another user from the user table to update (UserB). > > > > > > > 3. Present a form with just a few fields that I need to update > > > > > > > 4. Update UserB using the data in the form. > > > > > > > > If I follow this pattern UserB fields not present in the data > > > > > > > array > > > > > > > are filled with data from UserA > > > > > > > > If I call User->create() between steps 3 and 4, then no data from > > > > > > > UserA is passed to UserB, but fields not present in the data array > > > > > > > coming from the form are reset to the database default value..... > > > > > > > > The only solution is to read UserB before step 4. > > > > > > > > On 26 sep, 12:30, WebbedIT <[email protected]> wrote: > > > > > > > > > Is the update of the enabled field happening as part of the > > > > > > > > same SQL > > > > > > > > query or a separate one? Are you sure you have not got a > > > > > > > > callback > > > > > > > > (beforeSave or afterSave) running which is doing this? > > > > > > > > > HTH, Paul > > > > > > > > > On Sep 25, 7:20 pm, dtemes <[email protected]> wrote:> More > > > > > > > > information, If i don't provide a value for fields that have a > > > > > > > > > default value in the database, the fields are modified and > > > > > > > > > they take > > > > > > > > > the database default value. > > > > > > > > > > For instance I have a reset password action that takes data > > > > > > > > > from a > > > > > > > > > form with just the user id and password. The data array only > > > > > > > > > has id > > > > > > > > > and password. > > > > > > > > > > Submitting the form changes the user password, but the user > > > > > > > > > model has > > > > > > > > > a enabled field, with a default value of 0. In the sql query > > > > > > > > > I can see > > > > > > > > > that cake is doing an update of the password fields but also > > > > > > > > > of the > > > > > > > > > enabled field. > > > > > > > > > > Using cake 1.3.5 > > > > > > > > > > On 25 sep, 15:31, dtemes <[email protected]> wrote: > > > > > > > > > > > I ahev to related models, group and user, and I have a form > > > > > > > > > > to update > > > > > > > > > > user data from the groups controller, previously to the > > > > > > > > > > User->Save i > > > > > > > > > > read some information from the current user, the code is > > > > > > > > > > something > > > > > > > > > > like: > > > > > > > > > > > $this->Group->User->read->($this->Auth->user('id')); > > > > > > > > > > . > > > > > > > > > > . > > > > > > > > > > . > > > > > > > > > > $this->Group->User->Save($this->data); > > > > > > > > > > > As a result if the current user value of fieldX is 123, > > > > > > > > > > then the > > > > > > > > > > fieldX of the user being updated takes the value 123, but > > > > > > > > > > there is no > > > > > > > > > > such fieldX in the $this->data > > > > > > > > > > > One way to avoid this is by doing a > > > > > > > > > > $this->Group->User->read(null, > > > > > > > > > > $this->data['User']['id']); but either there is something > > > > > > > > > > wrong in the > > > > > > > > > > cake implementation of the save function or most probably I > > > > > > > > > > am missing > > > > > > > > > > something. > > > > > > > > > > > Any ideas? -- Our newest site for the community: CakePHP Video Tutorials http://tv.cakephp.org Check out the new CakePHP Questions site http://ask.cakephp.org and help others with their CakePHP related questions. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/cake-php
