Embedded Forms con Symfony

Hola nuevamente, mi siguiente post tiene que ver con los formularios embebidos. En este post agrego cómo hacer que no se tomen en cuenta los formularios vacíos embebidos, lo que he escrito está basado en los siguientes post:
http://www.nacho-martin.com/dynamic-embedded-forms-in-symfony
http://nibsirahsieu.com/2009/11/07/dynamic-input-using-javascript-and-symfony-embedded-forms

Les dejo mi código;
http://pastebin.com/embed_iframe.php?i=LyeCxzJu
public function configure()
{
$this->embedBeneficiarios();
}

public function addBeneficiarioForm($key)
{
$beneficiario = new Beneficiario();
$beneficiario->setAsociado($this->object->getId());
$beneficiarioForm = new BeneficiarioForm($beneficiario);

// embebiendo el nuevo beneficiario en el container
$this->embeddedForms[‘beneficiarios’]->embedForm($key,$beneficiarioForm);
// re-embebiendo el formulario container
$this->embedForm(‘beneficiarios’,$this->embeddedForms[‘beneficiarios’]);
}

public function updateEmbeddedBeneficiarios()
{
// update content item
if (!is_null($beneficiarios = $this->getBeneficiarios()))
{

$values = $this->getValues();

foreach($beneficiarios as $beneficiario)
{
if ( $beneficiario->isNew() )
{
$values[‘asociado’] = $this->object->getId();
}

$beneficiario->fromArray($values, BasePeer::TYPE_FIELDNAME);

$beneficiario->save();
}
}
}

protected function getBeneficiarios()
{
if (!$this->object->getBeneficiarios())
{
return new Beneficiario();
}
else
{
return $this->object->getBeneficiarios();
}
}

protected function embedBeneficiarios()
{
$BeneficiariosForm = new sfForm();

// solo necesitamos embeber al fromulario via ajax
if (false === sfContext::getInstance()->getRequest()->isXmlHttpRequest())
{
$beneficiarios = $this->getObject()->getBeneficiarios();
if(count($beneficiarios) == 0)
{
// creamos 3 por default
for ($i=0; $isetAsociado($this->getObject()->getId());
$beneficiarios[] = $beneficiario;
}
}
foreach($beneficiarios as $key => $v)
{
$beneficiarioForm = new BeneficiarioForm($v);
$BeneficiariosForm->embedForm(‘beneficiario’.($key+1),$beneficiarioForm);
$BeneficiariosForm->widgetSchema[‘beneficiario’.($key+1)]->setLabel(‘Beneficiario ‘.($key+1));
}
}

$this->embedForm(‘beneficiarios’, $BeneficiariosForm);
$this->widgetSchema[‘beneficiarios’]->setLabel(‘Beneficiarios’);
}

public function save($con = null)
{
if(!$this->getObject()->isNew())
{
$this->updateEmbeddedBeneficiarios();
}

parent::save();
}

/**
** Sobreescribirmos el método bind para manejar los formularios embebidos
**/
public function bind(array $taintedValues = null, array $taintedFiles = null)
{
foreach($taintedValues[‘beneficiarios’] as $key => $form) {
if(false === $this->embeddedForms[‘beneficiarios’]->offsetExists($key))
{
$this->addBeneficiarioForm($key);
}
}
parent::bind($taintedValues,$taintedFiles);
}

/**
* sobreescribimos el método saveEmbeddedForms para que guarde correctamente
*/
public function saveEmbeddedForms($con = null, $forms = null)
{
if(null === $con)
{
$con = $this->getConnection();
}

if(null === $forms)
{
$beneficiarios = $this->getValue(‘beneficiarios’);
$forms = $this->embeddedForms;

foreach($this->embeddedForms[‘beneficiarios’] as $name => $form)
{
if(!isset($beneficiarios[$name]))
{
unset($forms[‘beneficiarios’][$name]);
}
}
}

foreach($forms as $form)
{
if($form instanceof sfFormObject)
{
if($form->getObject()->isNew())
{
$form->saveEmbeddedForms($con);
$form->getObject()->save($con);
$this->updateEmbeddedBeneficiarios($form->getObject());
}
}
else
{
$this->saveEmbeddedForms($con,$form->getEmbeddedForms());
}
}
}// saveEmbeddedForms()

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s