Hi,
I'm trying to do something that is close to what is described in
http://www.symfony-project.org/advent_calendar/9/en.
To start with, I'm using sfDoctrineGuard and I want to be able to
define user accounts connected to either Persons or Firms.Person and
Firm are two entities that both inherit a common Contact entity. I
have added the schema I am using to the end of this message[1].
In the ContactForm class I embedd a subclass[2] of
sfGuardUserAdminForm into the form:
// in configure()
$form = new ContactUserForm($this->getObject()->user );
if ($form->getObject()->id == null) unset($form['id']);
$this->embedForm("sfguarduser_id", $form);
// and set up a postValidator.
$this->mergePostValidator(new ContactUserValidatorSchema());
I have also added a saveEmbeddedForms to the ContactForm class:
public function saveEmbeddedForms($con = null, $forms = null)
{
if (null === $forms)
{
$user = $this->getValue('sfguarduser_id');
if ($user == null) {
$forms = $this->embeddedForms;
unset($forms['sfguarduser_id']);
}
}
return parent::saveEmbeddedForms($con, $forms);
}
The ContactUserValidatorSchema class is also attached, but I think
this part of the setup is correctl.
What I want to do is that if the username and password fields of the
embedded schema are empty, then I do not want a user object to be
created. As it stands now, an object is created with the username set
to "". This only works the first time of course as the username has to
be unique.
I hope someone has an idea on what I am doing wrong here. I seem to
have misunderstood something simple - I just wish I knew what.
Tarjei
1. Schema:
Contact:
columns:
firstname: string(255)
lastname: string(255)
jobRole: string(255) # stilling
mobile: string(255)
phone: string(255)
email: string(255)
description: string(255)
post_address_id: integer
sfguarduser_id: integer(4)
relations:
postAddress:
class: Address
type: one
foreignType: one
foreign: id
local: post_address_id
cascade: [delete]
user:
class: sfGuardUser
local: sfguarduser_id
cascade: [delete]
Person:
inheritance:
extends: Contact
type: column_aggregation
keyField: type
keyValue: 2
(There is also another subclass that I have omitted to make this post
as short as possible).
2. class ContactUserForm extends sfGuardUserAdminForm {
public function configure() {
parent::configure();
foreach (array('username', 'password') as $key ) {
$this->validatorSchema[$key]->setOption('required', false);
}
}
}
3.
class ContactUserValidatorSchema extends sfValidatorSchema
{
protected function configure($options = array(), $messages = array
())
{
}
protected function doClean($values)
{
$errorSchema = new sfValidatorErrorSchema($this);
/* return at once if the values are missing */
if (!isset($values['sfguarduser_id']) || !$values
['sfguarduser_id']) {
return $values;
}
$userFormValues = $values['sfguarduser_id'];
$errorSchemaLocal = new sfValidatorErrorSchema($this);
// username is filled but no password
if ($userFormValues['username'] && !$userFormValues['password'])
{
$errorSchemaLocal->addError(new sfValidatorError($this,
'required'), 'password');
}
// password is filled but no username
if ($userFormValues['password'] && !$userFormValues['username'])
{
$errorSchemaLocal->addError(new sfValidatorError($this,
'required'), 'username');
}
// no password and no username, remove the empty values
if (!$userFormValues['username'] && !$userFormValues['password'])
{
unset($values['sfguarduser_id']);
}
// some error for this embedded-form
if (count($errorSchemaLocal))
{
$errorSchema->addError($errorSchemaLocal, (string)
"sfguarduser_id");
}
// throws the error for the main form
if (count($errorSchema))
{
throw new sfValidatorErrorSchema($this, $errorSchema);
}
return $values;
}
}
--
You received this message because you are subscribed to the Google Groups
"symfony users" 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/symfony-users?hl=en.