Como implemento la clase estática para un combo en cascada

Tengo tres tablas relacionadas entre sí (paises con provincias y esta con localidades), creo un combo en cascada en el formulario para provincia y otro para localidad, tengo una clase con dos métodos (get_provincias y get_localidades) que hacen el select para cada tabla.
Este es el código de la clase:

<?php

class dao extends ciftoba_datos_tabla
{
	static function get_provincias($pais)
	{
		$sql = "SELECT * FROM provincias where id_pais = $pais ORDER BY provincia";
		return toba::db('ciftoba')->consultar($sql);
	}

	static function get_localidades($provincia)
	{
		$sql = "SELECT * FROM localidades where id_provincia = $provincia ORDER BY localidad";
		return toba::db('ciftoba')->consultar($sql);
	}
}

?>

¿Qué clase tengo que extender para que me devuelva la consulta?

Hola Matias,

la configuración para la carga de los valores la podes hacer via toba_editor en la definicion de cada EF. Fijate que existe la posibilidad de especificar el archivo y clase que contiene el metodo a invocar (asi como el metodo mismo y la separacion entre clave-descripcion).

Tene en cuenta que los combos tienen 2 opciones

  • Combo comun: Lista de opciones completa
  • Combo editable: Lista filtrada por texto ingresado

Asumo que vas por el primer grupo que es el mas comun, en dicho caso quitaria el parametro de los metodos o al menos le daria un valor por defecto para saber cuando debe ser acotada la lista y cuando se debe devolver completa.

Saludos

Sí, eso ya está hecho, te adjunto la captura de pantalla del ef:


El problema es con la clase que tiene los métodos, no se si está bien escrita, si me falta algún use o include o que clase tengo que heredar para que me devuelva la consulta a la tabla para armar el ef.
El problema es que hago clic en el botón agregar o en la lupa para editar un registro y se tilda, queda procesando y no muestra nunca la pantalla del formulario.
Dentro de la carpeta php del proyecto (proyectos/ciftoba/php) creé una carpeta nucleo donde creé la clase dao con los métodos get_provincias y get_localidades.

Hola Matias,

Esas clases no tienen mucho misterio, mientras tengas los return correspondientes y sintacticamente este bien el archivo no deberias tener inconvenientes. A lo sumo volve a verificar la ruta para chequear que es la correcta.

Recorda que anteriormente te plantee que el parametro de entrada al metodo debia tener un valor por defecto para cuando no existe nada seleccionado en el ef maestro.

Eso tiene pinta de ser un fatal error, te recomiento que en la configuracion de PHP (php.ini) actives la entrada display_errors=On de forma que te salga por pantalla que es lo que esta causando el problema.

Otra manera es ir directamente al log del web_server y fijarse el motivo por el que esta reventando php. Si conseguis un mensaje de error puedo orientarte mejor, asi a simple vista pareciera que esta correcto.

Saludos

Hola Ricardo: desgraciadamente display_errors está en On y no muestra los errores, cambié el parámetro de cada método y le puse null:

<?php

class dao extends ciftoba_datos_tabla
{
	static function get_provincias($pais = null)
	{
		$provincias = array();
		if(!empty($pais)){
			$sql = "SELECT * FROM provincias where id_pais = $pais ORDER BY provincia";
			$provincias = toba::db('ciftoba')->consultar($sql);
		}
		return $provincias;
	}

	static function get_localidades($provincia = null)
	{
		$localidades = array();
		if(!empty($provincia)){
			$sql = "SELECT * FROM localidades where id_provincia = $provincia ORDER BY localidad";
			$localidades = toba::db('ciftoba')->consultar($sql);
		}
		return $localidades;
	}
}

?>

Pero se sigue tildando, no se cual puede ser el error.
Hago clic en Inspeccionar en google chrome y me muestra esto:

Otra cosa que me olvidaba de decirte es que cuando hago clic en cualquier botón del cuadro se tilda, por ejemplo: tengo definido un filtro para el cuadro con tres campos: apellido, nombre, email, escribo en alguno de ellos y hago clic en Filtrar y se tilda, creo que no está capturando los eventos de los botones.

Hola Matias,

de esta imagen pareciera que no esta pudiendo recuperar los recursos JS que necesita o que no esta pudiendo ejecutar dichos modulos en el cliente. Cuando realizaste los pasos de instalacion la ejecucion del comando de composer termino adecuadamente?.

