Extraño error en cascada maestro-esclavo

Hola Gente de la lista.

Tengo un comportamiento extraño en una cascada que arme, con 2 ef_combo.
El ef_combo maestro es campoaplicacion.
El ef_combo esclavo es disciplina.

Ambos ef_combo se cargan mediante metodos PHP, que serian:
El primero, mediante un array (al copiar y pegar me deforma los acentos ;-))

<?php

/*
*    En este dao las búsquedas son estáticas, generalmente terminarían en una SQL
* 
*/
class dao_campos_aplicacion
{
    static function get_campo_aplicacion()
    //$filtro = array()
    {
		


		return array(
				array('id' => '1', 'valor' => 'Ciencias Biológicas de Células y Moléculas'),
				array('id' => '2', 'valor' => 'Ciencias Biológicas de Organismos y Sistemas'),
				array('id' => '3', 'valor' => 'Ciencias Físicas, Matemáticas y Astronómicas'),
				array('id' => '4', 'valor' => 'Ciencias Clínicas y Salud Pública'),
				array('id' => '5', 'valor' => 'Ciencias Médicas'),
				array('id' => '6', 'valor' => 'Ciencias Químicas'),
				array('id' => '7', 'valor' => 'Ciencias de la Tierra e Hidroatmosféricas'),
				array('id' => '8', 'valor' => 'Ciencias Económicas y Derecho'),
				array('id' => '9', 'valor' => 'Ciencias Humanas'),
				array('id' => '10', 'valor' => 'Ciencias Sociales'),
				array('id' => '11', 'valor' => 'Tecnología Agraria y Forestal'),
				array('id' => '12', 'valor' => 'Tecnología Pecuaria y Pesquera'),
				array('id' => '13', 'valor' => 'Tecnología del Medio Ambiente'),
				array('id' => '14', 'valor' => 'Tecnología Química'),
				array('id' => '15', 'valor' => 'Tecnología de Alimentos'),
				array('id' => '16', 'valor' => 'Tecnología Energética, Minera, Mecánica y de Materiales'),
				array('id' => '17', 'valor' => 'Tecnología Informática, de las Comunicaciones y Electrónica'),
				);
		
	}
}

?> 

y el segundo a travez de una consulta SQL de acuerdo al parametro recibido:

<?php

/*
*    En este dao las búsquedas son estáticas, generalmente terminarían en una SQL
* 
*/
class dao_disciplinas
{
    static function get_disciplina($campoaplicacion)
    {
		
		$where = "true";
		if (isset($campoaplicacion))
			$where .= " AND l.codigoarea  = $campoaplicacion";
		$sql = "
			SELECT  l.codigodisciplina as id,l.descripcion as valor
			FROM
			  public.aux_disciplina as l
			WHERE
			$where
			ORDER BY l.descripcion;
		";
		
		// Ejecuta la consulta en la variable $sql.
		 $resultado = toba::db()->consultar($sql);
		return $resultado;
		
	}
}

?> 

Adjunto un par de imagenes capturadas.
Agradeco toda ayuda.

Saludos!


Lo que es datos parece estar bien. Por el error javascript me parece que el problema está en la definición del ef esclavo. un par de preguntas

  • Esta redefinido el layout del formulario? Tiene alguna extension?
  • Podrias adjuntar el codigo del conf del formulario?
  • Podrias capturar la definición en el toba_editor del ef esclavo?

Hola Seba.

Te cuento:parece que el error viene por el JavaScript del el layaut del formulario, que esta redefinido. Te adjunto la ultima parte de la extension.

	//-----------------------------------------------------------------------------------
	//---- JAVASCRIPT -------------------------------------------------------------------
	//-----------------------------------------------------------------------------------

	function extender_objeto_js()
	{
		echo "
		//---- Procesamiento de EFs --------------------------------
		
		{$this->objeto_js}.evt__disciplina__procesar = function(es_inicial)
		{
			var valor = {$this->objeto_js}.ef('disciplina').get_estado();

			// El id correspondiente al valor 'Otras' es 99.
			if (valor == '99') {
				{$this->objeto_js}.ef('disciplinaalternativa').mostrar();
			}else{
				{$this->objeto_js}.ef('disciplinaalternativa').ocultar();
			}

		}
		";
	}

La idea aqui es habilitar/deshabilitar un 3er campo “disciplinaalternativa”, en casi de elegir como disciplina → 99 Otra.
Pareciera que al seleccionar el ef_combo “campoaplicacion” se dispara el evento js, cuando en realidad deberia hacerlo solo cuando se selecciona el ef_combo “disciplina”.

Saludos!

Bien, el tema seguramente es por ahí.
Al estar en cascada, al cambiar el maestro siempre se dispara el evento procesar del esclavo porque siemrpe se resetea su estado. De todas formas no veo porqué esto debería dar un error javascript.

Lo que se me ocurre es que el ef ‘disciplinaalternativa’ sea de un tipo que no permite ocultar/mostrar, de que tipo es?.
Proba cambiarlo por activar() y desactivar(). Si sigue dando error proba hacer esto


			if (valor == '99') {
				{$this->objeto_js}.ef('disciplinaalternativa').input().style.display = '';
				//Tambien podes probar con {$this->objeto_js}.ef('disciplinaalternativa').input().disabled = false
			}else{
				{$this->objeto_js}.ef('disciplinaalternativa').input().style.display = 'none';
				//Tambien podes probar con {$this->objeto_js}.ef('disciplinaalternativa').input().disabled = true
			}

El metodo input() del ef te retorna el elemento HTML puntual (sin la etiqueta, solo el input html). El ocultar/mostrar en cambio trata de ocultar toda la fila incluyendo la etiqueta, para eso usa el metodo nodo() del ef que es el que falla, ese metodo trata de encontrar el

contendedor del input, y por algun motivo disciplicaalternativa no lo tiene (sera porque tiene redefinido el layout? o por ser un tipo de ef no soportado?)

En efecto Seba.

Lo cambie por activar() y desactivar(), ya no da error.
Lo curioso es que es un simple ef_editable el componente.

Asi me quedo el codigo:

if (estado == '99') {
				{$this->objeto_js}.ef('disciplinaalternativa').activar();
			}else{
				{$this->objeto_js}.ef('disciplinaalternativa').resetear_estado();
				{$this->objeto_js}.ef('disciplinaalternativa').desactivar();
			}

El metodo resetear_estado() permite limpiar el campo.
Gracias y Saludos!

Fabian

Bien, ya tenemos mas cercado el problema, me interesaría poder entender porque no anda el mostrar/ocultar. ¿Podrías adjuntarme el código fuente HTML generado de esa pagina?

Bien Seba.

Aqui te adjunto el html generado por la pagina.
A ver que se puede sacar de alli.

Saludos!


Gracias Fabián,
No aparecen los efs ‘campoaplicacion’, ‘disciplina’ o ‘disciplinaalternativa’.
Puede ser que no sea el source la misma pantalla?