Tuesday, December 11, 2012

Re: Validating multiple models in one form

Hi Jodator,

Thank you Jodator, I presumed I had the conventions wrong but the CakePHP conventions page was convulsive and difficult to piece together.

I have made the conventions changes and its validating great! :D It is always the little things lol

Thanks again

On Tuesday, 11 December 2012 07:00:17 UTC, jodator wrote:
Why do you have $name = 'UserInfos' while your class is UserInfo (and also 'Users')? Try to make it by Cake conventions and it should validate all associeated models on saveAll().

I would drop those lines, as they are not needed. And try changing UsrInfos to UserInfo in form generation.

Also:

 $this->User->create();
// not needed:   $this->loadModel('UserInfo');

UserInfo is available in $this->User->UserInfo (whith your current belongs to in $this->User->UserInfo).

And:


  'UsersInfos' => array( // why not just UserInfo ?
   'className' => 'users_infos', //Class name should be: UserInfo

Also read about associations in CakePHP, your foreign keys should be user_id (not users_id). It's easier to go by Cake's conventions.



On Tuesday, December 11, 2012 1:08:38 AM UTC+1, Robert Hunt wrote:
Hi All,

I hope someone can help clear this up for me.

Basically I have two models producing fields in a form but when saving it only validates the parent model.

I have attempted to use saveAssociated and I have tried validating the data on a per model basis with no success.

Here is my code:

User Model
class User extends AppModel {
 public $name = 'Users';
 var $hasOne = array(
  'UsersInfos' => array(
   'className' => 'users_infos',
   'foreignKey' => 'users_id'
  )
 );
 var $hasMany = array(
  'UsersIps' => array(
   'className' => 'users_ips',
   'foreignKey' => 'users_id'
  ),
  'UsersStats' => array(
   'className' => 'users_stats',
   'foreignKey' => 'users_id'
  ),
  'UsersSkills' => array(
   'className' => 'users_skills',
   'foreignKey' => 'users_id'
  ),
  'UsersBuildings' => array(
   'className' => 'users_buildings',
   'foreignKey' => 'users_id'
  ),
  'UsersItems' => array(
   'className' => 'users_items',
   'foreignKey' => 'users_id'
  ),
  'UsersMinerals' => array(
   'className' => 'users_minerals',
   'foreignKey' => 'users_id'
  )
 );
 
 public $validate = array(
  'username' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please enter a Username'
   ),
   'isUnique' => array(
    'rule' => array('isUnique'),
'on' => array('create'),
'message' => 'This Username is already taken, please choose another'
   )
  ),
  'password' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please enter a Password'
   ),
   'minLength' => array(
    'rule' => array('minLength', '6'),
    'message' => 'Your Password must be a minimum of 6 characters long'
   )
  )
 );

UserInfo Model 
class UserInfo extends AppModel {
 public $name = 'UsersInfos';
 public $useTable = 'users_infos';
 
 public $belongsTo = array(
  'Users' => array(
   'className' => 'Users',
   'foreignKey' => 'users_id'
  )
 );
 
 public $validate = array(
  'first_name' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please enter your First Name'
   )
  ),
  'last_name' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please enter your Last Name'
   )
  ),
  'email' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please enter your Email'
   ),
   'email' => array(
    'rule' => array('email'),
'message' => 'Please enter a valid Email'
   ),
   'isUnique' => array(
    'rule' => array('isUnique'),
'on' => array('create'),
'message' => 'This Email is already taken, duplicate accounts are not allowed'
   )
  ),
  'age' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please select your Age'
   )
  ),
  'sex' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please select your Sex'
   )
  ),
  'location' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please enter your General Location'
   )
  ),
  'race_id' => array(
   'required' => array(
    'rule' => array('notEmpty'),
    'message' => 'Please select your Race'
   )
  )
 );

Create Account Form
 echo $this->Session->flash();
   echo $this->Form->create('User');
   echo $this->Form->input('User.username', array(
     'label' => 'User:<br>'
    )
   );
   echo $this->Form->input('User.password', array(
     'label' => 'Pass:<br>' 
    )
   );
   echo $this->Form->input('UsersInfos.first_name', array(
     'label' => 'First Name:<br>'
    )
   );
   echo $this->Form->input('UsersInfos.last_name', array(
     'label' => 'Last Name:<br>'
    )
   );
   echo $this->Form->input('UsersInfos.email', array(
     'label' => 'Email:<br>'
    )
   ); 
   echo $this->Form->input('UsersInfos.age', array(
     'type' => 'select',
'options' => array_combine(range(14,100), range(14,100)),
'label' => 'Select Your Age:<br>',
'empty' => 'Your Age'
)
   );
   echo $this->Form->input('UsersInfos.sex', array(
     'type' => 'select',
'options' => array(
 'm' => 'Male',
 's' => 'Female'
),
'label' => 'Select Your Sex:<br>',
'empty' => 'Your Sex'
    )
   );
   echo $this->Form->input('UsersInfos.location', array(
     'label' => 'Location:<br>'
    )
   );
   // TODO : generate $raceIDs variable using race table
   $raceIDs = array(0 => 'Terran', 1 => 'Nexus');
   echo $this->Form->input('UsersInfos.race_id', array(
     'type' => 'select',
'options' => $raceIDs,
'label' => 'Choose Your In-Game Race:<br>',
'empty' => 'Choose Your Race'
)
   );
   echo $this->Form->submit('Go!', array(
     'class' => 'btn'
    )
   );
   echo $this->Form->end();

Create Account Action
 public function createAccount() {
  if ($this->request->is('post') || $this->request->is('put')) {
   $this->User->create();
   $this->loadModel('UserInfo');
   $dbo = $this->User->getDataSource();
   $now = $dbo->expression('NOW()');
   $this->request->data['UsersInfos']['date_created'] = $now ;
   $this->request->data['UsersInfos']['date_modified'] = $now;
   $this->request->data['UsersInfos']['register_ip'] = $this->request->clientIp();
   
   debug($this->request->data);
   
   if ($this->User->saveAll($this->request->data, array('validate' => 'first')))
    $this->Session->setFlash(__('Your account was successfully created!'));
   else
    $this->Session->setFlash(__('Your account could not be created, please check your entries and try again'));
  }
 }

The data returned
\app\Controller\UsersController.php (line 53)
array(
'User' => array(
'password' => '*****',
'username' => 'mrenigma'
),
'UsersInfos' => array(
'first_name' => '',
'last_name' => '',
'email' => '',
'age' => '',
'sex' => '',
'location' => '',
'race_id' => '',
'date_created' => object(stdClass) {
type => 'expression'
value => 'NOW()'
},
'date_modified' => object(stdClass) {
type => 'expression'
value => 'NOW()'
},
'register_ip' => '127.0.0.1'
)
)
 Any help would be much appreciated with this, if you need any more information then please let me know and I will do my best to provide it.

--
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP
 
---
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com.
To unsubscribe from this group, send email to cake-php+unsubscribe@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php?hl=en.
 
 

No comments: