Foros del Web » Programando para Internet » PHP » Zend »

Selects dependientes y posterior envío de formulario

Estas en el tema de Selects dependientes y posterior envío de formulario en el foro de Zend en Foros del Web. Hola amigos, soy nuevo en el foro como podéis ver y también soy nuevo en el uso de Zend_Framework. Estoy desarrollando un proyecto en el ...
  #1 (permalink)  
Antiguo 16/06/2011, 13:02
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Selects dependientes y posterior envío de formulario

Hola amigos, soy nuevo en el foro como podéis ver y también soy nuevo en el uso de Zend_Framework. Estoy desarrollando un proyecto en el cual tengo un formulario con 2 selects dependientes, es decir, según la opción seleccionada en el primer select, los datos del segundo select varían; y esto lo hago mediante JQuery y Ajax; en mi caso concreto en el primer select podremos elegir un proyecto y en base al proyecto seleccionado se cargarán las versiones de dicho proyecto.

He conseguido que la petición ajax se realice correctamente (gracias en gran medida a este post [URL="http://www.forosdelweb.com/f18/zend-selects-dependientes-847640/"]http://www.forosdelweb.com/f18/zend-selects-dependientes-847640/[/URL]) y consigo cargar los datos traídos desde la base de datos mediante AJAX, pero el problema que tengo es al enviar el formulario, ya que cuando hago el submit de dicho form, me salta el siguiente error:

- No se ha encontrado '1' en el argumento especificado

siendo '1' el valor del option seleccionado en el select.

Entonces lo que no comprendo es que los datos recogidos con AJAX los veo en pantalla, pero a la hora de enviar el form es como si Zend_Form no fuera consciente de estos nuevos datos y me gustaría saber vuestra opinión al respecto, o si estoy haciendo algo mal, os adjunto el código:

Script con la llamada ajax(Este script lo tengo situado en el layout, no se si podrá influir):
Código Javascript:
Ver original
  1. <script type="text/javascript">
  2.             function cargarVersiones(){
  3.  
  4.                 var opcionSeleccionada=$("#proyecto").val();
  5.                 var selectDestino=$('#version');
  6.                 $.ajax(
  7.                     {
  8.                         async: true,
  9.                         type: 'POST',
  10.                         url: '/memorias/memorias/ajax',
  11.                         data: "idproyecto="+opcionSeleccionada,
  12.                         dataType: 'json',
  13.                        
  14.                         beforeSend: function(data){
  15.                             selectDestino.html('<label>Cargando...</label>');
  16.                         },
  17.                         success: function(data){
  18.                             selectDestino.append(
  19.                                 $('<option></option>').val(data.id).html(data.version)
  20.                             );
  21.                         },
  22.                         error: function(requestData, strError, strTipoError){
  23.                            
  24.                         }
  25.                     });
  26.                 }
  27.         </script>

Función que selecciona los elementos para el select de versiones de BBDD situada en el controlador correspondiente(En este caso no estoy accediendo a BBDD simplemente devuelvo dos valores de prueba para hacerlo mas simple)
Código PHP:
Ver original
  1. function ajaxAction(){
  2.            
  3.             $this->_helper->viewRenderer->setNoRender();
  4.             $this->_helper->layout->disableLayout();
  5.             if (!$this->getRequest()->isXmlHttpRequest())
  6.             {
  7.                 $this->_redirect('/buscador/buscador');
  8.             }
  9.                 $tablaVersiones= new Proyectos_Model_DbTable_Versions();
  10.  
  11.                 $id = $_POST["idproyecto"];
  12.                 //datos de prueba para enviar al select
  13.                 $jsondata['id'] = 1;
  14.                 $jsondata['version'] = "versionprueba";
  15.  
  16.                 echo Zend_Json::encode($jsondata);
  17.  
  18.         }

Formulario Zend:
Código PHP:
Ver original
  1. public function __construct(){
  2.  
  3.         parent::__construct($options);
  4.  
  5.         $this->setAttrib('enctype', 'multipart/form-data');
  6.         $this->setName('nuevaMemoriaForm');
  7.         $this->setAction('subirmemoria');
  8.         $this->setMethod('post');
  9.  
  10.         $file=new Zend_Form_Element_File('archivo');
  11.         $file->setLabel('Subir: ');
  12.         $file->setRequired(true);
  13.         $file->setDestination(UPLOAD_PATH);
  14.         $file->addValidator('Count',false,1);
  15.         $file->addValidator('Extension',false,'tmx');
  16.         $this->addElement($file);
  17.        
  18.        
  19.         $proyectos= new Zend_Form_Element_Select('proyecto');
  20.         $proyectos->setLabel('Proyecto: ');
  21.         $proyectos->setRequired(true);
  22.         $proyectos->setAttrib('onChange', 'cargarVersiones();');
  23.  
  24.         $auth=Zend_Auth::getInstance();
  25.         $data = $auth->getStorage()->read();
  26.         $tablaProyectos= new Proyectos_Model_DbTable_Projects();
  27.        
  28.         $proyectos->addMultiOption(NULL,'Elija un proyecto');
  29.         //Lee los proyectos de la BBDD segun el usuario
  30.         foreach ($tablaProyectos->getListaProyectosPorIdUsuario($data['user_id']) as $p) {
  31.             $proyectos->addMultiOption($p->project_id, $p->project_name);
  32.         }
  33.  
  34.         $this->addElement($proyectos);
  35.  
  36.  
  37.         $versiones= new Zend_Form_Element_Select('version');
  38.         $versiones->setLabel('Version: ');
  39.         $versiones->setRequired(true);
  40.         $versiones->clearValidators();
  41.  
  42.         $tablaVersiones= new Proyectos_Model_DbTable_Versions();
  43.  
  44.         $versiones->addMultiOption(NULL,'Elija una version');
  45.  
  46.         $this->addElement($versiones);
  47.  
  48.         $this->addElement('submit','submit',array('label'=>'Subir memoria'));
  49.    
  50.     }

He probado a dentro del mismo script, una vez realizado el append de los nuevos datos al form, a acceder a estos datos desde javascript y lo he conseguido, es decir el value del option es accesible, por eso pregunto si será algo relacionado con que Zend_Form no tiene constancia de estos nuevos datos y por eso da el error.

Gracias de antemano, un saludo.

Última edición por castrovega7; 16/06/2011 a las 13:14
  #2 (permalink)  
Antiguo 16/06/2011, 13:43
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Selects dependientes y posterior envío de formulario

Que tal castrovega7,

Primero bienvenido y segundo ese error luego del POST ? o en Javascript ?, ese es el mensaje exacto ? esta en español ?

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 16/06/2011, 13:53
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

El error es al presionar el botón para enviar el formulario, salta el error como cuando por ejemplo tienes un input con setRequire(true) y si lo dejas vacío te sale un error que te indica que no puede ser vacío.

El error es en español porque he utilizado el Zend_Translate para traducir la hoja de errores.
  #4 (permalink)  
Antiguo 16/06/2011, 14:14
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Selects dependientes y posterior envío de formulario

Si haces un dump del POST antes del Zend_Form::isValid, version esta seteado ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 16/06/2011, 14:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Selects dependientes y posterior envío de formulario

Mmm es probable que aunque hagas un clearValidator() este dejando el inArray, por lo que debes expresamente deshabilitarlo:
Código PHP:
Ver original
  1. $versiones->registerInArrayValidator(false);

Saludos.
  #6 (permalink)  
Antiguo 16/06/2011, 16:12
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

Primero gracias por la rapidez en contestar,

Cita:
Iniciado por masterpuppet Ver Mensaje
Si haces un dump del POST antes del Zend_Form::isValid, version esta seteado ?
he hecho el var_dump y este ha sido el resultado:

array(3) { ["archivo"]=> string(10) "prueba.tmx" ["proyecto"]=> NULL ["version"]=> NULL }

Ninguno de los dos selects contiene realmente el dato seleccionado... mmm es extraño que en el select de proyecto en el que cargo los datos dentro form, coja el dato como nulo, véis algún fallo en el form?¿ (La clase del formulario extiende de Zend_Form)


Cita:
Iniciado por GatorV Ver Mensaje
Mmm es probable que aunque hagas un clearValidator() este dejando el inArray, por lo que debes expresamente deshabilitarlo:
Código PHP:
Ver original
  1. $versiones->registerInArrayValidator(false);

Saludos.

He probado añadiendo al form, a continuación del clearValidators(), la línea que me has comentado y el funcionamiento sigue siendo el mismo :S
  #7 (permalink)  
Antiguo 16/06/2011, 16:32
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

De hecho me acabo de dar cuenta de que el valor del select proyectos es null como se puede ver en el var_dump, pero sin embargo no me muestra el mensaje de que "este campo no puede ser vacío" que debería mostrar ya que el select de proyectos tiene un "setRequired(true)".
  #8 (permalink)  
Antiguo 16/06/2011, 16:32
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Selects dependientes y posterior envío de formulario

Comprueba el html que estas generando, beforeSend agrega un label dentro de un select, estas seguro que el html es correcto ?, que los values de los select's están saeteados ? y has una prueba sin traducir los mensajes, para ver el mensaje original que no tengo las traducciones :P
__________________
http://es.phptherightway.com/
thats us riders :)
  #9 (permalink)  
Antiguo 16/06/2011, 16:54
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

Cita:
Iniciado por masterpuppet Ver Mensaje
Comprueba el html que estas generando, beforeSend agrega un label dentro de un select, estas seguro que el html es correcto ?, que los values de los select's están saeteados ? y has una prueba sin traducir los mensajes, para ver el mensaje original que no tengo las traducciones :P
El mensaje original es:

'1' was not found in the haystack

He eliminado el BeforeSend y continua igual y he probado lo siguiente:

Esta es la funcion que recibe los datos del form
Código PHP:
Ver original
  1. public function subirmemoriaAction()
  2.     {
  3.  
  4.         $formularioNuevaMemoria = new Memorias_Form_Nuevamemoria();
  5.  
  6.         //Si se reciben datos por post
  7.         if($this->getRequest()->isPost()){
  8.             //Si los datos recibidos son válidos
  9.             var_dump($formularioNuevaMemoria->getValues());
  10.             $p=$_POST["proyecto"];
  11.             echo $p;
  12.             if($formularioNuevaMemoria->isValid($_POST)){
  13. .
  14. .
  15. .

Como me has dicho en esta funcion antes del "isValid" he hecho el var_dump de los values obteniendo el valor null en proyecto, sin embargo cogiendo el valor mediante POST como se muestra en el codigo, del select proyecto por separado imprime el valor correcto de la opcion seleccionada...
  #10 (permalink)  
Antiguo 16/06/2011, 16:58
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

Jajajaja me da la risa ya, porque acabo de probar exactamente lo mismo para el select versiones y si recojo el dato del select versiones de esta forma:

$v=$_POST["version"];
echo $v;

Se imprime el valor correcto que habia sido enviado por AJAX, no entiendo por que se dispara el error entonces...
  #11 (permalink)  
Antiguo 16/06/2011, 17:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Selects dependientes y posterior envío de formulario

Es por el inArrayValidator lo que hace es checar el valor contra las opciones del select, al no tener opciones se dispara ese valor, estas seguro que sí lo tienes así? Por sí las dudas yo creo mis selects así:
Código PHP:
Ver original
  1. $this->addElement('select', 'selectname', array(
  2.             'required' => true,
  3.             'label' => 'Select',
  4.             'registerInArrayValidator' => false,
  5.             'multiOptions' => array(0 => '[Select]')
  6.         ));

Para cuando estoy inyectando valores desde AJAX
  #12 (permalink)  
Antiguo 16/06/2011, 17:25
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

Cita:
Iniciado por GatorV Ver Mensaje
Es por el inArrayValidator lo que hace es checar el valor contra las opciones del select, al no tener opciones se dispara ese valor, estas seguro que sí lo tienes así? Por sí las dudas yo creo mis selects así:
Código PHP:
Ver original
  1. $this->addElement('select', 'selectname', array(
  2.             'required' => true,
  3.             'label' => 'Select',
  4.             'registerInArrayValidator' => false,
  5.             'multiOptions' => array(0 => '[Select]')
  6.         ));

Para cuando estoy inyectando valores desde AJAX
Muchas gracias GatorV, de esta forma si que me funciona y ya no salta el error, lo que no entiendo es por qué como definí yo el select no funciona

Código PHP:
Ver original
  1. $versiones= new Zend_Form_Element_Select('version');
  2. $versiones->setLabel('Version: ');
  3. $versiones->setRequired(true);
  4. $versiones->registerInArrayValidator(false);
  5. $versiones->addMultiOption(0,'[select]');
  6. $this->addElement($versiones);

Qué diferencias hay a la hora de definir los elements de una u otra forma? es mejor una que otra, o más recomendable?


Ah y una preguntilla relacionada, el script de jquery lo tengo provisionalmente en header del layout pero no creo que sea el lugar más adecuado, qué me recomendarías hacer con los scripts?


Sólo me queda daros las gracias a ti y a masterpuppet por su ayuda también :)
  #13 (permalink)  
Antiguo 16/06/2011, 17:27
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Selects dependientes y posterior envío de formulario

El problema es el funcionamiento, Zend_Form_Element utiliza lazy loading para los validators, Zend_Form_Element::clearValidators deja a 0 los validators pero no deja en false a registerInArrayValidator, entonces al disparar el Zend_Form_Element::isValid carga el validator y lo dispara.

No hay diferencias al definir los elementos creandolos o seteandolos como opciones, en lo personal prefiero esto último, algo asi:

Código PHP:
Ver original
  1. //init
  2. $this->setOptions(array(
  3.             'method' => Zend_Form::METHOD_POST,
  4.             'elements' => array(
  5.                 'username' => array('text', array(
  6.                     'label'    => 'Username',
  7.                     'required' => true,
  8.                     'filters'  => array('StripTags', 'StringTrim'),
  9.                     'validators' => array(
  10.                         array('StringLength', false, array(5)),
  11.                         new GOU_Validate_Db_Doctrine2_NoRecordExists(
  12.                             array(
  13.                                 'entity' => '\GOU\Entity\User',
  14.                                 'field' => 'username'
  15.                             )
  16.                         )
  17.                     )
  18.                 )),
  19.                 'email' => array('text', array(
  20.                     'label'    => 'Email',
  21.                     'required' => true,
  22.                     'filters'  => array('StripTags', 'StringTrim'),
  23.                     'validators' => array(
  24.                         array('EmailAddress'),
  25.                         new GOU_Validate_Db_Doctrine2_NoRecordExists(
  26.                             array(
  27.                                 'entity' => '\GOU\Entity\User',
  28.                                 'field' => 'email'
  29.                             )
  30.                         )                      
  31.                     )
  32.                 )),
  33.                ...

En cuanto a los scripts, deberían estar en un fichero aparte y cargarlos con el view helper headScript y te sugiero que el javascript no sea intrusivo, en vez de setear en el select el onchange, asignale un id al select y luego con jQuery le asignas el evento onchange.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Última edición por masterpuppet; 16/06/2011 a las 17:35
  #14 (permalink)  
Antiguo 16/06/2011, 17:32
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

Pero tal y como muestro el código en mi último post, no debería funcionar? en teoría estoy poniendo el valor del registerIn a false no?

PD: no es por dar el coñazo, pero es que me he tirado como 3 días enteros intentando resolver esto y ahora no me quiero quedar con la duda jaja
  #15 (permalink)  
Antiguo 16/06/2011, 17:39
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 11 meses
Puntos: 845
Respuesta: Selects dependientes y posterior envío de formulario

el método es Zend_Form_Element::setRegisterInArrayValidator el que estas utilizando en ese ejemplo es el accessor(getter).
__________________
http://es.phptherightway.com/
thats us riders :)
  #16 (permalink)  
Antiguo 16/06/2011, 17:42
 
Fecha de Ingreso: junio-2011
Mensajes: 51
Antigüedad: 13 años, 6 meses
Puntos: 3
Respuesta: Selects dependientes y posterior envío de formulario

Ok, gracias por las rápidas respuestas y los consejos.

Etiquetas: ajax, frameworks-y-php-orientado-a-objetos, jquery, php, php+ajax+formularios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:56.