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:
classUserInformationForm 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:
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:
<formname="<?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>