código atualizado:
<?php
/*
* Created on 15/03/2011
*
*/
class NestedHtmlHelper extends CWidget
{
public function link_to_add($form, $new_obj_of_required_type, $partial, $div_to_add_the_item='telefone')
{
try
{
//die(print_r($new_obj_of_required_type));
$controller = new CController('helper');
$array_obj_name = get_class($new_obj_of_required_type);
$array = array($array_obj_name => $new_obj_of_required_type,
'form' => $form,);
$page = $controller->renderPartial("../$partial", $array, true);
$page = $this->html_to_append_in_js($page);
$link = "<script type='text/javascript' language='javascript'>
function add_nxn_form(link) {
var new_id = new Date().getTime();
var regexp = new RegExp('new', 'g')
jQuery(link).parent().find('div.novos').before('$page'.replace(regexp, new_id));
}
</script>";
$link = "<a href='javascript:' onclick='add_nxn_form(this);'> Novo </a>$link";
return $link;
} catch( Exception $e ) {
die($e);
}
}
public function html_to_append_in_js($string) {
$string = str_replace('\'', '"', $string);
$string = str_replace(' ', ' ', $string);
$string = str_replace(' ', ' ', $string);
$string = str_replace('\r', ' ', $string);
$string = str_replace('\n', ' ', $string);
$string = str_replace('\r\n', '', $string);
$string = str_replace('/' , '\/', $string);
$string = str_replace('\t' , '', $string);
$string = preg_replace('/\s/',' ',$string);
return $string;
}
}
?>
view partial de telefones :
não é necessario o [telefones] nos ids, mais é totalmente necessario o new
<?
if (!isset($telefone)) {
$telefone = new Telefone;
$telefone->id = 'new';
}
$form->actionPrefix = 'Telefones'
?>
<div id="telefone" class="telefone">
<?= $form->errorSummary($telefone); ?>
<?= $form->hiddenField($telefone, "[telefones][$telefone->id]id") ?>
<div class="row">
<?= $form->labelEx($telefone, "Numero"); ?>
<?= $form->textField($telefone, "[telefones][$telefone->id]numero", array("size" => 20, "maxlength" => 10)); ?>
<?= $form->error($telefone, "numero"); ?>
</div>
<div class="row">
<?= $form->labelEx($telefone, "Complemento"); ?>
<?= $form->textField($telefone, "[telefones][$telefone->id]complemento", array("size" => 60, "maxlength" => 255)); ?>
<?= $form->error($telefone, "complemento"); ?>
</div>
<div class="row">
<?= $form->labelEx($telefone, "Tipo"); ?>
<?= $form->textField($telefone, "[telefones][$telefone->id]tipo", array("size" => 60, "maxlength" => 255)); ?>
<?= $form->error($telefone, "tipo"); ?>
</div>
<div class="opcoes">
</div>
</div>
<hr />
na view eu faço o seguinte :
<?= $helper->link_to_add($form, new Telefone, 'telefones/_telefone'); ?>
e não esquecer de usar jquery 