[SOLUCIONADO] Solicitud de Título - Correspondencia de un dato con otro

Hola! Estoy realizando una nueva operación “Solicitud de Título” (personalización de Córdoba).
La misma consta de un formulario a completar por los alumnos, y luego imprimen unos pdf.
Estoy trabada en el “hilo” de los datos". Quiero en base a una carrera/plan, que me muestre los títulos de esa carrera/plan, y luego las orientaciones de ese título.
Trabajé con lo ya hecho en la operación: acta_cursadas. En cambio de tener una carpeta “reporte”, hice una carpeta “formulario”, y utilicé los filtros (simil a Año → Periodo Lectivo para Carrera/Plan → Títulos).
Me muestra el listado de carreras, pero al momento de los títulos muestra “un listado vacío”.

Esta subido lo hecho hasta ahora en: hhtps://colab.siu.edu.ar/svn/guarani2/nodos/uncor/3w/trunk/2.9.0/src/pers/cordoba/solicitud_titulo
Además de db: colación e info_catalogo.

Saludos
Andrea

Hice algunos cambios en:

  • controlador.php:

function accion__busca_titulos()
	{
		$carrera = $this->validate_param('carrera', 'post', validador::TIPO_ALPHANUM);
		$plan = $this->validate_param('plan', 'post', validador::TIPO_ALPHANUM);
		$titulos = catalogo::consultar('colacion', 'busca_titulos', array ('carrera' => $carrera, 'plan' => $plan));
		$this->render_raw_json($titulos);
		foreach($titulos as $titulos){
			if ($titulos['titulos'] == $titulos){
				return $titulos['titulos'];
			}
		}
		return null;
	}

para que busque por carrera/plan. Y eliminé la función: get_carrera_by_id ya que no correspondía.

El error que me reporta en esta oportunidad es:


clase: kernel\error_kernel_validacion
mensaje: error de validación de clave $_post ['carrera']: 

Hola Andrea

Te dejo una solución alternativa.

Index: src/pers/cordoba/modelo/datos/db/colacion.php

— src/pers/cordoba/modelo/datos/db/colacion.php (revisión: 1881)
+++ src/pers/cordoba/modelo/datos/db/colacion.php (copia de trabajo)
@@ -46,6 +51,8 @@
$carrera = array();
if (!empty($datos)){
foreach($datos as $key => $value) {

  •        $id = catalogo::generar_id($value[0].$value[2]);
    
  •        $carrera[$key][catalogo::id] = $id;
      	$carrera[$key]['carrera'] = $value[0];
      	$carrera[$key]['nombre_carrera'] = $value[1];
      	$carrera[$key]['plan'] = $value[2];
    

@@ -74,7 +81,8 @@
*/
function busca_titulos($parametros)
{

  •   $sql = "SELECT t.titulo,t.nombre
    
  •   $sql = "SELECT t.titulo as ID,
    
  •        t.nombre as DESC
      	FROM  sga_titulos_plan tp, sga_titulos t
      	WHERE  tp.unidad_academica = t.unidad_academica
      	AND tp.titulo = t.titulo
    

@@ -82,17 +90,8 @@
AND tp.carrera= {$parametros[‘carrera’]}
AND tp.plan ={$parametros[‘plan’]}
";

  •   return $sql;	
    
  •   /*$datos = kernel::db()->consultar($sql, db::FETCH_ASSOC);
    
  •   $nuevo = array();
    
  •   foreach($datos as $key => $value) {
    
  •   		$titulos[$key]['titulo'] = $value[0];
    
  •   		$titulos[$key]['nombre_titulo'] = $value[1];
    
  •   }
    
  •   return $nuevo;*/
    
  •    $datos = kernel::db()->consultar($sql, db::FETCH_ASSOC);
    
  •   return $datos;
    
    }

Index: src/pers/cordoba/operaciones/solicitud_titulo/formulario/pagelet_formulario.js

— src/pers/cordoba/operaciones/solicitud_titulo/formulario/pagelet_formulario.js (revisión: 1881)
+++ src/pers/cordoba/operaciones/solicitud_titulo/formulario/pagelet_formulario.js (copia de trabajo)
@@ -51,17 +51,11 @@
);
$.each(data, function(key, value) {
$(‘#filtro_titulos’).append(

  •   							$('<option></option>').val(value['carrera']).html(value['DESC'])
    
  •   							$('<option></option>').val(value['ID']).html(value['DESC'])
      						);
      					});
    
  •   					if (info.hash_titulos != ""){
    
  •   						$('#filtro_titulos option').each(function(){
    
  •   							if ($(this).val() == info.hash_titulos){
    
  •   								$(this).prop('selected', true);
    
  •   							}
    
  •   						})
    
  •   					}
    
  •   					$('#filtro_titulos option[value='+info.hash_titulos+']').prop('selected', true);
      				}
      			});
      		}
    

