Inputs Dinamicos

Buen día… Estoy intentado hacer un sistema de inventrio donde tengo una vista para el registro del inventario existente.

Este es el codigo que tengo en el _form.php


<div class="form">


<?php $form = $this->beginWidget('CActiveForm', array(

	'id' => 'client-account-create-form',

	'enableAjaxValidation' => false,

));

Yii::app()->getClientScript()->registerScript('jquery', '

        cont = 1;

        // Clona la fila oculta que tiene los campos base, y la agrega al final de la tabla

        $("#agregar").on("click", function(){

            $("#tabla tbody tr:eq(0)").clone().removeClass("fila-base").appendTo("#tabla tbody");

            cont++;

        });


        // Evento que selecciona la fila y la elimina

        $(document).on("click",".eliminar",function(){

            alert(cont);

            if (cont >1) {

                var parent = $(this).parents().get(0);

                $(parent).remove();

                cont--;

            }


        });

    ');

?>


<?php echo $form->error($model_articulo, 'cod_articulo'); ?>


    <p class="note">Los campos con <span class="required">*</span> son obligatorios.</p>


    <?php echo $form->errorSummary($model); ?>


    <div class="row">

        <?php echo $form->labelEx($model, 'ano_escolar_cod'); ?>

        <?php echo $form->dropDownList($model, 'ano_escolar_cod', CHtml::listData(Sc05AnoEscolar::model()->findAll(), 'cod_anoEscolar', 'descripcion'), array('prompt' => 'Seleccione...')); ?>

        <?php echo $form->error($model, 'ano_escolar_cod'); ?>

    </div>

    <div class="row">


        <?php echo $form->labelEx($model, 'responsable_cod'); ?>

        <?php echo $form->dropDownList($model, 'responsable_cod', Sc06Responsable::listData(Sc06Responsable::model()->findAll(), 'cod_responsable', 'nombre', 'apellido'), array('prompt' => 'Seleccione...')); ?>

        <?php echo CHtml::link('Crear nuevo responsable', Yii::app()->createUrl('Sc09ArticuloArea/CreateResponsable')); ?>

        <?php echo $form->error($model, 'responsable_cod'); ?>

    </div>

    <div class="row">

        <?php echo $form->labelEx($model, 'area_cod'); ?>

        <?php echo $form->dropDownList($model, 'area_cod', CHtml::listData(Sc04Area::model()->findAll(), 'cod_area', 'nombre'), array('prompt' => 'Seleccione...')); ?>

        <?php echo CHtml::link('Crear nueva área', array(Yii::app()->createUrl('sc04Area/create'), 'param' => 'comeback')); ?>

        <?php echo $form->error($model, 'area_cod'); ?>

    </div>

    <br>

    <section class="container-fluid">

    <table id="tabla" class="table table-condensed table-bordered">

    <!-- Cabecera de la tabla -->

    <thead>

        <tr>

            <th width="40%">Nombre del Articulo</th>

            <th width="40%">Descripción</th>

            <th width="17%">Cantidad</th>

            <th width="3%">&nbsp;</th>

        </tr>

    </thead>


    <!-- Cuerpo de la tabla con los campos -->

    <tbody>


        <!-- fila base para clonar y agregar al final -->

        <tr class="fila-base">


            <td width="40%"><input type="text" class="form-control" id="nombre_articulo_0"/></td>

            <td class="descripcion" width="40%"></td>

            <td width="10%" class="col-xs-2"><input type="text" name="cantidad" class="cantidad form-control"/></td>

            <td class="eliminar" width="3%"></td>

        </tr>

        <!-- fin de código: fila base -->


        <!-- Fila de ejemplo -->

        <tr>

            <td width="40%">

                <?php

echo $form->hiddenField($model_articulo, 'cod_articulo', array()); // Campo oculto para guardar el ID de la persona seleccionada

$this->widget('zii.widgets.jui.CJuiAutoComplete',

	array(

		'name' => 'articulo', // Nombre para el campo de autocompletar

		'model' => $model_articulo,

		'value' => $model_articulo->isNewRecord ? '' : $model_articulo->nombre,

		'source' => $this->createUrl('Sc09ArticuloArea/autocomplete'), // URL que genera el conjunto de datos

		'options' => array(

			'showAnim' => 'fold',

			'size' => '30',

			'minLength' => '1', // Minimo de caracteres que hay que digitar antes de relizar la busqueda

			'select' => "js:function(event, ui) {

$('#nombre_articulo').val(ui.item.id);

}", // HTML-Id del campo

		),

		'htmlOptions' => array(

			'size' => 60,

			'placeholder' => 'Buscar Articulo...',

		),

	));


