I've been experimenting with advanced validation per
http://wiki.cakephp.org/tutorials:advanced_validation:advance_validation_with_parameters
and the ErrorHelper class.
I need my UsersController's update() method to update both the
underlying 'users' table as well as the 'people' table that the User
model belongsTo. I've discovered that when you just say
$this->User->save($this->data['User'])
cake updates 'users' table but not 'people'. So I instantiate my own
Person object in the UsersController constructor, and assign it to an
instance var, which I update it "manually" (it's still pretty easy,
thank you Cake) in my update().
But I don't want to update anything unless both models validate. So I
check that manually before calling save(). Fine. The only hitch is that
in my view update.thtml, I have not been able to figure out to get
e.g., $error->showMessage('Person/lastname') to show the validation
error that I know to exist from the controller's point of view in
$this->Person->validationErrors. I've been trying an ugly workaround as
commented in the code below, but I would like to know how to make it
work as it does for $error->showMessage('User/username'), and/or what I
am doing wrong. Thank you!
Here is the controller:
<?php
class UsersController extends AppController {
var $name = 'User';
var $helpers = array('Error','Html');
function __construct() {
parent::__construct();
$this->Person = new Person();
}
function index() {
$this->set('users',$this->User->findAll());
}
function update($id = null) {
if (empty($this->data))
{
$this->User->person_id = $id;
$this->data = $this->User->read();
}
else
{
// load validation rules
$this->User->load_validation();
$this->Person->load_validation();
// if both models validate...
$valid_user = $this->User->validates($this->data);
$valid_person = $this->Person->validates($this->data);
if ($valid_user && $valid_person)
{
// ...try to save
if ($this->User->save($this->data['User']) &&
$this->Person->save($this->data['Person']))
{
$this->flash("User
{$this->data['User']['username']} has been
updated.",'/users');
} else {
debug($this->User->validationErrors);
debug($this->Person->validationErrors);
}
} else {
// nasty workaround
$this->set('validationErrors',$this->Person->validationErrors);
}
}
}
}
?>
and here is the view:
<form method="POST" action="<?=$html->url('/users/update')?>">
<?=$html->hidden('Person/id')?>
<?=$html->hidden('User/person_id')?>
<tr>
<td>First name</td>
<td><?=$html->input('Person/firstname')?></td>
</tr>
<tr>
<td>Last name</td>
<td><?php
// the ugly workaround...
if (@$validationErrors['lastname']):?>
<div class="error_message"><?=$validationErrors['lastname']?></div>
<?php endif;
// ..because this doesn't work
$error->showMessage('Person/lastname')?><?=$html->input('Person/lastname')?></td>
</tr>
<tr>
<td>Username</td>
<td>
<?=$error->showMessage('User/username') // <-- but this works fine ?>
<?=$html->input('User/username')?></td>
</tr>
<tr><td> </td><td><?=$html->submit('Save')?></td>
</tr>
</form>
Thanks again.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Cake
PHP" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/cake-php
-~----------~----~----~----~------~----~------~--~---