Index: src/pers/cordoba/operaciones/solicitud_titulo/formulario/default.twig

— src/pers/cordoba/operaciones/solicitud_titulo/formulario/default.twig (revisión: 1881)
+++ src/pers/cordoba/operaciones/solicitud_titulo/formulario/default.twig (copia de trabajo)
@@ -69,7 +69,7 @@

Seleccionar Carrera
{% for carrera in this.data.carrera %}

  •   		    	<option value='{{carrera.carrera}}'>{{carrera.nombre_carrera}} ({{carrera.plan}}) </option>
    
  •   		    	<option value='{{carrera.__ID__}}'>{{carrera.nombre_carrera}} ({{carrera.plan}}) </option>
         		    {% endfor %}
                  </select>
                  	</td>
    

Index: src/pers/cordoba/operaciones/solicitud_titulo/pagelet_formulario.php

— src/pers/cordoba/operaciones/solicitud_titulo/pagelet_formulario.php (revisión: 1881)
+++ src/pers/cordoba/operaciones/solicitud_titulo/pagelet_formulario.php (copia de trabajo)
@@ -29,7 +29,7 @@
$this->data[‘carrera’] = $carrera;

	$operacion = kernel::ruteador()->get_id_operacion();
  •   $this->add_var_js('url_titulos', kernel::vinculador()->crear($operacion, 'busca_titulos', $carrera));
    
  •   $this->add_var_js('url_titulos', kernel::vinculador()->crear($operacion, 'busca_titulos'));
      $this->add_var_js('hash_titulos', $this->controlador->hash_titulos);
      //$this->add_var_js('url_orientacion', kernel::vinculador()->crear('solicitud_titulo', 'orientacion'));
    

Index: src/pers/cordoba/operaciones/solicitud_titulo/controlador.php

— src/pers/cordoba/operaciones/solicitud_titulo/controlador.php (revisión: 1881)
+++ src/pers/cordoba/operaciones/solicitud_titulo/controlador.php (copia de trabajo)
@@ -40,15 +40,30 @@

function accion__busca_titulos()
{
  •   $carrera = $this->get_carrera_by_id($this->validate_param('carrera', 'post', 'carrera'));
    
  •   $titulos = catalogo::consultar('colacion', 'busca_titulos', $parametros=array('carrera'));
    
  •   //$this->render_raw_json($titulos);
    
  •   foreach($titulos as $titulos){
    
  •   	if ($titulos['titulos'] == $titulos){
    
  •   		return $titulos['titulos'];
    
  •   	}
    
  •   }
    
  •   return null;
    
  •   $carrera_hash = $this->validate_param('carrera', 'post', validador::TIPO_ALPHANUM);
    
  •    $carreras = catalogo::consultar('colacion', 'lista_carreras');
    
  •    $parametros = array();
    
  •   if (!empty($carreras)){
    
  •        foreach($carreras as $carrera){
    
  •            if ($carrera_hash == $carrera["__ID__"]){
    
  •                $parametros = array('carrera' => $carrera['carrera'], 'plan' => $carrera['plan']);
    
  •            }
    
  •        }
    
  •    }
    
  •    $nuevo = array();
    
  •    IF (!empty($parametros)){
    
  •        $nuevo = catalogo::consultar('colacion', 'busca_titulos', $parametros);
    
  •    }
    
  •    $this->render_raw_json($nuevo);
    
    }

Saludos

Bruno

Anduvo perfecto!
Gracias
Andrea

Hola!
Bruno, a la hora de buscar las orientaciones en base a los títulos estoy teniendo el mismo problema que antes.
De igual manera en país → provincia → depto.
Me podrías orientar en donde esta la falla?
Subo los últimos cambios a: hhtps://colab.siu.edu.ar/svn/guarani2/nodos/uncor/3w/trunk/2.9.0/src/pers/cordoba/solicitud_titulo
Además de db: colación e info_catalogo.

Gracias.
Andrea

Hola Andrea,

La falla la tenías en pagelet_formulario.js
Abajo te copio los archivos que estuve usando para solucionar el problema.
Modifiqué el controlador para reutilizar el código donde recupera los datos de una carrera a partir del hash de la carrera. decodificar_carrera($carrera_hash)

