Embeber un formulario en otro (embedForm)

Hace un tiempo me toco la “sencilla” tarea de embeber dos formularios para completar el form de resgistración.

La función utilizada para dicha tarea es embedForm ($this->embedForm(“nombre_form”, $objeto_del_form);), para ello lo veremos en un sencillo ejemplo, en el cual debemos mostrar un formulario UserInformationForm, el cual tiene embebido a un companyForm. Siempre partiendo de la premisa de la correcta construccion del schema.yml y de la existencia de los dos Formularios.

El userForm:

class UserInformationForm extends UserForm
{
  public function configure()
  {
    unset($this['name']);
    
    // Bookmark creation form
    $newcompanyForm = new companyForm();
     $this->embedForm('company', $newcompanyForm);
    
    // Existing bookmark forms
    $this->embedRelation('Bookmarks');
    
    $this->widgetSchema->setNameFormat('user_bookmarks[%s]');
	
    $this->useFields(array( 'username', 'email_address', 'password', 'password_again', 'company'));

    $this->widgetSchema['username'] = new sfWidgetFormInputText();
    $this->widgetSchema['email_address']= new sfWidgetFormInputText();
    $this->widgetSchema['password']  = new sfWidgetFormInputPassword();
    $this->widgetSchema['password_again']  = new sfWidgetFormInputPassword();

    $this->validatorSchema['username']     = new sfValidatorString();
    $this->validatorSchema['email_address']= new sfValidatorEmail();
    $this->validatorSchema['email_address']= new sfValidatorEmail();
    $this->validatorSchema['password_again'] = clone $this->validatorSchema['password'];

  }

}

A las validaciones y la deceleración de los widget de company se los deberá hacer en el mismo form, o sea en el companyForm().
Nótese que al declarar los campos que serán utilizados ($this->useFields(.. ) al final aparece el nombre ‘company’ ese nombre debe coincidir con el nombre que le dimos al formulario que embebimos ( $this->embedForm(‘company’, $newcompanyForm); ).
A partir de este momento, ‘company’ pasará a formar parte  UserInformationForm como un array dentro de este; como tal, cada vez queremos acceder a los campos de company lo deberemos hacer de la siguiente manera:

<form 
name="<?php echo $form->getName()?>" 
method="post" 
action="<?php echo url_for('direction') ?>" 
id="formRegister">

                    <?php echo $form->renderGlobalErrors() ?>

                    User Name:<br />
                    <div>
                        <?php echo $form['username']?>
                    </div>
	      <?php echo $form['username']->renderError() ?>

                    Password:<br />
                    <div>
                        <?php echo $form['password']?>
                    </div>
                    <?php echo $form['password']->renderError() ?>

                    Repeat Password:<br />
                    <div>
                        <?php echo $form['password_again']?>
                    </div>
                    <?php echo $form['password_again']->renderError() ?>
                    <br>
	     
                     Email:<br />
                    <div>
                        <?php echo $form['email_address']?>
                    </div>
                    <br />
                    <?php echo $form['email_address']->renderError() ?>
                    <br>

                    Company:<br />
                    <div>
                        <?php echo $form['company']['name'] ?>
                    </div>
                    <br />
                    <?php echo $form['company']['name']->renderError() ?>
                    <br>
                    <!-- p>If you would like us to call you directly* optional   </p -->

                    <p>How many employees do you have?: </p>
                    <div>
                        <?php echo $form['company']['employees']?>
                    </div>
                    <br />
                    <?php echo $form['company']['employees']->renderError() ?>
                    <br>

</form>

Posted in Doctrine, Symfony