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; $i<1; $i++)
{
$beneficiario = new Beneficiario();
$beneficiario->setAsociado($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()