Cuando trabajo con ajax me es cómodo usar la barra de desarrolladores de chrome, la pestaña network. Te paso el dato por si no lo conocías

Saludos
Bruno

Index: src/pers/cordoba/operaciones/solicitud_titulo/controlador.php

function accion__busca_titulos()
{
    $carrera_hash = $this->validate_param('carrera', 'post', validador::TIPO_ALPHANUM);
    $carrera = $this->decodificar_carrera($carrera_hash);
    if (!empty($carrera)){
        $parametros = array('carrera' => $carrera['carrera'], 'plan' => $carrera['plan']);
    }
    
    $nuevo = array();
    if (!empty($parametros)){
        $nuevo = catalogo::consultar('colacion', 'busca_titulos', $parametros);
    }
    $this->render_raw_json($nuevo);
}

function accion__busca_orientacion()
{
    $titulo_hash = $this->validate_param('titulo', 'post', validador::TIPO_ALPHANUM);
    $carrera_hash = $this->validate_param('carrera', 'post', validador::TIPO_ALPHANUM);
    
    $carrera = $this->decodificar_carrera($carrera_hash);
    
    $nuevo = array();
    if (!empty($carrera)){
        $parametros = array('carrera' => $carrera['carrera'], 'plan' => $carrera['plan']);
        $titulos = catalogo::consultar('colacion', 'busca_titulos', $parametros);
        
        if (!empty($titulos)){
            foreach($titulos as $titulo){
                if ($titulo_hash == $titulo["__ID__"]){
                    $parametros['titulo'] = $titulo['ID'];
                    if (!empty($parametros)){
                        $nuevo = catalogo::consultar('colacion', 'busca_orientacion', $parametros);
                    }
                }
            }
        }
    }
    
    $this->render_raw_json($nuevo);
}

function decodificar_carrera($carrera_hash){
    $carreras = catalogo::consultar('colacion', 'lista_carreras');
    if (!empty($carreras)){
        foreach($carreras as $carrera){
            if ($carrera_hash == $carrera["__ID__"]){
                return $carrera;
            }
        }
    }
    return false;
}

Index: src/pers/cordoba/operaciones/solicitud_titulo/formulario/pagelet_formulario.js

