Yii Framework Forum

Uso de multimodelform con autocomplete


(Rafael Rosales) #1

Hola comunidad, tengo un problema al usar la extensión multimodelform con autocomplete para los detalles, tengo dos tablas una principal (ptb_recmprima) con los campos principales:
Idn llave principal autonumerico y incremental
nvale llave secundaria varchar 12
la tabla de detalles (ptb_detarecmprima) con los campos:
Id llave principal autonumerico y incremental
Id_rec varchar 12 relacionada con el campo nvale de la otra tabla uno a muchos
Codprod varchar 12 relacionada con otra tabla tbl_prima con su llave principal Codprod, de donde se obtienen los productos
ya si sucesivamente mas campos.
El problema es que cuando inserto productos buscados en la tabla tbl_prima para llenar el campo Codprod de los detalles solo actualiza la primera fila, al intentar cargar otra fila no la llena y la primera toma el código de la que inserto como segunda, estos son los codigos:
En el controlador el metodo autocompletar:

 public function actionAutocomplete($term) {
        $criteria = new CDbCriteria;
        $criteria->compare('LOWER(Codprod)', strtolower($_GET['term']), true);
        $criteria->order = 'Codprod';
        $criteria->limit = 30;
        $data = TblMprima::model()->findAll($criteria);
        if (!empty($data)) {
            $arr = array();
          foreach ($data as $item) {
              $arr[] = array(
                    'id' => $item->Codprod,
                    'value' => $item->Codprod,
                    'label' => $item->Codprod,
                    'Descripcion' => $item->Descripcion,
                    'premn' => $item->PreMay,
                    'precuc' => $item->PrCUC,
                    'UM' => $item->UM,
                    'SaldoIni' => $item->SaldoAct,
                );
            }
        } 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);
    }

en el form para los detalles

 <?php
        $detalleFormConfig = array(
            // 'showErrorSummary' => true,
            'elements' => array(
                'Codprod' => array(
                    'type' => 'zii.widgets.jui.CJuiAutoComplete',
                    'source' => $this->createUrl('ptbRecmprima/autocomplete'),
                    'options' => array(
                        'showAnim' => 'fold',
                        'common_id_string' => 'Codprod',
                        'size' => '15',
                        'minLength' => '2', // Minimo de caracteres que hay que digitar antes de relizar la busqueda
                        'select' => "js:function(event, ui) { 
                          var nomobj_texto = this.id; //El identificador del campo en mi caso #Detallecompra_Descripcion 
                          var indexid = nomobj_texto.substring(25,nomobj_texto.length); 
                          $('#PtbDetarecmprima_Codprod'+indexid).val(ui.item.id);
                          $('#PtbDetarecmprima_Descripcion'+indexid).val(ui.item.Descripcion);
                          $('#PtbDetarecmprima_premn'+indexid).val(ui.item.premn);
                          $('#PtbDetarecmprima_precuc'+indexid).val(ui.item.precuc);
                          $('#PtbDetarecmprima_UM'+indexid).val(ui.item.UM);
                          $('#PtbDetarecmprima_SaldoIni'+indexid).val(ui.item.SaldoIni);    
                         }",
                    ),
                    'htmlOptions' => array(
                        'size' => 12,
                        'onFocus' => "init(this.id)",
                        'placeholder' => 'Buscar ...',
                        'title' => 'Indique el producto.'
                    ),
                ),
                'cantidad' => array(
                    'type' => 'text',
                    'maxlength' => 6,
                    'size' => 6,
                    'style' => 'WIDTH:80px',
                //   'onchage' => 'calcularimportemn)',
                ),
                'Descripcion' => array(
                    'type' => 'text',
                    'maxlength' => 80,
                    'size' => 80,
                    // 'disabled' => true,
                    'style' => 'WIDTH:180px',
                ),
                'premn' => array(
                    'type' => 'text',
                    'maxlength' => 6,
                    'size' => 6,
                    // 'disabled' => true,
                    'style' => 'WIDTH:80px',
                ),
                'precuc' => array(
                    'type' => 'text',
                    'maxlength' => 6,
                    'size' => 6,
                    //  'disabled' => true,
                    'style' => 'WIDTH:100px',
                ),
                'UM' => array(
                    'type' => 'text',
                    'maxlength' => 3,
                    'size' => 3,
                    //  'disabled' => true,
                    'style' => 'WIDTH:80px',
                ),
                'SaldoIni' => array(
                    'type' => 'text',
                    'maxlength' => 6,
                    'size' => 6,
                    //    'disabled' => true,
                    'style' => 'WIDTH:80px',
                ),
        ));
        $this->widget('ext.multimodelform.MultiModelForm', array(
            'id' => 'Id_rec', //the unique widget id         
            'formConfig' => $detalleFormConfig, //=> //$ptbDetarecmprimaFormConfig, //the form configuration array
            'model' => $detalle, //instance of the form model
            'validatedItems' => $validateddetalles,
            'tableView' => true,
            'fieldsetWrapper' => array('tag' => 'div', 'htmlOptions' => array('class' => 'view', 'style' => 'position:relative;background:#EFEFEF;')),
            'removeLinkWrapper' => array('tag' => 'div', 'htmlOptions' => array('style' => 'position:absolute; top:1em; right:1em;')),
            'clearInputs' => true,
            'jsAfterNewId' => MultiModelForm::afterNewIdAutoComplete($detalleFormConfig['elements']['Codprod']),
            'data' => $detalle->findAll('Id_rec=:Id_rec', array(':Id_rec' => $model->nvale)),
            'showAddItemOnError' => false,
            'addItemText' => 'Agregar producto',
            'showAddItemOnError' => false,
            'removeText' => 'Eliminar',
            'removeConfirm' => '¿Eliminar el producto seleccionado?',
        ));
        ?>

Espero sugerencias para ello y muchas gracias por las respuestas que puedan aportar


(Rafael Rosales) #2

Voy a mostrar una imagen para que se entienda lo que hace, cuando busco la primera fila, me hace todo ok, me llena ,los datos de todos los campos para esa fila, pero cuando intento buscar la segunda fila, me cambia el valor de la primera por la buscada en la segunda actualizando siempre la primera, pero no la segunda y yo quiero agregar varias filas:

aquí al seleccionar la primera fila
aquí cuando selecciono la segunda fila, me cambia la primera y no obtiene valores para la segunda.
Por favor necesito sugerencias para esto, aclaro que en los detalles (tabla ptb_detarecmprima) tengo los campos donde producto es Codprod (codigo del producto)
Nombre producto (Descripcion del producto)
Precio MN (precio del producto) y asi sucesivamente los datos necesarios para los productos y los que quiero calcular como importes, etc.
y tengo otra tabla tbl_mprima, donde esta el stock de productos, aquí se buscan los productos para llevarlos a la tabla detalles, con los campos como lo pongo en la accion del controlador, la llave principal de la tabla tbl_mprima en Codprod (código del producto), la cual esta relacionada uno a varios con Codprod de la tabla detalles,
la tabla detalles tiene como llave principal Id que es autonumerico y el campo Id_rec es la relación con la tabla principal (ptb_recmprima) con nvale que es el numero del elemento obtenido en la operacion completa, aunque la llave principal de esta tabla is Idn que es autonumerica. Disculpen los detalles, es por si es necesario.