EmbedForms con AJAX en Symfony

En el post anterior, había publicado cómo hacer formularios embebidos, ahora le agregaremos algo de funcionalidad, permitiendo mediante un botón añadir más formularios embebidos con peticiones mediante ajax.

http://pastebin.com/embed_iframe.php?i=FQWR3ZUY

public function configure()
{
$this->embedBeneficiarios();
}

public function addBeneficiarioForm($key)
{
$beneficiarioForm = new PersonaBeneficiarioForm(new Persona());

// 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($pariente)
{
$values[‘persona’] = $this->object->getId();
$values[‘pariente’] = $pariente->getId();
$values[‘beneficiario’] = 1;
$beneficiario = new Beneficiario();
$beneficiario->fromArray($values,BasePeer::TYPE_FIELDNAME);
$beneficiario->save();
}

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

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

// solo necesitamos embeber al fromulario via ajax
if (false === sfContext::getInstance()->getRequest()->isXmlHttpRequest())
{
$beneficiarios = $this->getObject()->getBeneficiariosRelatedByPersona();
if(count($beneficiarios) == 0)
{
// creamos 1 por default
for ($i=0; $isetId($this->getObject()->getId());
$beneficiarios[] = $persona;
}
}
else
{
foreach($beneficiarios as $i => $beneficiario)
{
$beneficiarios[$i] = BeneficiarioPeer::toPersona($beneficiario);
}
}
foreach($beneficiarios as $key => $v)
{
$beneficiarioForm = new PersonaBeneficiarioForm($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’);
}
/**
** 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()

/**
* esto es el action de tu clase actions
*/
public function executeAddBeneficiarioForm(sfWebRequest $request)
{
$this->forward404Unless($request->isXmlHttpRequest());
$number = intval($request->getParameter(“num”)+1);
$key = ‘beneficiario’.$number;

if($asociado = AsociadoPeer::toPersona(AsociadoPeer::retrieveByPk($request->getParameter(‘id’))))
{
$form = new PersonaForm($asociado);
}
else
{
$form = new PersonaForm(null);
}

$form->addBeneficiarioForm($key);

return $this->renderPartial(‘addBeneficiario’,array(‘field’=>$form[‘beneficiarios’][$key],’num’=>$number));
}

Anuncios

2 thoughts on “EmbedForms con AJAX en Symfony

    1. Pues bueno, alguna vez intenté usar Propel y te cuento que me fue más flexible Doctrine… bueno, envíame lo que deseas, si quieres envíame un link de pastebin… si todavía te es útil, perdona que responda hasta ahora, estuve algo de tiempo desconectado

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