kernel.renderer.registrar_pagelet(‘formulario’, function(info) {
var id = ‘#’ + info.id;
return {
onload: function() {
// Estado inicial
if ($(id + ’ #sel_carrera’).val() !== “”){
busca_titulos($(id + ’ #sel_carrera’).val());
}

        if ($(id + ' #filtro_titulos').val() !== ""){
            busca_orientacion($(id + ' #filtro_titulos').val(), $(id + ' #sel_carrera').val());
        }

        // Eventos
        $(id + ' #sel_carrera').on('change', function () {
            busca_titulos($(this).val());
        });

        $(id + ' #filtro_titulos').on('change', function () {
            busca_orientacion($(this).val(), $(id + ' #sel_carrera').val());
        });

        $('#form_solicitud_titulo').submit(function() {
            var msg_arriba;
            var ST = $('#sel_solicitud_titulo').val();

            if( ST == '' ) {
                msg_arriba = $('<div role="alert" class="alert alert-error" style="width: auto; float:left; margin:0;">'+ info.sel_vacio +'<button type="button" class="close" data-dismiss="alert">×</button></div>');
                $(id).append(msg_arriba);
                msg_arriba.position({
                    my: 'top',
                    at: 'top center',
                    offset: '0 0',
                    of: $(id)
                }).show();
                return false; 
            }
        });
    }
}

// Carga de títulos según carrera
function busca_titulos(valor_carrera){
    if (valor_carrera !== ""){
        $.ajax({
            url: info.url_titulos,     					
            dataType: 'json',
            data: {carrera: valor_carrera},
            type: 'post',
            success: function(data) {
                $('#filtro_titulos').children().remove();
                $('#filtro_titulos').append(
                    $('<option></option>').val('').html('Seleccionar Título')
                );
                $.each(data, function(key, value) {
                    $('#filtro_titulos').append(
                        $('<option></option>').val(value['__ID__']).html(value['DESC'])
                    );
                });

                $('#filtro_titulos option[value='+info.hash_titulos+']').prop('selected', true);
            }
        });
    } else {
        $('#filtro_titulos').children().remove();
        $('#filtro_titulos').append(
            $('<option></option>').val('').html('Seleccionar Título')
        );
    }
    busca_orientacion("", "");
}

// Carga de orientaciones según título y carrera
function busca_orientacion(valor_titulo, valor_carrera){
    if (valor_titulo !== "" && valor_carrera !== ""){
        $.ajax({
            url: info.url_orientacion,     					
            dataType: 'json',
            data: {titulo: valor_titulo, carrera: valor_carrera},
            type: 'post',
            success: function(data) {
                $('#filtro_orientacion').children().remove();
                $('#filtro_orientacion').append(
                    $('<option></option>').val('').html('Seleccionar Orientación')
                );
                $.each(data, function(key, value) {
                    $('#filtro_orientacion').append(
                        $('<option></option>').val(value['ID']).html(value['DESC'])
                    );
                });

                $('#filtro_orientacion option[value='+info.hash_orientacion+']').prop('selected', true);
            }
        });
    } else {
        $('#filtro_orientacion').children().remove();
        $('#filtro_orientacion').append(
            $('<option></option>').val('').html('Seleccionar Orientación')
        );
    }
}

})

Index: src/pers/cordoba/modelo/datos/db/colacion.php

/**
 * parametros: carrera, plan
 * cache: no
 * filas: n
 */
function busca_titulos($parametros)
{
		$sql = "SELECT t.titulo as ID, 
		t.nombre as DESC
		FROM  sga_titulos_plan tp, sga_titulos t
		WHERE  tp.unidad_academica = t.unidad_academica
		AND tp.titulo = t.titulo
		AND tp.carrera= {$parametros['carrera']}
		AND tp.plan ={$parametros['plan']}
		";
		$datos = kernel::db()->consultar($sql, db::FETCH_ASSOC);
        
        if (!empty($datos)){
            foreach($datos as $key => $value) {
                $id = catalogo::generar_id($value["ID"]);
                $datos[$key][catalogo::id] = $id;
            }
        }
		return $datos;
}

/**
 * parametros: _ua, carrera, plan, titulo
 * cache: no
 * filas: n
 */
function busca_orientacion($parametros)
{
	$sql = "SELECT orientacion as ID, nombre as DESC
	FROM  sga_orientaciones
	WHERE  unidad_academica = {$parametros['_ua']}
	AND carrera= {$parametros['carrera']}
	AND plan ={$parametros['plan']}
	AND titulo = {$parametros ['titulo']}
	";
	$datos = kernel::db()->consultar($sql, db::FETCH_ASSOC);
	return $datos;
}

Me tira el error:
clase: siu\errores\error_guarani
mensaje: CATALOGO: colacion / busca_orientacion - FALTA PARAMETRO: titulos
traza: [TRAZA]

Te adjunto el detalle de los errores.
Saludos
Andrea


errores_sol_titulo.txt (2.27 KB)

Hola Andrea,

Controlá que los parámetros en la llamada $parametros
catalogo::consultar(‘colacion’, ‘busca_orientacion’, $parametros);

y los parámetros en el modelo
/**

  • parametros: _ua, carrera, plan, titulo
  • cache: no
  • filas: n
    */
    function busca_orientacion($parametros)

Sean iguales
y regenera el catálogo

Saludos

Bruno

Era una cuestión de una “s” colada en el catálogo.
Gracias. Saludos
Andrea

Bruno vuelvo a subir los 3 archivos para ver si me podes ayudar.
Ahora estoy en el hilo de País, Provincia, Depto.
Por base trae los datos correctamente, pero en el formulario llega hasta País.
No reporta errores en ningún momento.

Saludos
Andrea

Hola Andrea,

El problema es que los países no cargan su valor, solo el nombre

Seleccionar País Afganistan Albania ...

Eso se debe a que en el modelo colacion.php le falta
$pais[$key][catalogo::id] = $id;

ese dato es el que usa en la vista default.twig para cargar los valores
{{pais.ID}}

Seleccionar País {% for pais in this.data.pais %} {{pais.nombre_pais}} {% endfor %}

el método lista_paises() debería quedar así:

/**

  • cache: no
  • filas: n
    */
    function lista_paises($parametros)
    {
    $sql = “EXECUTE PROCEDURE sp_paises()”;
    $datos = kernel::db()->consultar($sql, db::FETCH_NUM);
    $pais = array();
    if (!empty($datos)){
    foreach($datos as $key => $value) {
    $id = catalogo::generar_id($value[0]);
    $pais[$key][catalogo::id] = $id;
    $pais[$key][‘cod_pais’] = $value[0];
    $pais[$key][‘nombre_pais’] = $value[1];
    }
    }
    return $pais;
    }

Espero haber sido claro.
Saludos

Clarísimo!