Otra cosa que me olvidaba de decirte es que cuando hago clic en cualquier botón del cuadro se tilda, por ejemplo: tengo definido un filtro para el cuadro con tres campos: apellido, nombre, email, escribo en alguno de ellos y hago clic en Filtrar y se tilda, creo que no está capturando los eventos de los botones.

Muy probablemente sea un tema derivado de lo anterior, si no obtiene los recurso JS no va a poder ejecutar las interacciones entre el cliente y el server.

La clase de consultas en particular no pareciera tener nada mal, por lo que de no ser un problema a nivel Controlador de Interface seguramente es algo externo a la operacion en si.

Saludos

No terminó mal, me dio error al intentar descargar los paquetes con yarn, me olvidé de decirte eso, cómo puedo arreglar eso?

Hola Matias,

si el error te salto porque no tenias instalado Yarn, instalalo y luego ejecuta composer update para que te vuelva a disparar los scripts que generan los assets.

En la pagina que te pase para mostrarte los requerimientos hay un link a los metodos de instalacion de Yarn.

Saludos

Ya instalé el node.js para poder instalar yarn, el problema es que en linux tengo un usuario matias en vez de root, para algunos casos me exigía el usuario root (para estos casos ejecutaba su y ponía la clave del root) y para otros podía ejecutar sudo y el comando o incluso sin sudo, la verdad no se si habrá tomado los cambios hechos con el usuario root

Ya pude instalar el yarn, pero ahora cuando hago clic en el botón Agregar me da este error:
image
Y esto me dice el Analizador de logs:

Hola Matias,

ese error se produce porque pierde sincronia el parametro que tiene el cliente y el que tiene el servidor para garantizar que no se estan realizando pedidos post sin conocimiento del usuario.

Tendrias que ver si previo al evento de “agregado” tenes algun otro pedido post que este llegando al server pero cuya respuesta no este modificando el cliente, ya que cada interaccion que involucra un formulario suele traer el parametro refrescado para el cliente.

Si podes subime una imagen de como estan definidos los eventos en el CI (que calculo es quien tiene el boton “agregar”).

Saludos

Esto es lo que muestra la pestaña eventos del CI:


Avisame si necesitas que te mande algo más.
Gracias.

Bien,

en la linea correspondiente al evento “agregar” podes destildar el check Datos ya que dicho evento solo se usa para generar el cambio de pantalla hasta donde entiendo y no es necesario que traslade datos al servidor.

Creo que con eso ya no deberias tener el error que pasaste mas arriba.

Saludos

Hola Ricardo, me sigue dando el mismo error.
En el analizador de logs me da este error: Se intenta hacer un post donde no coinciden parametros anti CSRF, puede ser un error del token CSRF? ¿Cómo lo soluciono?

Hola Matias,

te diria que primeramente verifiques apenas entras a la operacion que en el HTML del cliente existe un form con id formulario_toba y que dentro del mismo hay un campo hidden con el Token en cuestion.

Si eso no esta ahi, habria que revisar el codigo para ver por que motivo no se genero… ya que por defecto es parte de la salida de la pagina.

Si esta ahi, hay que chequear el motivo por el cual no se esta almacenando en sesion la contraparte del server o intentar rastrear el motivo por el cual se consume previo al evento.

En definitiva, si entras a la operacion y lo primero que haces el presionar “Agregar” no tiene que haber problema alguno, es una operacion super comun por lo que veo.

Saludos

Hola Ricardo: sí existe, esta es la captura de pantalla de la página:

Listo Ricardo, lo pude arreglar, tenía que cambiar y agregar algunas líneas en el composer.json y ahora funciona bien.
Muchas gracias por tu ayuda.

Hola Matias,

de curioso nomas… que era lo que te estaba faltando?. Como para asociar mentalmente el sintoma con una posible solucion.

Saludos

En el atributo repositories cambié la línea “exclude”: [“siu-toba/rest”] por “exclude”: [“siu-toba/framework”, “siu-toba/rest”], en el atributo require agregué la línea “siu-toba/framework”: “~3.3”, en el atributo post-install-cmd cambié la línea “composer run-script post-install-cmd” por “composer run-script post-install-cmd -d ./vendor/siu-toba/framework/” y en el atributo post-update-cmd agregué esta misma línea y después ejecuté composer update siu-toba/framework