personalizar parametros g3w3

intento personalizar la clase parametros para agregar mis propios parametros configurables por BD…

tengo estas 2 clases:

<?php
namespace unlam\modelo\entidades;

use siu\modelo\datos\catalogo;
use SIU\Chulupi\kernel;
use SIU\Chulupi\util\cache\AdminCache;

class parametro extends \siu\modelo\entidades\parametro
{
    static function en_mantenimiento()
    {
        $datos = catalogo::consultar('parametro', 'en_mantenimiento');
        return $datos[0];
    }
    ...

<?php

namespace unlam\modelo\datos\db;

use SIU\Chulupi\kernel;
use SIU\Chulupi\util\db\db;
use siu\errores\error_guarani;

class parametro extends \siu\modelo\datos\db\parametro 
{
    /**
     * cache: memoria
     * cache_expiracion: 60
     */
    function en_mantenimiento() {
        $sql = "execute procedure sp_param_sistema('en_mantenimiento')";
        $datos = kernel::db()->consultar_fila($sql, db::FETCH_NUM);
        return $datos[0];
    }
    ...

Estaba funcionando en G3W2.9.0 pero en G3W3.13.0 ya no funciona, arroja el mensaje:

SQL ERROR: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near “sp_param_sistema” LINE 1: execute procedure sp_param_sistema(‘en_mantenimiento’) ^ execute procedure sp_param_sistema(‘en_mantenimiento’)

Lo cual es raro porque el código de G3W3.13.0 hace muchas llamadas similares ¿será código obsoleto? por ejemplo en la linea 124 de siu\modelo\datos\db\parametros.php se ve:

    function recursar_regularizadas() 
    {
        $sql = "execute procedure sp_param_sistema('recursar_regularizadas')";
        $datos = kernel::db()->consultar_fila($sql, db::FETCH_NUM);
        return $datos;                
    } 

Honestamente el error es claro… lo que no entiendo es por qué en los otros métodos no da error, de ahí mi pregunta si son métodos obsoletos… o si es que estoy haciendo algo mal (o ambas 2).

completo un poco…

reemplazando la llamada por un código compatible con postgresql

select sp_param_sistema(‘en_mantenimiento’)
igualmente el resultado es un error:
SQL ERROR: SQLSTATE[42883]: Undefined function: 7 ERROR: function sp_param_sistema(unknown) does not exist LINE 1: select sp_param_sistema(‘en_mantenimiento’) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. select sp_param_sistema(‘en_mantenimiento’)
así que resulta claro que ese código en g3w3 ya no se usa o no sé como es que no da error…

¿estoy personalizando la clase equivocada?

Hola Diego, algo que me hace ruido es que hacés
$datos = kernel::db()->consultar_fila($sql, db::FETCH_NUM);

y después devolvés

return $datos[0];

consultar_fila ya debería traer una sola fila. ¿$datos[0] existe? ¿Por qué no devolver $dato?

Saludos.

Hola José, gracias por responder.

Devuelve una sola fila, pero solo me interesa el primer dato por eso el [[0]]

Pero lo malo es que en G3 cambió el modelo y entiendo que lo que está funcionando en versión 2.9.x en versión 3.13.x ya no es compatible.

Parece que en G3 debo extender el modelo desde: modelo_g3/nucleo/administracion/parametros/…

¿alguien podría confirmarlo y compartir su experiencia con parámetros en G3W3?

El procedure sp_param_sistema es un procedure de Guarani 2 en informix.
En Guarani 3 existe la funcion get_valor_parametro_plan(, )

Igualmente para consultar un parámetro deberias agregar un método con el nombre que identifique al parametro en /src/siu/modelo/entidades/parametro.php (Recordar que debes agregarlo en tu carpeta de personalizaciones… Ver como se personaliza para agregar o modificar metodos).

Ejemplo: Este metodo se usa para consultar el valor del parámetro reinscripcion_reingresante

function reinscripcion_ingresante()
	{
		$datos = catalogo::consultar('parametro', 'reinscripcion_ingresante');
		return $datos[0];
	} 

En tu caso:

function en_mantenimiento()
	{
		$datos = catalogo::consultar('parametro', 'en_mantenimiento');
		return $datos[0];
	} 

Ademas, debes crear el parámetro en la base de datos definiendo el tipo de datos, valores posibles, valor default, nivel de aplicación, etc.
Podes tomar como ejemplo del catálogo de parámetros del sistema que se entrega en cada version y de alli hacer el script para registrar este parámetro.
Estos archivos s eencuentran en:
\BD\Datos_nucleo\Parametros
\BD\Datos_nucleo\ParametrosEtiquetas

Les comparto el resultado final…

create or replace function f_en_matenimiento(p_estado char(1) default null) returns char(1)
AS $$
declare
	_valor char(1);
BEGIN
	if p_estado is null then
		select valor into _valor from par_param_sist_valores where parametro='en_mantenimiento';
		if not _valor is null then
			return _valor;
		end if;
		p_estado := 'N';
	else
		p_estado = upper(p_estado);
		if p_estado not in ('S','N') then
			RAISE EXCEPTION 'Parámetro ''%'' no es un estado valido! Se esperaba ''S'' o ''N'' para establecer un nuevo estado o nada para consultarlo', p_estado;
		end if;
	end if;


	delete from par_parametros_etiquetas where parametro='en_mantenimiento';
	delete from par_param_sist_valores_entidad where param_valor=1 and entidad=1;
	delete from par_param_sist_valores where parametro='en_mantenimiento';
	delete from par_parametros_sistema where parametro='en_mantenimiento';


	insert into par_parametros_sistema(parametro, descripcion, tipo_de_parametro, tipo_de_dato, nivel, valor_desde, valor_hasta, valor_default, tabla_referenciada, referencia) values ('en_mantenimiento', 'Define si el sitio web está en mantenimiento', 'L', 'S', 1, '', '', 'N', '', 'Mientras que G3W esté en mantenimiento el acceso al sistema se encuentra limitado');
	insert into par_param_sist_valores (param_valor, parametro, valor, tipo, entidad_tipo) values (1,'en_mantenimiento',p_estado,'S',4);
	insert into par_param_sist_valores_entidad (param_valor, entidad) values (1, 1);
	insert into par_parametros_etiquetas(parametro, etiqueta, es_operacion) VALUES ('en_mantenimiento', 'Define si la web está en mantenimiento', 'false');


	return p_estado;
END;
$$ LANGUAGE plpgsql;

para consultar el estado actual:


   select * from f_en_mantenimiento();

y para setear un valor:


   select * from f_en_mantenimiento('s'); --valores válidos: 'N'/'S'