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 symfony-us...@googlegroups.com.
To unsubscribe from this group, send email to 
symfony-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/symfony-users?hl=en.


Reply via email to