?>

<?php echo $form->error($model_articulo, 'cod_articulo'); ?>

            </td>

            <td class="descripcion" width="40%"></td>

            <td width="10%" class="col-xs-2"><input type="text" name="cantidad" class="cantidad form-control"/></td>

            <td class="eliminar" width="3%"></td>

        </tr>

        <!-- fin de código: fila de ejemplo -->


    </tbody>

</table>

<!-- Botón para agregar filas -->


<input type="button" id="agregar" class="addArticle" value="Agregar Artículo" />

</section>

<br>

<br>

<br>

    <div class="row buttons">

        <?php echo CHtml::submitButton('Submit'); ?>

    </div>


<?php $this->endWidget();?>


</div>

Este codigo lo que hace es agregar nuevas filas a la tabla, el deber ser es que uno de los campos de cada fila sea un buscador. pero el problema que tengo es que no se como identificar cada input con un nombre propio, osea al agregar una fila este tenga un id o nombre unico.

Espero me puedan ayudar. Muchas gracias de antemano :D

Hola Katherin

hace mucho tuve un problema similar el cual lo solucioné utilizando la siguinete extension Dynamic tabular input.

Esta extension genera un unico ‘name’ o ‘id’ para cada fila que tu agregues, cabe destacar que la extension tiene algunos atributos antiguos y en desuso para las nuevas versiones de javascript y jquery, pero es cuestion de cambiarlos, tampoco son muchos jejeje.

tambien existen varios wikis o guias de como realizar un formulario con ingreso tabular dinamico, que las puedes conseguir facilmente.

Y si no quieres descartar la solución que ya tienes aplicada en tu _form, podrias intentar setear el id utilizando el metodo "attr()" en tu jquery y asignarle como id o name el valor del contador que tienes allí mismo al campo correspondiente.

Saludos

Muchas Gracias Dous voy a revisar lo que me comentaste y te digo como me fue :D

Buen dia Duos,

Te comento que la extención que me recomendaste es la que necesito para desarrollar la insercion del inventario.

EStuve buscando los parametros a cambiar y pues cambie el codigo del archivo jquery.calculation.min.js y el código js del archivo XTabularInput.php y no he logrado corregir el error. Para verificar los elementos js utilizados emplee JsHits para Sublime Text.

Espero me puedas asesorar, y mil gracias de antemado :D

Hola Katherin

Hasta que punto pudiste implementar la extension?

Con respecto a lo que me comentas, si no mal recuerdo creo lo unico que cambie en ese mismo archivo, fue el metodo ‘.live()’ que es un metodo ya en desuso, lo cambie por el metodo ‘.on()’ que es el que lo sustituye para las nuevas versiones de jquery. aqui te dejo un link de como sustituirlo correctamente lo malo es que está en ingles. Cambio de metodo

Aunque realmente quedaria de esta manera:


$("#{$this->id}").on("click",".{$this->removeCssClass}", ..... resto del codigo.....

En la linea donde tienes el metodo ".live()" Igualmente si tienes dudas revisa el link.

Otra cosa que debes tomar en cuenta, es que si quieres utilizar un campo de tipo busqueda, no utilices el CjuiAutocomplete que viene por defecto del framework… utiliza el XJuiAutoComplete que trae la extension para que pueda funcionar correctamente.

Cualquier otra duda no dudes en preguntar, Saludos

Estimado Duos,

Mil gracias, que vergüenza que era solo eso, pense que era el codigo JS que posee la extensión.

Mi trabajo en Yii no es mayor a dos meses y pues me ha costado aprenderlo pero gracias por tus asesorias.

Voy a trabajar y te comento como me fue :D

Te coemnto Duos,

Ademas de la linea que me sugeriste cambiar, tambien modifique el modelo Person de la extensión que me comentaste ya que el buscador no funcionaba, aqui esta el codigo que modifique en el model Person




public function suggestLastname($keyword, $limit=20)

	{

		$criteria=array(

			'select'=>'DISTINCT(lastname) AS lastname',

			'condition'=>'lastname LIKE :keyword',

			'order'=>'lastname',

			'limit'=>$limit,

			'params'=>array(

				':keyword'=>"%$keyword%"

			)

		);

		$models=$this->findAll($criteria);

		$suggest=array();

		foreach($models as $model) {

    		$suggest[] = array(

    			'value'=>$model->lastname,

        		'label'=>$model->lastname,

        	);

		}

		return $suggest;

	}



Lo agrego por si es util para otra persona, con esto el autocomplete queda funcional.

Ahora bien logre implementar esto en mi proyecto. Funciona el autocomplete y el eliminar de las filas pero el agregar filas no me quiere servir. No se cual será la causa ya que en el que descargue ya funciona y copie todo lo que necesitaba la extension incluso agregue los js de la carpeta raiz pero aun asi no funciona.

Aqui coloco el codigo de lo que he realizado:

Mi _form para agregar cosas al inventario:




<!--Generated using Gimme CRUD freeware from www.HandsOnCoding.net -->

<div class="form">


<?php $form = $this->beginWidget('CActiveForm', array(

	'id' => 'client-account-create-form',

	'enableAjaxValidation' => false,

));


?>

    <p class="note">Los campos con <span class="required">*</span> son obligatorios.</p>


    <?php echo $form->errorSummary($model); ?>


    <div class="row">

        <?php echo $form->labelEx($model, 'ano_escolar_cod'); ?>

        <?php echo $form->dropDownList($model, 'ano_escolar_cod', CHtml::listData(Sc05AnoEscolar::model()->findAll(), 'cod_anoEscolar', 'descripcion'), array('prompt' => 'Seleccione...')); ?>

        <?php echo $form->error($model, 'ano_escolar_cod'); ?>

    </div>

    <div class="row">


        <?php echo $form->labelEx($model, 'responsable_cod'); ?>

        <?php echo $form->dropDownList($model, 'responsable_cod', Sc06Responsable::listData(Sc06Responsable::model()->findAll(), 'cod_responsable', 'nombre', 'apellido'), array('prompt' => 'Seleccione...')); ?>

        <?php echo CHtml::link('Crear nuevo responsable', Yii::app()->createUrl('Sc09ArticuloArea/CreateResponsable')); ?>

        <?php echo $form->error($model, 'responsable_cod'); ?>

    </div>

    <div class="row">

        <?php echo $form->labelEx($model, 'area_cod'); ?>

        <?php echo $form->dropDownList($model, 'area_cod', CHtml::listData(Sc04Area::model()->findAll(), 'cod_area', 'nombre'), array('prompt' => 'Seleccione...')); ?>

        <?php echo CHtml::link('Crear nueva área', array(Yii::app()->createUrl('sc04Area/create'), 'param' => 'comeback')); ?>

        <?php echo $form->error($model, 'area_cod'); ?>

    </div>

    <br>

<div class="form">

    <?php $this->widget('ext.widgets.tabularinput.XTabularInput', array(

	'models' => $model,

	'containerTagName' => 'table',

	'headerTagName' => 'thead',

	'header' => '

            <tr>

                <td>' . CHtml::activeLabelEX($model, 'articulo_cod') . '</td>

                <td>' . CHtml::activeLabelEX($model, 'cantidad') . '</td>

                <td></td>

            </tr>

        ',

	'inputContainerTagName' => 'tbody',

	'inputTagName' => 'tr',

	'inputView' => '_tabularInputAsTable',

	'inputUrl' => $this->createUrl('request/addTabularInputsAsTable'),

	'addTemplate' => '<tbody><tr><td colspan="3">{link}</td></tr></tbody>',

	'addLabel' => 'Agregar un artículo',

	'addHtmlOptions' => array('class' => 'blue pill full-width'),

	'removeTemplate' => '<td>{link}</td>',

	'removeLabel' => 'Eliminar',

	'removeHtmlOptions' => array('class' => 'red pill'),

));?>


</div>

    <div class="row buttons">

        <?php echo CHtml::submitButton('Submit'); ?>

    </div>


<?php $this->endWidget();?>


</div><!-- form -->






Mi _tabularInputAsTable (Este es el que traia la extencion pero lo modifique)




<?php $model = Sc08Articulo::model();?>

<?php $modelAA = Sc09ArticuloArea::model();?>


<td>

	<?php $this->widget('ext.widgets.autocomplete.XJuiAutoComplete', array(

	'model' => $model,

	'attribute' => "[$index]nombre",

	'source' => $this->createUrl('request/suggestArticle'),


));?>

	<?php echo CHtml::error($model, "[$index]nombre"); ?>

</td>

<td>

	<?php echo CHtml::activeTextField($modelAA, "[$index]cantidad"); ?>

	<?php echo CHtml::error($modelAA, "[$index]cantidad"); ?>

</td>



Mi RequestController




<?php

class RequestController extends Controller {

	/**

	 * @return array action filters

	 */

	public function filters() {

		return array(

			'accessControl',

			'ajaxOnly -uploadFile',

		);

	}


	/**

	 * Specifies the access control rules.

	 * This method is used by the 'accessControl' filter.

	 * @return array access control rules

	 */

	public function accessRules() {

		return array(

			array('allow',

				'actions' => array(

					'suggestArticle',

					'addTabularInputsAsTable',

				),

				'users' => array('*'),

			),

			array('deny', // deny all users

				'users' => array('*'),

			),

		);

	}


	/**

	 * @return array actions

	 */

	public function actions() {

		return array(

			'suggestArticle' => array(

				'class' => 'ext.actions.XSuggestAction',

				'modelName' => 'Sc08Articulo',

				'methodName' => 'suggestArticle',

				'limit' => 30,

			),

			'addTabularInputsAsTable' => array(

				'class' => 'ext.actions.XTabularInputAction',

				'modelName' => 'Sc09ArticuloArea',

				'viewName' => '/sc09ArticuloArea/_tabularInputAsTable',

			),

		);

	}


	/**

	 * Displays list on persons that have same firstname as person with given id

	 */

	public function actionListPersonsWithSameFirstname() {

		if (isset($_GET['id'])) {

			$model = Person::model()->findbyPk($_GET['id']);

		}


		if ($model !== null) {

			$models = Person::model()->findAll("firstname='{$model->firstname}'");

			$data = array();

			foreach ($models as $model) {

				$data[] = $model->fullname;

			}


			echo Yii::t('ui', 'Persons with same firstname: ') . implode(', ', $data);

		}


	}

}

No se que otro archivo necesites, espero tu respuesta.

PD. Ya los archivos de extensions estan incluidos

Hola Katherin, que bueno que hayas podido avanzar en tu proyecto.

Bueno creo que hay pequeños detalles que corregir. Recuerda que no todo lo que esta en la extension que descargaste lo vas a utilizar, solo utilizaras la carpeta “extensions”, todo lo demas es de un proyecto que se utiliza como ejemplo para demostrar las funcionalidades de la extension. Recuerda que la extensión se utiliza segun tu modelo de datos o Base de Datos, por ejemplo no se si en tu base de datos tengas alguna tabla llamada ‘Person’ que puedas utilizar de la misma manera que se utiliza en el ejemplo que alli te dan o no se si lo pusiste a modo de ejemplo jejeje

Segun tu necesidad que es tener uno a varios textbox de tipo busqueda para buscar articulos e ir añadiendo dinamicamente, supongo que ya tienes la funcion suggest en tu model articulos, la cual que busca los articulos, hasta ahi muy bien.

ahora vayamos a tus vistas, primero tienes el _form que es tu formulario principal, me causa dudas el como utilizas el XTabularInput, en el parametro ‘models’ se debe utilizar un objeto que es una instacia del modelo que vas a generar dinamicamente, me explico si el modelo es Articulos o como tu lo llames, debes crear un objeto que instancie a ese modelo, en tu caso seria algo como $articulos = new Sc08Articulo; ( o Sc09ArticuloArea no lo tengo muy claro), por supuesto esto lo realizas en el actionCreate() del controlador de tu _form y luego se lo envias a la vista mediante el ‘render’. Y con esto eliminarias las instancias que definiste en _tabularInputAsTable.php(a las 2 primeras lineas me refiero).

otra cosa que me llamó la atención es el controlador, el RequestController es el que está en la extension? si es asi descartalo y utiliza el mismo que utiliza el actionCreate() para tu _form.php. Es decir alli colocarias solamente este bloque de codigo:


/**

         * @return array actions

         */

        public function actions() {

                return array(

                        'suggestArticle' => array(

                                'class' => 'ext.actions.XSuggestAction',

                                'modelName' => 'Sc08Articulo',

                                'methodName' => 'suggestArticle',

                                'limit' => 30,

                        ),

                        'addTabularInputsAsTable' => array(

                                'class' => 'ext.actions.XTabularInputAction',

                                'modelName' => 'Sc09ArticuloArea',

                                'viewName' => '/sc09ArticuloArea/_tabularInputAsTable',

                        ),

                );

        }

recuerda darle los permisos en la function accessRules(). Y por ultimo el widget en tu _form quedaria asi:


<div class="form">

    <?php $this->widget('ext.widgets.tabularinput.XTabularInput', array(

        'models' => $articulos, //el objeto que instacia el modelo de Articulos que te mencione anteriormente

        'containerTagName' => 'table',

        'headerTagName' => 'thead',

        'header' => '

            <tr>

                <td>' . CHtml::activeLabelEX($model, 'articulo_cod') . '</td>

                <td>' . CHtml::activeLabelEX($model, 'cantidad') . '</td>

                <td></td>

            </tr>

        ',

        'inputContainerTagName' => 'tbody',

        'inputTagName' => 'tr',

        'inputView' => '_tabularInputAsTable',

        'inputUrl' => $this->createUrl('cambiar_por_tu_controller/addTabularInputsAsTable'), // Aqui debes apuntar a tu action, en el controlador que te mencioné, recuerda que request se descarta. 

        'addTemplate' => '<tbody><tr><td colspan="3">{link}</td></tr></tbody>',

        'addLabel' => 'Agregar un artículo',

        'addHtmlOptions' => array('class' => 'blue pill full-width'),

        'removeTemplate' => '<td>{link}</td>',

        'removeLabel' => 'Eliminar',

        'removeHtmlOptions' => array('class' => 'red pill'),

));?>


</div>

Me gustaría ver el esquema de las tablas involucradas de base de datos, te podria ayudar mejor, de igual manera espero haberme explicado jejeje, cualquier duda estaré por acá, Saludos!

Buen dia Duos

Te comento que a la final no pude implementar la extension que me comentaste pero lo realice a patica por mi cuenta.

Te muestro

ASi quedo mi _form




<!--Generated using Gimme CRUD freeware from www.HandsOnCoding.net -->

<div class="form">


<?php $form = $this->beginWidget('CActiveForm', array(

	'id' => 'top-websites-cr-form',

	'enableAjaxValidation' => true,

	'clientOptions' => array(

		'validateOnSubmit' => true,

		'validateOnChange' => true,

		'validateOnType' => false,

	),

));

?>

<?php

Yii::app()->clientScript->registerScript("variable",

	'

        var articulos = [];

        var cantidades = [];

        var descripciones = [];

    ');

?>

<?php

if (defined(Yii::app()->getSession()->get('guardar_datos'))) {


	Yii::app()->clientScript->registerScript("alert",

		" alert('Los artículos registrados han sido guardado con exito');

    ");

	Yii::app()->getSession()->remove('guardar_datos');

}

if (isset($_POST['Sc09ArticuloArea'])) {

	$articulo_cod = explode(',', $_POST['Sc09ArticuloArea']['articulo_cod']);

	$cantidad = explode(',', $_POST['Sc09ArticuloArea']['cantidad']);

	$descripcion = explode(',', $_POST['descripcion']);


	Yii::app()->clientScript->registerScript("inicializando",

		"

        articulos = " . CJSON::encode($articulo_cod) . ";

        cantidades = " . CJSON::encode($cantidad) . ";

        descripciones = " . CJSON::encode($descripcion) . ";

        ");


}

?>

<?php

Yii::app()->clientScript->registerScript("addArticle",

	'


    function callAjax(){

        if (articulos.length > 0) {

            //alert(articulos.length);

            jQuery.ajax({

                url: "index?r=Sc09ArticuloArea/addList",

                type: "POST",

                data: { articulo_cod : articulos, cantidad : cantidades, descripcion : descripciones},

                success: function(data)

                {

                    $(\'#ListaArticulos\').html(data);


                },

            });

        }

    }

    $(".addArticle").click(function(){

        var art = document.getElementById("articulo").value;

        var cant = document.getElementById("cantidad").value;

        var desc = document.getElementById("nom_articulo").value;

        if (!/^([0-9])*$/.test(cant)) {

            alert("El valor suministrado en el campo cantidad no es un numero entero.")

            document.getElementById("cantidad").focus();

        }else if (art != "" && cant != "") {

            var x = articulos.indexOf(art);

            if (x >= 0) {

                cantidades[x] = parseInt(cant) + parseInt(cantidades[x]);

            } else {

                articulos.push(art);

                cantidades.push(cant);

                descripciones.push(desc);

            }

            art = "";

            cant = "";

            desc = "";

            for (var i=0; i < articulos.length ; i++) {

                art += " - " + articulos[i];

                cant += " - " + cantidades[i];

                desc += " - " + descripciones[i];

            }

            //alert(art + " ** " + cant +" **** " + desc);

        document.getElementById("nom_articulo").value = "";

        document.getElementById("cantidad").value = "";

        document.getElementById("vec_cant").value = cantidades;

        document.getElementById("articulo").value = articulos;

        document.getElementById("descripcion").value = descripciones;

        //alert(document.getElementById("articulo").value+"  "+document.getElementById("vec_cant").value);


        callAjax();

        }else{

            alert("Debe cargar el campo artículo y cantidad");

        }

        return false;

    });

    callAjax();

    $(document).on("click", ".eliminar", function (event) {

        event.preventDefault();

        var element = $(this).attr("id");

        articulos.splice(element, 1);

        cantidades.splice(element, 1);

        descripciones.splice(element, 1);

        document.getElementById("vec_cant").value = cantidades;

        document.getElementById("articulo").value = articulos;

        document.getElementById("descripcion").value = descripciones;

        $(this).closest("tr").remove();

    });


');


?>





    <p class="note">Los campos con <span class="required">*</span> son obligatorios.</p>


    <?php echo $form->errorSummary($model); ?>


    <div class="row">

        <?php echo $form->labelEx($model, 'ano_escolar_cod'); ?>

        <?php echo $form->dropDownList($model, 'ano_escolar_cod', CHtml::listData(Sc05AnoEscolar::model()->findAll(), 'cod_anoEscolar', 'descripcion'), array('prompt' => 'Seleccione...')); ?>

        <?php echo $form->error($model, 'ano_escolar_cod'); ?>

    </div>

    <div class="row">


        <?php echo $form->labelEx($model, 'responsable_cod'); ?>

        <?php echo $form->dropDownList($model, 'responsable_cod', CHtml::listData(Sc06Responsable::model()->findAll('Estado="Habilitado"'), 'cod_responsable', 'nombre', 'apellido'), array('prompt' => 'Seleccione...')); ?>

        <?php echo CHtml::link('Crear nuevo responsable', array('Sc06Responsable/create', 'comeback' => 'yes')); ?>

        <?php echo $form->error($model, 'responsable_cod'); ?>

    </div>

    <div class="row">

        <?php echo $form->labelEx($model, 'area_cod'); ?>

        <?php echo $form->dropDownList($model, 'area_cod', CHtml::listData(Sc04Area::model()->findAll(), 'cod_area', 'nombre'), array('prompt' => 'Seleccione...')); ?>

        <?php echo CHtml::link('Crear nueva área', array('sc04Area/create', 'comeback' => 'yes')); ?>

        <?php echo $form->error($model, 'area_cod'); ?>

    </div>


    <div class="form-inline row">

        <div class="col-md-12">


            <?php echo $form->labelEx($model, 'articulo_cod'); ?>

            <?php echo $form->hiddenField($model, 'articulo_cod', array('id' => 'articulo')); // Campo oculto para guardar el ID de la persona seleccionada                                                                                                                                        ?>

            <?php $this->widget('zii.widgets.jui.CJuiAutoComplete', array(

	'name' => 'nom_articulo', // Nombre para el campo de autocompletar

	'model' => $model,

	'value' => $model->isNewRecord ? '' : $model->articulo_cod,

	'source' => $this->createUrl('Sc09ArticuloArea/autocomplete'), // URL que genera el conjunto de datos

	'options' => array(

		'showAnim' => 'fold',

		'size' => '30',

		'minLength' => '1', // Minimo de caracteres que hay que digitar antes de relizar la busqueda

		'select' => "js:function(event, ui) {

              $('#articulo').val(ui.item.id); // HTML-Id del campo

            }",

	),

	'htmlOptions' => array(

		'size' => 60,

		'placeholder' => 'Buscar artículo...',

	),

));

?>

            <?php echo $form->labelEx($model, 'cantidad'); ?>

            <?php echo CHtml::textField('Text', '', array('size' => 45, 'maxlength' => 45, 'class' => 'cantidad', 'id' => 'cantidad')); ?>

            <?php echo $form->hiddenField($model, 'cantidad', array('id' => 'vec_cant')); // Campo oculto para guardar el ID de la persona seleccionada                                                                                                                                        ?>

            <?php echo CHtml::hiddenField('descripcion', '', array('id' => 'descripcion')); // Campo oculto para guardar el ID de la persona seleccionada                                                                                                                                        ?>

            <?php echo CHtml::link('Agregar elemento a la lista', array('#'), array('class' => 'addArticle')); ?>

        </div>

    </div>

    <?php echo $form->error($model, 'articulo_cod'); ?>

    <?php echo $form->error($model, 'cantidad'); ?>

    <div id="ListaArticulos">


    </div>

    <br>

    <div class="row buttons">

        <?php echo CHtml::submitButton('Guardar en el inventario', array('class' => 'btn btn-primary')); ?>

    </div>

<?php $this->endWidget();?>

</div><!-- form -->



La vista donde cargo la tabla quedo asi




<div class="row">

  <table class="TapGrid" style="width: 750px;">

    <thead>

    <tr>

    <th>Detalle</th>

    <th >Cantidad</th>

    <th ></th>

    </tr>

    </thead>

      <?php

echo '<tbody>';

for ($i = 0; $i < count($codigo); $i++) {

	echo '<tr id="' . $i . '">';

	echo '<td>' . $descripcion[$i] . '</td>';

	echo '<td>' . $cantidad[$i] . '</td>';

	echo '<td>' . CHtml::link("Eliminar", "#", array('class' => 'eliminar', 'id' => $i)) . '</td>';

	echo '</tr>';

}

echo '</tr></tbody>';


?>

  </table>

</div>



Mi controller quedo asi





<?php

class Sc09ArticuloAreaController extends Controller {

	public $layout = '//layouts/column2';

	public $ListaArticulos, $i;

	public function accessRules() {

		return array(

			array('allow', // allow all users to perform 'index' and 'view' actions

				'actions' => array('index', 'view', 'autocomplete'),

				'users' => array('*'),

			),

			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions' => array('create', 'update', 'addList'),

				'users' => array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions' => array('admin', 'delete'),

				'users' => array('admin'),

			),

			array('deny', // deny all users

				'users' => array('*'),

			),

		);

	}

	public function actionIndex() {

		$i = 0;

		$model = new Sc09ArticuloArea;

		$model_articulo = new Sc08Articulo;

		if (isset($_POST['ajax']) && $_POST['ajax'] === 'client-account-create-form') {

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}

		if (isset($_POST['Sc09ArticuloArea'])) {


			#echo CHtml::encode(print_r($_POST, true));

			$model->attributes = $_POST['Sc09ArticuloArea'];

			if ($model->validate()) {


				$articulo_cod = explode(',', $_POST['Sc09ArticuloArea']['articulo_cod']);

				$cantidad = explode(',', $_POST['Sc09ArticuloArea']['cantidad']);

				$descripcion = explode(',', $_POST['descripcion']);

				$i = 0;

				while ($i < count($cantidad)) {

					$model->articulo_cod = $articulo_cod[$i];

					$model->cantidad = $cantidad[$i];

					$findPk = Sc09ArticuloArea::model()->findByPk(array('articulo_cod' => $model->articulo_cod, 'area_cod' => $model->area_cod));

					if ($findPk == null) {

						$this->saveModel($model);

					} else {

						$findPk->cantidad += $model->cantidad;

						$findPk->responsable_cod = $model->responsable_cod;

						$findPk->ano_escolar_cod = $model->ano_escolar_cod;

						$findPk->save();

					}

					$model->isNewRecord = true;

					$i++;

				}

				Yii::app()->getSession()->add('guardar_datos', 'true');

				$this->redirect('index', array('model' => $model, 'model_articulo' => $model_articulo));

			}

		}

		$this->render('index', array('model' => $model, 'model_articulo' => $model_articulo));

	}

	public function actionAddList() {

		$this->renderPartial('_listarArticulos', array('codigo' => $_POST['articulo_cod'], 'cantidad' => $_POST['cantidad'], 'descripcion' => $_POST['descripcion']));

		Yii::app()->end();

	}

	public function actionAutocomplete($term) {

		$criteria = new CDbCriteria;

		$criteria->compare('LOWER(nombre)', strtolower($_GET['term']), true);

		$criteria->order = 'nombre';

		$criteria->limit = 30;

		$data = Sc08Articulo::model()->findAll($criteria);


		if (!empty($data)) {

			$arr = array();

			foreach ($data as $item) {

				$arr[] = array(

					'id' => $item->cod_articulo,

					'value' => $item->nombre . ' - ' . $item->descripcion . ' - Color: ' . $item->colorCod->descripcion . '. Modo Entrada: ' . $item->modoEntradaCod->descripcion,

					'label' => $item->nombre . ' - ' . $item->descripcion . ' - Color: ' . $item->colorCod->descripcion . '. Modo Entrada: ' . $item->modoEntradaCod->descripcion,

				);

			}

		} else {

			$arr = array();

			$arr[] = array(

				'id' => '',

				'value' => 'No se han encontrado resultados para su búsqueda',

				'label' => 'No se han encontrado resultados para su búsqueda',

			);

		}

		echo CJSON::encode($arr);

	}


	public function actionCreateResponsable() {

		$model = Sc06Responsable::model();

		$model_usuario = Sc07Usuario::model();

		$this->render('/sc06Responsable/create', array('model' => $model, 'model_usuario' => $model_usuario));

	}

	public function actionCallArea() {


		$model_aa = Sc04Area::model()->findAll();

		$this->renderPartial('/sc04Area/_form', array('model' => $model_aa));

	}

	public function actionCreate() {

		$model = new Sc09ArticuloArea;


		if (isset($_POST['ajax']) && $_POST['ajax'] === 'client-account-create-form') {

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}


		if (isset($_POST['Sc09ArticuloArea'])) {

			$model->attributes = $_POST['Sc09ArticuloArea'];

			if ($model->validate()) {

				$this->saveModel($model);

				$this->redirect(array('view', 'articulo_cod' => $model->articulo_cod, 'area_cod' => $model->area_cod));

			}

		}

		$this->render('create', array('model' => $model));

	}


	public function actionDelete($articulo_cod, $area_cod) {

		if (Yii::app()->request->isPostRequest) {

			try

			{

				// we only allow deletion via POST request

				$this->loadModel($articulo_cod, $area_cod)->delete();

			} catch (Exception $e) {

				$this->showError($e);

			}


			// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

			if (!isset($_GET['ajax'])) {

				$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));

			}


		} else {

			throw new CHttpException(400, 'Invalid request. Please do not repeat this request again.');

		}


	}







	public function loadModel($articulo_cod, $area_cod) {

		$model = Sc09ArticuloArea::model()->findByPk(array('articulo_cod' => $articulo_cod, 'area_cod' => $area_cod));

		if ($model == null) {

			throw new CHttpException(404, 'The requested page does not exist.');

		}


		return $model;

	}


	public function saveModel($model) {

		try

		{

			$model->save();

		} catch (Exception $e) {

			$this->showError($e);

		}

	}


	function showError(Exception $e) {

		if ($e->getCode() == 23000) {

			$message = "This operation is not permitted due to an existing foreign key reference.";

		} else {

			$message = "Invalid operation.";

		}


		throw new CHttpException($e->getCode(), $message);

	}

}




Al modelo no le realice cambios, espero que asi como me ayudaste a tratar de solventar mi inconveniente esto le ayude a otros