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; $i<1; $i++)
{
$persona = new Persona();
// $persona->setId($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));
}