reporte_odt
), en
las ubicaciones que están disponibles para todos los
tipos de página.antes_accion
.FormFileUpload::cancelar()
.
También se agregan los métodos
FormFileUpload::fueCancelado()
y
FormFileUpload::motivoCancelado()
(upload.inc.php).Upload::rutaAbsolutaUpload()
,
FormFileUpload::tamanio()
y
FormFileUpload::tipo()
(upload.inc.php).Javascript::construirLista()
,
Javascript::construirObjeto()
y
Javascript::construirArray()
:
$claves_como_strings = false
(javascript.inc.php).Se agrega funcionalidad en el cliente, opcional, para prevenir el envío múltiple de formularios.
/aplicacion/generacion/formularios/evitar-envio-multiple
./formulario/evitar-envio-multiple
.
Tiene mayor prioridad que la opción global en
aplicacion.xml.Esta funcionalidad se puede habilitar globalmente usando
aplicacion.xml:/aplicacion/generacion/formularios/evitar-envio-multiple/@habilitar='true'
y deshabilitar en formularios individuales con
{entidad}_formulario.xml:/formulario/evitar-envio-multiple/@habilitar='false'
,
o viceversa.
Mensaje::porTipo()
,
Mensaje::error()
,
Mensaje::alerta()
,
Mensaje::notificacion()
,
Mensaje::info()
,
Mensaje::generico()
:
$registrar = true
(mensaje.inc.php), para controlar
si se debe registrar el mensaje a través del Auditor.inclusion_inicio_head
e
inclusion_fin_head
.
Permiten incluir contenido personalizado después de la apertura
y antes del cierre, respectivamente, del elemento head
en todas las páginas HTML generadas.
Advertencia de compatibilidad:
Hasta el momento, si una aplicación generada contenía
un archivo con nombre head.inc.php
en su directorio raíz, éste se incluía
antes de cerrar el elemento head
. Esta funcionalidad
(no documentada) de inclusión implícita quedó
reemplazada por la definición explícita de
inclusion_fin_head
; por lo tanto, para mantener
el comportamiento existente en las aplicaciones que estuvieran
utilizando este archivo, se deberá definir
inclusion_fin_head
con valor
'head.inc.php'
.
/listado/columnas/*/@clase-expr
;
complementa al ya existente /listado/columnas/*/@clase
.
/listado/columnas/*/@clase
,
pero sólo se estaba aplicando en columnas regulares
(columnas/columna
) de listados normales; no se tenía
en cuenta en listados de tipo seleccion
ni
seleccion_m
, ni en columnas/acciones
,
columnas/checkbox
ni columnas/combo
.
Ahora sí se aplica en todos los lugares mencionados.Para evitar posibles problemas de compatibilidad en aplicaciones existentes, el comportamiento predeterminado sigue siendo no procesar XInclude en los listados asociados; para hacerlo, es necesario habilitarlo explícitamente, usando uno de los siguientes atributos:
/aplicacion/generacion/formularios/@procesar-xinclude-documentos-relacionados = "true"
en aplicacion.xml.campo/entidad/@procesar-xinclude = "true"
en *_formulario.xml.XgapXml::loadDocumentFromFile()
(xml.inc.php).
Componentes::clasesNavegador()
(componentes.inc.php)./listado/configuracion/paginador/@filas-por-pagina
.Conexion::expresionComparacionValorEntre()
(conexion.inc.php).buscador/personalizado-simple/separador
.texto
,
calendario
, combo
y combobd
:
buscador/personalizado-simple//{texto|calendario|combo|combobd}/@etiqueta-pos
.buscador/personalizado-simple//*/@es-param-condicion-consulta
.Auditor
(auditor.inc.php):
Auditor::log()
:
$en_error
.Auditor::EN_ERROR_*
.Formateo::textoTipoErrorPhp()
,
Formateo::errorPhp()
(formateo.inc.php)./aplicacion/generacion/@copiar-paginas-predefinidas
.Request::hostYPuerto()
(request.inc.php).Mensaje::porTipo()
(mensaje.inc.php).Form::combo_bd_sin_hidden
y
Form::combo_bd
:
$agregar_opcion_vacia
(form.inc.php).configuracion/acciones/accion/condicion/@efecto
.Para que se tengan en cuenta los valores mencionados, debe estar
definida la constante PHP XGAP_COMANDO_GENERACION_PDF
(ver item previo).
XGAP_COMANDO_GENERACION_PDF
y su valor
debe ser el comando a ejecutar.
Esta nueva funcionalidad está definida en el código
de salida predeterminado, es decir que no se aplica en reportes que usan
salida personalizada (/odt/configuracion/salida
).
formato_consultas_log
.
Indica el formato en que se deben guardar las consultas a la base
de datos en el log de la aplicación. Si no se especifica o
se usa el valor 'mantener', se mantiene el comportamiento previo,
que es no aplicar ningún formato./odt/configuracion/template/xslt-adicional
./odt/configuracion/reporte/meta
.XgapODFXSLTProcessorExt
(odf-xslt-ext.inc.php).configuracion/imprimibles/imprimir/@maximo-filas-permitidas
.Componentes::controlImprimir()
:
$tip
(componentes.inc.php)./aplicacion/generacion/expresiones-embebidas/@habilitar = 'true'
):
carpeta/@nombre
,
carpeta/@roles
,
carpeta/@id
,
carpeta/@tip
,
carpeta/@clase
,
item/@nombre
,
item/@roles
,
item/@id
,
item/@url
,
item/@tip
,
item/@clase
,
separador/@roles
.item/@target
y
item/@usar-seguridad
./aplicacion/generacion/expresiones-embebidas
(aplicacion.xml).Flash::descartarActual()
y
Flash::descartarSiguiente()
(flash.inc.php).columnas/acciones/accion/@mostrar-si-deshabilitada
./formulario/configuracion/flash/mensaje-insert-ok
,
/formulario/configuracion/flash/mensaje-update-ok
,
/formulario/configuracion/flash/mensaje-delete-ok
y
/formulario/configuracion/flash/mensaje-firma-digital-ok
.'despues_inicializacion'
:
'recordset'
.campos//campo/@mostrarLinkDeshabilitado
.columnas/columna/@mostrarLinkDeshabilitado
.ComboBD
, se permite
especificar el texto a mostrar en la opción del combo que
corresponde a selección vacía, en vez del
predefinido "--".
Form::combo_bd()
y
Form::combo_bd_sin_hidden()
:
$texto_opcion_vacia
.@tipo="ComboBD"
:
campo/opcion-combobd-seleccion-vacia/@texto
.Json::codificar()
:
$es_utf8 = false
.despues_accion
.Conexion::existeFila()
,
Conexion::existeFilaCond()
,
Conexion::metaDatos()
,
Conexion::ajustarMetacolumnas()
,
Conexion::getTablas()
y
Conexion::getVistas()
:
$excepcion = false
./formulario/campos/@considerar-request-inicializacion-valores-modificacion
.Conexion
: se incluyen registros
de operaciones sobre transacciones en el log de la aplicación.
Nuevo parámetro en los métodos
StartTrans()
, CompleteTrans()
y
FailTrans()
: $log = true
,
para indicar si se debe registrar o no.
Mensaje
y de instancias de la clase ObjetoMensaje
, y los errores
producidos al procesar formularios.
tipos_mensaje_incluir_log
.ObjetoMensaje::nuevo()
y
ObjetoMensaje::nuevoErrorPredefinido()
:
$guardar_backtrace
.ObjetoMensaje::backtrace()
.AplicacionXgap::realFullAppDir()
./listado/consulta/condiciones_de_parametros//param/@ignorar-en-determinacion-filtro-vacio
./listado/configuracion/master
.
Complementa al ya existente /listado/configuracion/form
.'despues_insert'
, 'despues_update'
y
'despues_delete'
:
'realizar_redireccion'
.BuscadorPersonalizadoSimple::VALOR_ACCION_LIMPIAR_BUSCADOR_PERS
.Si en el mismo directorio que xgap.php existe un archivo con nombre xgap.local.php, se usan las definiciones de constantes de configuración que haya en este último, en vez de las correspondientes del primero.
Esto permite mantener xgap.php intacto, simplificando el proceso de actualización de la versión instalada de XGAP, ya que no se pierde la configuración si se sobreescribe este archivo con la nueva versión.
Conexion_oci8
: se implementa
el método referenciasEntrantes()
, que antes
retornaba siempre un valor vacío.Conexion::referenciasEntrantes()
.
Anteriormente no se podía retornar más de una
referencia por cada tabla referenciante; la nueva estructura
sí lo permite.Conexion_postgres8
: se implementan
los métodos comentarioTabla()
y
comentariosColumnas()
, que antes
retornaban siempre un valor vacío.Conexion::comentarioTabla()
y
Conexion::comentariosColumnas()
:
$esquema = null, $excepcion = false
.Conexion::clavesExtranjeras()
:
$esquema = false
.configuracion/acciones/accion/confirmar-ejecucion
.'antes_redirigir'
:
'es_destino_predeterminado'
.campo/condicion-no-editable
.'despues_inicializacion'
:
'recordset'
.despues_consulta
.Formateo::textoPlanoAHtml()
.
Advertencia de compatibilidad: La versión mínima requerida de PHP pasa a ser 5.2.4.
details/menu/condicion
.en_mantenimiento
,
pagina_mantenimiento
,
mensaje_mantenimiento
,
paginas_accesibles_en_mantenimiento
y
rolfs_acceso_en_mantenimiento
.aplicacionenmantenimiento_contenido.xml
.iSeguridad
:
Nuevas constantes
iSeguridad::VAR_SESION_ID_USUARIO_ACTUAL
,
iSeguridad::VAR_SESION_NOMBRE_CORTO_USUARIO_ACTUAL
,
iSeguridad::VAR_SESION_NOMBRE_COMPLETO_USUARIO_ACTUAL
,
iSeguridad::VAR_SESION_ID_ROLF_ACTUAL
y
iSeguridad::VAR_SESION_NOMBRE_ROLF_ACTUAL
.
Nuevos métodos
iSeguridad::usuarioLogueado()
y
iSeguridad::rolFuncionalUsuarioLogueado()
,
implementados en Seguridad::usuarioLogueado()
y
Seguridad::rolFuncionalUsuarioLogueado()
.
Advertencia de compatibilidad:
Las aplicaciones que utilicen una clase de seguridad personalizada
(parámetro de configuración clase_seguridad
)
que no herede de la implementación provista por XGAP
(clase Seguridad
) deberán implementar
estos métodos.
FULL_APP_DIR
.
Contiene la ruta completa del directorio raíz de la
aplicación en ejecución./*/@clases
.mostrar_acciones_mensajes_flash
,
accion_mensajes_flash__cerrar__texto
,
accion_mensajes_flash__mantener__texto
.efecto_abrir_mensajes_flash_transitorios
,
efecto_cerrar_mensajes_flash_transitorios
,
efecto_abrir_mensajes_flash_permanentes
,
efecto_cerrar_mensajes_flash_permanentes
columnas/columna/@mostrarLinkDeshabilitado
.'antes_valor_campo'
y 'despues_valor_campo'
:
'recordset'
y 'valores'
.Formateo::truncar()
.Conexion::crearConsultaGenerica()
.antes_fila_datos
.EstructuraPagina::esSimple()
.xgap_array_insert()
y
uriPaginaActual()
(funciones.php).Html
:
Html::heading()
.Html::cerrarTag()
,
Html::elemento()
,
Html::cerrarComentario()
y
Html::comentario()
reciben un nuevo parámetro:
$salto_linea
.
Si en la invocación no se pasa este parámetro,
el comportamiento de los métodos es el mismo que antes.buscador/personalizado-simple/rangofechas
) se
incluye un botón que permite vincular los campos de
inicio y fin del rango, haciendo que los dos tengan el mismo
valor. De esta manera se hace más sencillo buscar una
fecha específica, dado que sólo hace falta
seleccionarla una vez.
El elemento generado es un button
con clase
ButtonLinkFields
.
Advertencia de compatibilidad:
Las páginas de estos tipos que incluyan manualmente
formulario.js, por ejemplo mediante
configuracion/inclusiones/archivo
, deberían
ser modificadas para quitar esta inclusión manual; de lo
contrario el archivo se va a estar cargando dos veces.
XGAP_FORM.LinkedFieldSet
(formulario.js).Nuevos métodos en la clase PHP Flash
(flash.inc.php):
Flash::estaDeshabilitadoActual()
,
Flash::estaDeshabilitadoSiguiente()
,
Flash::cambiarDeshabilitadoActual()
,
Flash::cambiarDeshabilitadoSiguiente()
.
RequestXgap::PARAMETRO_SIN_FOCO_INICIAL_AUTOMATICO
.
Si está presente en el request y tiene valor verdadero, en los formularios
no se cambia el foco automáticamente al primer campo habilitado
o al definido por /formulario/campos/@foco-inicial
.
XGAP_FORM.FormState
. La generación de esta
característica está controlada por dos nuevos atributos XML:
la opción de configuración de la aplicación
(aplicacion.xml)
/aplicacion/generacion/formularios/@registrar-estado-cliente-campos
y la opción para formularios
/formulario/@registrar-estado-cliente-campos
.XGAP_FORM.FormState
.borrado-logico/valor/@boolean
.'despues_inicializacion'
en páginas de tipo
listado_master_inline
.despues_obtener_vbles_sistema
:
'agregado'
.@nombre-expr
y @expr
en
/listado/configuracion/acciones/accion/destino/parametros/parametro
,
/listado/columnas/columna/imagen/miniatura/parametros/parametro
,
/listado/columnas/columna/imagen/link/parametros/parametro
y
/listado/columnas/acciones/accion/destino/parametros/parametro
;
@nombre-expr
en
/listado/columnas/columna/parametros-link/parametro
.@nombre-expr
y @expr
en
/formulario/acciones/accion/parametros/parametro
.urlCompletoServidor()
(funciones.php).Request
(request.inc.php):
Request::esSeguro()
,
Request::esquema()
,
Request::host()
y
Request::puerto()
.Request::metodo()
ahora retorna el resultado siempre en mayúsculas.campos//campo/validacion-cliente/@excluir
.antes_procesar_uploads
.FormFileUpload::linkArchivo()
,
FormFileUpload::fueMovido()
,
FormFileUpload::cambiarDirDestino()
,
FormFileUpload::cambiarNombreArchivo()
,
FormFileUpload::valor()
.XgapIllegalStateException
(illegalstateexception.inc.php).extraer_directorio_pagina()
y
uniformizar_separadores_directorio()
.Además, en la parte inferior de la página principal del generador se agregaron links que llevan a esta nueva página (se muestra automáticamente uno por cada versión de motor instalada).
/formulario/campos//campo/@mostrar-saltos-linea
./formulario/acciones/accion
):
@imagen
,
@teclaacceso
,
@historial
,
@pasarParametrosDetail
,
tip
,
preparar
.link
ahora puede no estar presente,
lo que indica que la acción debe enviar el request a la misma página./listado/configuracion/texto-listado-vacio
y
/listado/configuracion/texto-listado-vacio-con-filtros
para listados;
/formulario/details/detail/texto-listado-vacio
para masters.RequestXgap::PARAMETRO_PAG_RETORNO
ahora admite
el valor especial SELF
, que hace que el URL de retorno
sea el mismo del request; es decir, causa que la página vuelva
sobre sí misma con los mismos parámetros GET.
Se puede usar, por ejemplo, para que un formulario se vuelva a cargar después de realizar la operación, en vez de volver a la página de retorno normal.
/formulario/campos//campo/destino-link/parametros/parametro
:
@nombre-expr
, @dato
y @expr
.
XGAP_FORM.Select
y
XGAP_FORM.Select.Chained
.
Funciones y clases:
XGAP_FORM.Select.resetSelection
,
XGAP_FORM.Select.setOptionsData
,
XGAP_FORM.Select.getOptionsData
,
XGAP_FORM.Select.getOptionData
,
XGAP_FORM.Select.OptionsFilter
,
XGAP_FORM.Select.Chained.ChildOptionsFilterByParentSelectedOptionData
.
Ejemplo: filtro de las opciones de un select
de acuerdo al valor seleccionado en otro:
<select id="padre" name="padre"> <option value="" selected="selected">--</option> <option value="p1">Padre 1</option> <option value="p2">Padre 2</option> </select> <select id="hijo" name="hijo"> <option value="" selected="selected">--</option> <option value="h1">Hijo 1</option> <option value="h2">Hijo 2</option> <option value="h3">Hijo 3</option> <option value="h4">Hijo 4</option> </select> <script type="text/javascript"> jQuery(document).ready(function () { var combo_padre = obtener_elemento("padre"), combo_hijo = obtener_elemento("hijo"), datos_filtro = { "": true, "p1": [ "", "h2", "h3" ] }; XGAP_FORM.Select.setOptionsData(combo_padre, "filtro", datos_filtro, [""], "value"); (new XGAP_FORM.Select.Chained.ChildOptionsFilterByParentSelectedOptionData( combo_padre, combo_hijo, "filtro", "value", [""])) .applyFilterOnParentChange(); }); </script>
El resultado es:
Cuando en "padre" se selecciona | En "hijo" quedan las opciones | Filtro en efecto |
---|---|---|
"" | todas | true |
"p1" | "", "h2", "h3" | [ "", "h2", "h3" ] |
"p2" | "" | default ([""] ) |
/odt/variables/variable/requerida
.Mensaje::COD_ERR_EJEC_FALTAN_PARAMETROS
.$var_{nombre}
ahora también puede generar una variable correspondiente
$var_xmltxt_{nombre}
, con
el mismo valor pero con los caracteres especiales XML escapados
para que se pueda emitir como texto XML de forma segura. Esta
generación está controlada por el nuevo atributo
/odt/configuracion/@definir-variables-xmltxt
.Formateo::prepararTextoXml()
(formateo.inc.php)./formulario/campos//campo/condicion-campo-visible
.antes_insert
, antes_update
y antes_delete
en formularios: boolean &'realizar_operacion' = true
.
Si se cambia su valor a falso, se aborta la operación
y se vuelve a presentar el formulario.xgapIsUndefined
,
xgapIsBoolean
,
xgapIsObject
,
xgapConstruirUrl
./formulario/campos//campo/condicion-visible
.
(texto-autocompletable|seleccionar-autocompletable)/@ignorar-acentos
.ip4
./listado/configuracion/buscador/personalizado-simple//condicion.
antes_campo_link
en formularios:
array 'metadatos'
array 'valores'
boolean 'agregado'
Conexion::obtenerListaIndexadaPorClave()
y
Conexion::literalSql()
.Conexion::obtenerTodos()
recibe dos nuevos parámetros opcionales:
$numrows
y $offset
.Conexion::expresionComparacionBinaria()
para que acepte cualquier operador, no sólo uno de los predefinidos.XgapTableArray
.campo/validacion-cliente
;
permite controlar la validación que se realiza en el cliente.
Incluye los elementos
campo/validacion-cliente/predefinida
,
campo/validacion-cliente/fn-condicion-realizacion
y
campo/validacion-cliente/fn-valor-atributo
.
El elemento campo/validacion-cliente/predefinida
tiene el mismo significado que
campo/validacion
y es la nueva forma recomendada de especificar el tipo de
validación de formato, aunque campo/validacion
se mantiene por compatibilidad.
campo/validacion-servidor-predefinida
.
Provee dos formas de controlar la validación que se realiza
en el servidor:
campo/validacion-servidor-predefinida/@realizar
y
campo/validacion-servidor-predefinida/condicion-realizacion
.campo/eventos/calendar-update
.Date
, con lo cual
la última de las dos en cargarse sobreescribía las
propiedades definidas por la primera. Por ejemplo, ambas definen
la función Date.parseDate
.
Advertencia de compatibilidad:
Para solucionar el problema fue necesario modificar DHTML Calendar
para renombrar las propiedades que agrega a Date
,
es decir que cambió parte del API definido por este widget.
Específicamente, los cambios fueron los siguientes:
Antes | Ahora |
---|---|
Date._MD | Date._jscal_MD |
Date.SECOND | Date.jscal_SECOND |
Date.MINUTE | Date.jscal_MINUTE |
Date.HOUR | Date.jscal_HOUR |
Date.DAY | Date.jscal_DAY |
Date.WEEK | Date.jscal_WEEK |
Date.parseDate | Date.jscal_parseDate |
Date.prototype.getMonthDays | Date.prototype.jscal_getMonthDays |
Date.prototype.getDayOfYear | Date.prototype.jscal_getDayOfYear |
Date.prototype.getWeekNumber | Date.prototype.jscal_getWeekNumber |
Date.prototype.equalsTo | Date.prototype.jscal_equalsTo |
Date.prototype.setDateOnly | Date.prototype.jscal_setDateOnly |
/listado/columnas/columna/[formato|formato-variedad]/codigo
;
formularios master: /formulario/campos//campo/formato/codigo
)
ahora tiene predefinida una nueva variable: $registro
,
que le permite al código tener acceso a todos los campos
del registro al que pertenece el valor.inicio_celda_encabezado
ahora recibe un parámetro
adicional: &'valor_a_mostrar'
.info_tipos_pagina_xgap()
.RequestXgap::PARAMETRO_DISPOSICION_CONTENIDO_IMPRIMIBLES
y nuevo método
RequestXgap::disposicionContenido
(request.inc.php).
Se provee una manera de indicar por cada solicitud el tipo de
disposición de contenido con que se deben retornar documentos
no HTML generados por la aplicación, ignorando durante dicha
solicitud el valor del parámetro de configuración
disposicion_contenido_imprimibles. Para ello se debe
pasar en la solicitud un parámetro con el nombre dado por
la constante
RequestXgap::PARAMETRO_DISPOSICION_CONTENIDO_IMPRIMIBLES
y el valor deseado para la disposición de contenido.
Request::metodo()
.XGAP.Flash
(flash.js).
Permite acceder al Flash después de cargada la página.RequestXgap::PARAMETRO_PAG_RETORNO
.Formateo::prepararSalidaString()
y
Formateo::prepararSalidaUrl()
.
La función preparar_salida()
ahora es un alias de
Formateo::prepararSalidaString()
, con algunas mejoras
de rendimiento.
/listado/columnas/*/@clase
.campo/eventos/select
.XGAP_FORM.cambiarHabilitacionSeleccionable()
,
XGAP_FORM.deshabilitarSeleccionable()
y
XGAP_FORM.habilitarSeleccionable()
(formulario.js).XGAP.cambiarHabilitacionLink()
,
XGAP.deshabilitarLink()
y
XGAP.habilitarLink()
(utilidades.js).(texto-autocompletable|seleccionar-autocompletable)/columnas-extra-mostrar
.usar_css_ext_predefinido
.XGAP.console
(utilidades.js). Provee un reemplazo
para window.console
que es seguro para usar en cualquier
entorno: si la consola no está disponible, los métodos
de este objeto no tienen efecto, en vez de producir un error.xgap_get_remote_file_contents()
.Auditor::log()
:
$tipo
; nuevas constantes para
usar con este parámetro:
Auditor::TIPO_LOG_OPERACION
,
Auditor::TIPO_LOG_ERROR
,
Auditor::TIPO_LOG_ADVERTENCIA
,
Auditor::TIPO_LOG_INFORMACION
.
Advertencia de compatibilidad: El agregado del tipo hace que cambie:
duracion_token_csrf
.iSeguridad
: nuevo método
iSeguridad::destruirSesionAplicacion()
.
Advertencia de compatibilidad:
Las aplicaciones que utilicen una clase de seguridad personalizada
(parámetro de configuración clase_seguridad
)
que no herede de la implementación provista por XGAP
(clase Seguridad
) deberán implementar
este método.
XgapRand
(rand.inc.php) y
XgapCsrf
(csrf.inc.php).
Advertencia de requerimientos:
La clase XgapCsrf
requiere que esté
disponible la extensión Hash de PHP.
sal_hashes
.Advertencia de compatibilidad:
Se debe agregar el parámetro sal_hashes
al archivo de configuración de las aplicaciones
existentes, dado que es requerido.
xgap_random_token()
./formulario/firma-digital
.iXgapPublicKeyInfrastructure
,
iXgapStoredPublicKeyInfrastructure
,
iFirmaOperacion
,
XgapPublicKeyInfrastructure
,
XgapOpenSslPublicKeyInfrastructureTest
,
XgapDefaultOpenSslPublicKeyInfrastructure
,
FirmaOperacion
,
FirmaOperacionDefault
.XGAP_FIRMADO_OPERACIONES_HABILITADO
;
se define automáticamente durante la generación
en xgap.php, de acuerdo al valor de
aplicacion.xml:/aplicacion/seguridad/@usa-firmas-digitales
./aplicacion/seguridad/@usa-firmas-digitales
.
Permite habilitar o deshabilitar en tiempo de generación el uso
del soporte de firmas.archivo_clase_pki
,
clase_pki
,
archivo_clase_firmaoperacion
,
clase_firmaoperacion
,
frase_clave_privada_requerida
,
certificado_obligatorio_en_carga_clave_privada
,
codificador_datos_firmaoperacion
y
archivo_codificador_datos_firmaoperacion
.Contexto
:
Contexto::existeSesion()
,
Contexto::idSesion()
,
Contexto::cambiarIdSesion()
y
Contexto::regenerarIdSesion()
.Contexto::destruirSesionAplicacion()
con la misma funcionalidad que Contexto::destruir_sesion_aplicacion()
y este último se hace obsoleto, disparando un aviso
si se invoca.duracion_sesion
.
Si el tiempo de inactividad se supera, en el siguiente acceso se
destruye automáticamente la sesión de esa aplicación,
sin afectar a las demás.
Este control es independiente de la duración de sesión
configurada en PHP.
Nuevo método PHP
Contexto::obtenerTiempoUltimaActividad()
/menu/@cache
, para indicar
el tipo de cache a usar (por defecto se usa cache por rol),
y /menu/@id
para permitir que
las aplicaciones guarden más de un menú en cache.RequestXgap::PARAMETRO_RECARGA_MENU
.
Si está presente en el request, se invalida el cache y se
reconstruye el menú.XgapXml
y XgapXmlArray
(xml.inc.php).XgapNotImplementedException
,
XgapFunctionNotImplementedException
y
XgapMethodNotImplementedException
./menu//item/@url
), de acuerdo a lo que indica
iSeguridad::puedeVerPagina()
,
y no se muestran en caso de no tenerlo.
Advertencia de compatibilidad:
En el código generado ahora se convierten correctamente
los caracteres XML especiales en entidades. Esto implica que
si en un archivo de definición de menú se estaban
escapando manualmente estos caracteres, se debe corregir para
eliminar el escape manual. Por ejemplo, si
ppal_menu.xml antes decía:
url="ciudad_listado.php?xgap_historial=reset&amp;agregado=true"
se debe cambiar a:
url="ciudad_listado.php?xgap_historial=reset&agregado=true"
Flash::vaciar()
,
Flash::existeSiguiente()
y
Flash::obtenerSiguiente()
.Conexion
:
Conexion::blobEncode()
y
Conexion::blobDecode()
.Conexion::ejecutarConsulta()
,
Conexion::ejecutarConsultaLimitOffset()
,
Conexion::ejecutarConsultaSegura()
,
Conexion::ejecutarConsultaSeguraLimitOffset()
,
Conexion::ejecutarConsultaActualizacion()
,
Conexion::obtenerPrimeraFila()
,
Conexion::obtenerPrimero()
y
Conexion::obtenerTodos()
reciben un nuevo parámetro
$excepcion
, que permite indicar
si al producirse un error en la consulta se debe disparar una
excepción o generar un error de aplicación, como
ocurría hasta ahora; el comportamiento predeterminado
sigue siendo generar un error.XgapClassLoader
(classloader.inc.php). Implementa
carga automática de clases/interfaces provistas por XGAP.
Se activa automáticamente cuando se carga la configuración,
o se puede habilitar manualmente invocando a
XgapClassLoader::register()
.Advertencia de compatibilidad: Ahora se verifica más estrictamente la correctitud de los parámetros de configuración durante la carga del archivo conf.inc.php, por lo cual se producirán excepciones en aplicaciones que tengan algún problema de configuración que antes no se detectaba, por ejemplo un parámetro requerido faltante o un parámetro entero definido como string.
iXgapVarConvert
(ivarconvert.inc.php),
con implementaciones:
XgapVarConvertSerialized
(varconvertserialized.inc.php),
XgapVarConvertExported
(varconvertexported.inc.php),
XgapVarConvertJson
(varconvertjson.inc.php),
XgapVarConvertXml
(varconvertxml.inc.php).Http
(http.inc.php):
nuevos métodos Http::statusLine()
y Http::getStatusCodeReasonPhrase()
;
nuevas constantes Http::HTTP1_STATUS_*
Formateo::entrecomilladoSimple()
y
Formateo::entrecomilladoDoble()
.Json::decodificar()
$opciones
en Json::codificar()
Json::codificar()
ahora dispara una excepción
si no puede codificar el valor dado.es_array_indexado_secuencial()
,
matrix_2d_transpose()
,
find_classes_in_dir()
,
xgap_convert_encoding()
,
xgap_convert_encoding_to_utf8()
,
xgap_convert_encoding_to_internal()
(funciones.php).XgapGenericFactory
(genericfactory.inc.php).Recursos
(recursos.inc.php), que provee
acceso a objetos globales.FormFileUpload
(upload.inc.php):
FormFileUpload::contenido()
,
FormFileUpload::contenidoLineas()
.Form::abrir_grupo
(form.inc.php):
$clase
.Componentes
(componentes.inc.php):
Componentes::separadorGrupoFormulario()
y
Componentes::comentarioCampoFormulario()
.ExcepcionXGAP
(xgap.php):
ExcepcionXGAP::getFullMessage()
,
ExcepcionXGAP::getFullDevMessage()
,
ExcepcionXGAP::prependToMessage()
,
ExcepcionXGAP::appendToMessage()
,
ExcepcionXGAP::prependToDevMessage()
,
ExcepcionXGAP::appendToDevMessage()
y
ExcepcionXGAP::__toString()
.id_usuario_en_sesion_base_nombre
e
id_usuario_en_sesion_base_var
.Conexion_postgres8::cambiarParametroConfiguracion()
y
Conexion_postgres8::establecerVariableSesion()
.
Conexion::ejecutarStoredProcedure()
(conexion.inc.php):
$registro_log
. Permite indicar si se
debe guardar la operación en el log del auditor.Formateo::ip4SinCerosIniciales()
.Html::idValido()
./formulario/campos//separador_grupo/@nombre
./formulario/campos//campo[@tipo="Seleccionable"]/texto-autocompletable
y
/formulario/campos//campo[@tipo="Seleccionable"]/seleccionar-autocompletable
):
@es-combo
.Javascript::codificarString()
:
$comillas_dobles
.SmtpEmail
(email.inc.php).XGAP_CONF_SMTP_HOST
, XGAP_CONF_SMTP_PORT
,
XGAP_CONF_SMTP_USER
, XGAP_CONF_SMTP_PASS
,
XGAP_CONF_SMTP_SECURITY
.Mensaje::mail()
ahora envía el email via SMTP si la aplicación
está configurada para usar este protocolo./formulario/campos//campo/texto-autocompletable
y
/formulario/campos//campo/seleccionar-autocompletable
,
aplicables cuando campo[not(@tipo)]
o campo[@tipo="Seleccionable"]
.Form::autocompletable()
(form.inc.php)
y nueva función javascript XGAP_FORM.crearCampoAutocompletable()
(formulario.js).Json
(json.inc.php).XGAP_FORM.moverFocoAPrimerCampo()
(formulario.js).Conexion
:
Conexion::ejecutarConsultaSeguraSinMsg()
,
Conexion::ejecutarConsultaSeguraLimitOffsetSinMsg()
,
Conexion::expresionComparacionBinaria()
,
Conexion::operadoresBinariosComparacion()
,
Conexion::textoOperadorBinarioComparacion()
.id="{nombre del campo}_fila"
.Tabla::abrirFila()
(tabla.inc.php):
$nombre
.unserialized_ok()
y
unserialize_with_exception()
;
nueva excepción PHP ExcepcionXGAPUnserialize
.Pagina
(pagina.inc.php)ObjetoMensaje
y ListaMensajes
(mensaje.inc.php)Mensaje::mostrar()
y Mensaje::mostrarLista()
(mensaje.inc.php).Se agrega un modo para que el código personalizado tenga la posibilidad
de mostrar mensajes en las páginas de una forma estandarizada.
Ejemplo de uso:
<formulario> ... <codigoExtra> ... <codigo ubicacion="despues_inicializacion" tipo="PHP"> <![CDATA[ ... Pagina::instancia()->mensajes()->agregar(ObjetoMensaje::nuevo( 'No se pudo realizar la comprobación.', Mensaje::TIPO_ALERTA)); ... ]]> </codigo> ... </codigoextra> ... </formulario>
Los mensajes almacenados en Pagina::instancia()->mensajes()
se muestran automáticamente en páginas de tipo
formulario, formulario_reporte, master, listado, seleccion y seleccion_m.
Para mostrarlos en páginas de tipo contenido,
se puede incluir código similar al siguiente dentro de /pagina/contenido
:
if (!Pagina::instancia()->mensajes()->isEmpty()) { Mensaje::mostrarLista(Pagina::instancia()->mensajes(), true, null, 'cont-msjs-pag'); }
Http
:
Http::noCache()
:
$send_content_type
, $media_type
,
$charset
.Http::headerContentType()
ahora no envía charset si el parámetro $charset
es vacío./pagina/configuracion/comandos-genericos/comando/preparar
.carpeta/condicion
,
item/condicion
y
separador/condicion
.carpeta/@id
,
carpeta/@clase
,
carpeta/@tip
,
item/@id
,
item/@clase
,
item/@tip
.Conexion
(conexion.inc.php):
Conexion.estaConectado()
y
Conexion.reconectar()
.Conexion.metaDatos()
:
'gentype'
,
'size'
y 'scale'
.
El campo 'gentype'
puede tomar cualquiera de los valores definidos por las
nuevas constantes Conexion::DATATYPE_*
.'len'
y 'clen'
, dado que eran inconsistentes: en algunos casos
representaban la longitud del campo y en otros su tamaño;
ahora corresponden siempre a la longitud y el campo 'size'
al tamaño.tecla_acceso_boton_agregar
,
tecla_acceso_boton_agregar_seguir
,
tecla_acceso_boton_borrar
,
tecla_acceso_boton_cancelar
y
tecla_acceso_boton_guardar
./formulario/configuracion/boton-agregar/@teclaacceso
,
/formulario/configuracion/boton-agregar-seguir/@teclaacceso
,
/formulario/configuracion/boton-borrar/@teclaacceso
,
/formulario/configuracion/boton-cancelar/@teclaacceso
y
/formulario/configuracion/boton-guardar/@teclaacceso
.DescriptorPaginas::tipoFormulario()
./odt/configuracion/antes-inicializacion
y /odt/configuracion/salida
.str_starts_with()
,
str_istarts_with()
,
str_ends_with()
,
str_iends_with()
./*/@mantener-pagina-sesion-vencida
, que permite
evitar la redirección a la página de inicio cuando vence
o no está creada la sesión del usuario.
Se puede obtener el mismo efecto definiendo una constante PHP con nombre
XGAP_CONF_MANTENER_PAGINA_SESION_VENCIDA
y valor true, antes de la inicialización de XGAP en la página.version_adodb
con valor vacío.longitud_max_cols_text
.Conexion
:
Conexion::esBooleano()
./listado/configuracion/acciones/accion/destino/@historial
.Mensaje
(mensaje.inc.php):
Los métodos Mensaje::error()
, Mensaje::alerta()
,
Mensaje::notificacion()
, Mensaje::info()
y Mensaje::generico()
reciben un nuevo parámetro: $clase_extra
.Conexion
(conexion.inc.php):
Conexion::concat()
.AdministradorHistorial::actualizar()
(historial.inc.php):
$comandos
e $ignorar_request
.Flash
(flash.inc.php):
Flash::instancia()
.Flash::mantener()
ahora mantiene también
el tiempo de presentación actual; este comportamiento se puede
controlar con el nuevo parámetro $mantener_tiempo_presentacion
.Request
(request.inc.php):
Request::eliminar()
,
Request::eliminarGet()
,
Request::eliminarPost()
.cambiarSeleccionSelect()
y restaurarSeleccionSelect()
(formulario.js):
ahora disparan un evento change
sobre el select que afectan./formulario//campos//campo/controles-seleccion-lista
,
que indica que se debe adjuntar a la lista una serie de controles para modificar
la selección de sus elementos, los cuales permiten seleccionar
y deseleccionar todos los elementos, y restaurar la selección inicial.controles-seleccion-lista
.Form::select_multiple()
(form.inc.php):
$controles_seleccion
y
$opciones_controles_seleccion
.restaurarSeleccionSelect()
.titulo
de campos de formulario de tipo 'CheckBox':
/formulario/campos//campo[@tipo='CheckBox']/titulo/@posicion
.consulta-sm
de campos de formulario
(tipo 'SeleccionableMultiple', 'Lista' y 'ListaBD'):
/formulario/campos//campo/consulta-sm/@realizar-en-alta
./formulario/campos//campo/@filas
ahora permite el valor 0 para campos de tipo 'SeleccionableMultiple',
'Lista' y 'ListaBD', el cual indica que la lista generada debe tomar
la altura que le asigna por defecto el navegador./formulario/campos//campo[@tipo="SeleccionableMultiple"]/orderby
./listado/columnas/acciones/accion[tipo-request="POST"]
):
los parámetros se estaban enviando al destino como parte del URL;
ahora se envían como parte del POST.Flash
: nuevos métodos
Flash::tiempoPresentacionActual()
,
Flash::cambiarTiempoPresentacionActual()
,
Flash::tiempoPresentacionSiguiente()
y
Flash::cambiarTiempoPresentacionSiguiente()
;
nueva constante Flash::TIEMPO_PRESENTACION_INDETERMINADO
.Componentes::DURACION_MENSAJE_FLASH
./formulario/campos//campo/@tipo
):
Lista
y ListaBD
./formulario/campos//campo[@tipo="Combo" or @tipo="Radio"]
):
select/options
,
alternativo al ya existente select/option
.Html::atributoTexto()
y
Html::atributoSimple()
.Html::abrirTag()
y el parámetro
$titulo
de los métodos de la clase Form
;
(b) la salida javascript producida por la clase Tooltip
;
(c) el código PHP generado a partir de
/formulario/campos//campo/tip
,
/formulario/campos//campo[@tipo='Link']/etiqueta
,
/formulario/campos//campo[@tipo='Link']/click
y
/formulario/campos//campo[@tipo='Link']/destino-link/parametros/parametro/@valor
.
Advertencia de compatibilidad:
Esto provoca problemas en aplicaciones existentes que escapan
el texto manualmente en los lugares mencionados,
dado que se produce un doble escape.
/pagina/configuracion/comandos-genericos/comando/condicion
./*/seguridad/validacionExtra
, para todos los tipos de página:
validacionExtra/@metodo-http
.validacionExtra/codigo
tiene disponibles nuevos parámetros:
&$mensaje_usuario
,
&$mensaje_debug
y
&$params_extra
,
que permiten pasar mensajes y parámetros arbitrarios a la página de error.HistorialNavegacion
(historial.inc.php):
HistorialNavegacion::siguienteA()
,
HistorialNavegacion::anteriorA()
y
HistorialNavegacion::primeroPorTipo()
.Http::redirigirAError()
(configuracion.inc.php)
ahora permite (1) indicar el método HTTP a usar para la redirección
(GET o POST) y (2) pasar parámetros arbitrarios a la página destino.Configuracion::paginaInterna()
.urlCompletoPagina()
.columnas/columna/parametros-link
.xgap_cargado
./formulario/campos//campo/validacion-servidor
./formulario/campos//campo/comentarios/comentario
.Request
:
$ajustar_si_array
en Request::obtener()
, Request::obtenerPost()
y Request::obtenerGet()
.$actualizar_request
en Request::almacenarPost()
y Request::almacenarGet()
.Se permite especificar una condición en cada acción
global en listados (configuracion/acciones/accion
),
para determinar en tiempo de ejecución si debe estar habilitada
o no; en caso de no estarlo, no se emite en la página el
botón para invocarla.
Para ello, se agrega el elemento
configuracion/acciones/accion/condicion
.
Se brinda la posibilidad de ocultar cualquier columna en un listado, de acuerdo a una condición que se evalúa en tiempo de ejecución. Anteriormente esta funcionalidad sólo estaba disponible para columnas de acciones.
Para ello, se permite el elemento condicion
en cualquier tipo
de columna: checkbox/condicion
,
combo/condicion
y
columna/condicion
, además del ya existente
acciones/condicion
.
/formulario/campos//campo/@tipo='Personalizado'
).
Para trabajar con este tipo de campo se agregan también el elemento
campo/contenido
y el atributo
campo/@multilinea
.
/formulario/campos//campo/preparar-valor
.
Nuevos parámetros de configuración:
css_ie
y css_ie8
.
En la clase Html
se agregan las constantes
Html::NAVEGADOR_IE
y Html::NAVEGADOR_IE8
,
que se pueden utilizar en el parámetro $csss
de Html::head()
.
chequear_multiple
y
chequear_multiple_valor
(utilidades.js):
ahora disparan el evento 'change' para cada uno de los checkboxes cuyo estado cambia.EntradaHistorial::eliminar_variables()
./listado/configuracion/acciones/accion/destino/@tipo-request
.Http::redirigirPorPost()
.Html::DEFAULT_ENCODING
./listado/columnas/checkbox/valor
,
para modificar el valor que contienen los checkboxes.
Actualmente define valor/incluir/columna-consulta
,
para indicar otras columnas a incluir.serie/color
, serie/espesorLinea
y serie/simbolo
.Ejemplo de uso:
<graficoLinea> ... <datos> <serie> ... <espesorLinea>0</espesorLinea> <simbolo>rombo</simbolo> </serie> </datos> </graficoLinea>
columnas/acciones/accion/@nombre
.@nombre="mostrar"
,
el id del elemento en la cuarta fila resulta "mostrar_4"
.
Si no está presente, el nombre por defecto es
"accion_{ind columna acciones}_{ind accion}_{nro fila}"
;
por ejemplo, en una acción definida como segunda acción en la primera columna de acciones,
la cuarta fila tiene nombre por defecto "accion_1_2_4"
.columna/formato
y columna/formato-variedad
en listados
y campo/formato
en masters,
que permiten definir el formato a aplicar a los valores.
Se proveen tres formas distintas para definir el formato:
sprintf()
para aplicar formato al valor.Ejemplos:
<columna>... <formato> <codigo> <![CDATA[ return strtoupper(preg_replace('/\d/', '#', $valor)); ]]> </codigo> </formato>... </columna> <columna>... <formato> <simple formato="%08u"/> </formato>... </columna> <columna>... <formato-variedad> <funcion nombre="MyFormatter::htmlAddress"/> <aplicar-en> <normal/><seleccion/><seleccion_m/><master_inline/> </aplicar-en> </formato-variedad> <formato-variedad> <funcion nombre="MyFormatter::textAddress"/> <aplicar-en> <csv/><ods/><pdf/><rtf/><xls/> </aplicar-en> </formato-variedad>... </columna>
Validacion::esLatitud()
,
Validacion::esLongitud()
,
Validacion::esCoordUtm()
,
Validacion::esFechaValida()
,
Validacion::esFechaFutura()
,
Validacion::esFechaMayor()
.Conexion::existeFila()
y
Conexion::existeFilaCond()
.Nueva funcionalidad: Generación de gráficos incorporados en listados
(/listado/configuracion/graficos
).
Permite agregar en forma sencilla un gráfico sobre los datos obtenidos de la misma consulta SQL
que se utiliza en el listado y así ofrecer una presentación de los valores tanto en forma tabular
como gráfica a la vez. Se soporta la creación de gráficos de linea y de barra,
que se obtienen por AJAX al solicitarlo el usuario desde el listado.
Ejemplo de uso:
<listado> ... <generacion> <salidas> <normal/><pdf/><xls/><ods/><grafico_simple/> </salidas> </generacion> <configuracion> ... <graficos> <graficoLinea> <ejeAbscisasTemporal> <etiqueta>Fecha</etiqueta> </ejeAbscisasTemporal> <ejeOrdenadas> <etiqueta>Temperatura [°C]</etiqueta> </ejeOrdenadas> <datos> <serie> <nombre>Mínima</nombre> <clave>unixtimestamp</clave> <valor>minval</valor> </serie> <serie> <nombre>Promedio</nombre> <clave>unixtimestamp</clave> <valor>avgval</valor> </serie> <serie> <nombre>Máxima</nombre> <clave>unixtimestamp</clave> <valor>maxval</valor> </serie> </datos> </graficoLinea> </graficos> ... </configuracion> ... </listado>
/listado/configuracion/buscador/personalizado-simple/listacampos
),
formado por una lista de campos de los otros tipos disponibles.
Nuevo método: iSeguridad::operacionHabilitada()
,
implementado en Seguridad::operacionHabilitada()
;
XGAP lo utiliza en las páginas generadas,
para determinar si una operación debe estar disponible.
La implementación provista devuelve siempre true. Queda a criterio de las aplicaciones
definir una clase de seguridad personalizada, con una implementación diferente.
De este modo, las aplicaciones pueden realizar un control genérico sobre
el acceso a las operaciones en las páginas.
Por el momento se aplica a las operaciones Agregar, Modificar
y Eliminar (formularios).
Para no crear un overhead en tiempo de ejecución en aplicaciones
que no requieran la nueva funcionalidad, se agregó una nueva opción
de configuración de generación en aplicacion.xml:
/aplicacion/seguridad/@verificar-acceso-operaciones
;
si esta opción no está presente o tiene valor 'false', no se incluye
la invocación a iSeguridad::operacionHabilitada()
en los archivos PHP generados.
Además, para permitir especificar este comportamiento en cada página,
se agregó en todos los tipos de página la opción
/*/seguridad/@verificar-acceso-operaciones
,
que tiene mayor prioridad que la opción global.
Por otro lado, sólo se aplica si la página utiliza seguridad
(/*/seguridad
).
Advertencia de compatibilidad:
Las aplicaciones que utilicen una clase de seguridad personalizada
(parámetro de configuración clase_seguridad
)
que no herede de la implementación provista por XGAP
(clase Seguridad
) deberán implementar
este método.
iOperacion
, en
interfaces/iOperacion.inc.php,
y nuevas clases Operacion
, OperacionAgregar
,
OperacionEditar
y OperacionBorrar
, en
clases/operacion.inc.php.
tipo_pagina()
, empty2()
,
array_tiene_vacios()
y array_vacio()
.
/grafico/codigoExtra/codigo/@ubicacion
), que hasta el momento
no tenían ninguna definida.
configuracion/agregar-seguir
)
quedaba igual que el del comando Agregar y Volver (configuracion/agregar-volver
),
con lo cual el usuario no los podía distinguir./formulario/configuracion/boton-agregar-seguir
iSeguridad::puedeVerPaginaParams()
,
implementado en Seguridad::puedeVerPaginaParams()
,
que se utiliza para comprobar si una página se puede visitar, de acuerdo
a su dirección y los parámetros que va a recibir./aplicacion/seguridad/@verificar-acceso-destino-final
;
si esta opción no está presente o tiene valor 'false', no se incluye
la invocación a iSeguridad::puedeVerPagina()
en los archivos PHP generados.
Además, para permitir especificar este comportamiento en cada página
se agregó en todos los tipos de página la opción
/*/seguridad/@verificar-acceso-destino-final
,
que tiene mayor prioridad que la opción global.
Advertencia de compatibilidad:
Las aplicaciones que utilicen una clase de seguridad personalizada
(parámetro de configuración clase_seguridad
)
que no herede de la implementación provista por XGAP
(clase Seguridad
) deberán implementar
este método.
configuracion/acciones/accion
)
que quedan deshabilitadas: ahora no se genera el botón de ejecución de la acción,
en lugar de mostrarlo deshabilitado, por consistencia con el comportamiento de los demás botones en la página.
/listado/columnas/columna/tipo
como integer
o real
(si no por defecto se toma como texto).
configuracion/acciones/accion
)
que incluyen un destino explícito, ahora se comprueba si el usuario tiene permiso
para ver el destino;
en caso de no tenerlo se deshabilita el botón de ejecución.
Form::agregar_imprimir()
pasa a
Componentes::parametrosDestinoImprimir()
y
Componentes::controlImprimir()
Form::agregar_boton_accion_listado()
pasa a
Componentes::controlAccionListado()
/seguridad/pagina/@tipo
en seguridad.xml correspondiente a la página).
DescriptorPaginas
./aplicacion/generacion/descriptor-paginas
en aplicacion.xml./*/configuracion/descriptor-pagina
en todos los tipos de página,
con mayor prioridad que el de aplicacion.xml./formulario/details/detail/@colapsable
y
/formulario/details/detail/@iniciar-colapsado
(Ticket #36).Componentes::tituloPagina()
./listado/consulta/constructor
.iSeguridad::hayUsuarioLogueado()
y iSeguridad::paginaUsaSeguridad()
,
implementados en Seguridad::hayUsuarioLogueado()
y Seguridad::paginaUsaSeguridad()
.
Advertencia de compatibilidad:
Las aplicaciones que utilicen una clase de seguridad personalizada
(parámetro de configuración clase_seguridad
)
que no herede de la implementación provista por XGAP
(clase Seguridad
) deberán implementar
ests métodos.
Mensaje::generico()
./listado/columnas/columna/@permiteOrdenar
.Upload
y FormFileUpload
.Upload
y FormFileUpload
y se aumentan las verificaciones realizadas en los archivos.ruta_archivo()
.Form
:
Form::file_simple().
Form::file()
:
@tipo='CheckBox'
:
campo/valores-checkbox/chequeado
y
campo/valores-checkbox/no-chequeado
.campo/@chequeado
si está especificado o el valor de campo/dato
si no.<campo tipo="CheckBox"> <titulo>¿Habilitado?</titulo> <dato>habilitado</dato> <default>Conexion::sqlstr2php(XGAP_CONF_VALOR_VERDADERO_SQL)</default> <valores-checkbox> <chequeado>Conexion::sqlstr2php(XGAP_CONF_VALOR_VERDADERO_SQL)</chequeado> <no-chequeado>Conexion::sqlstr2php(XGAP_CONF_VALOR_FALSO_SQL)</no-chequeado> </valores-checkbox> </campo>
Conexion::sqlstr2php()
./formulario/campos//campo/default.
Form
:
Form::checkbox()
:
$descripcion, que genera un label
asociado al checkbox.Form::radio()
se cambió la etiqueta generada por
$descripcion, de un span a un label.combo_simple == false
.@ancho
en
/listado/configuracion/buscador/personalizado-simple/combo
y /listado/configuracion/buscador/personalizado-simple/combobd
.BuscadorPersonalizadoSimple::generar()
ahora acepta la clave 'ancho'
cuando
'tipo' == 'combo'
o 'tipo' == 'combobd'
.f_pre_validation
y f_pos_validation
, que permiten indicar
funciones a ejecutar antes y después del proceso normal de validación.<codigo tipo="JAVASCRIPT" ubicacion="fin_body"> <![CDATA[ // Después de la validación normal se comprueba que la fecha de inicio sea anterior a la de fin. v.f_pos_validation = function () { var fechainicio = obtener_elemento("fechainicio").value; var fechafin = obtener_elemento("fechafin").value; if (fechainicio != "" && fechafin != "" && comparacionFechas(fechainicio, fechafin) >= 0) { v.s_msg = "La fecha de habilitación debe ser anterior a la fecha de finalización."; return false; } return true; }; ]]> </codigo>
/formulario/campos//campo/@permitir-html
y nuevo elemento /formulario/campos//campo/elementos-html-permitidos
.Conexion
:
Conexion.obtenerTodos()
.Conexion.cambiarModoObtencion()
ahora retorna el valor anterior
y no tiene efecto si el modo dado no es correcto.Conexion.cambiarModoObtencion()
./listado/configuracion/buscador/personalizado-simple/combo/variable
.iSeguridadConexion.borrarPermisosDePaginaUnica()
y
iSeguridad.actualizarPermisosPorPagina()
,
implementados en SeguridadConexion.borrarPermisosDePaginaUnica()
y
Seguridad.actualizarPermisosPorPagina()
, respectivamente.
Advertencia de compatibilidad:
Las aplicaciones que utilicen una clase de seguridad personalizada
(parámetro de configuración clase_seguridad
)
que no herede de la implementación provista por XGAP
(clase Seguridad
) deberán implementar
estos métodos.
Imagen
.Configuracion
:
recuperarDefaults()
,
recuperarDefaultParametro()
y recuperarDefaultArray()
.recuperarColor()
.color_rgb()
y color_hexrgb()
.Validacion::esColorHexValido()
y
Validacion::esColorDecValido()
.imagen_ancho_def
, imagen_alto_def
, imagen_def
,
imagen_def_generada_texto
, imagen_def_generada_color_frente
,
imagen_def_generada_color_fondo
, imagen_def_generada_tam_fuente
.
Todos están dentro de una nueva sección: imagen
.
/listado/columnas/columna/imagen
, que permite definir varios
aspectos de la presentación de una columna con imágenes.@pagina_foto
,
@llevaALink
y link
, dado que está diseñado para reemplazarlos
para este tipo de uso.columna/recortar
./*/seguridad/validacionExtra
para todas las páginas.Http
:
redirigir()
y redirigirAError()
.
Además se habilita el acceso a esta clase para todas las páginas.Formateo
: mensaje()
.
Además se habilita el acceso a esta clase para todas las páginas.Mensaje
: mail()
,
para enviar mensajes por email.Validacion
./formulario/codigoExtra/codigo[@tipo="PHP" and (@ubicacion="inicio_celda_datos" or @ubicacion="fin_celda_datos")]
recibe un nuevo parámetro: array 'valores_fila'
, con los valores de todas las columnas en la fila.Conexion
: aBoolean()
y aBooleanTF()
.Request::obtener()
, Request::obtenerPost()
y Request::obtenerGet()
: $trim y $stripslashes.configuracion/acciones/accion/destino/parametros/columna
,
que permite indicar columnas de controles que se deben pasar como parámetro
a la acción.configuracion/acciones/accion/reset
, usado para
indicar columnas de controles que se deben volver a su estado original luego
de ejecutar la acción.@htmlarea-config
y @htmlarea-toolbars
.@htmlarea-toolbars
(si no se especifica
@htmlarea-config
) son: 'Default', 'Simple' y 'Basic'.... <campo tipo="HtmlArea" htmlarea-config="scripts/fckappconfig.js" htmlarea-toolbars="SoloFormatoTexto">...</campo> <campo tipo="HtmlArea" htmlarea-toolbars="Basic">...</campo> ...
FCKConfig.ToolbarSets["SoloFormatoTexto"] = [
['Bold','Italic','Underline','StrikeThrough','-','Subscript','Superscript'],
'/',
['TextColor','BGColor'],
['FontFormat','FontName','FontSize']
];
FCKConfig.EnterMode = 'br';
@spin-texto-solo-lectura
(booleano).
Indica que el campo de texto debe ser de sólo lectura,
con lo cual sólo se puede modificar el valor usando los botones del spin.Form::tiempo()
y Form::spin_rango()
./formulario/campos//campo/@solo-lectura
ahora se puede
aplicar también a campos @tipo = 'Spin', 'Tiempo' o 'Fecha'./formulario/campos/@solapa-activa
.preparar_array_salida()
y esUTF8()
./formulario/codigoExtra/codigo[@tipo="PHP" and @ubicacion="despues_inicializacion"]
recibe un nuevo parámetro: 'sololectura'
(por referencia)./listado/configuracion/buscador/personalizado-simple/texto/@mayusculas
y el correspondiente parámetro para campos de tipo texto en la clase PHP
BuscadorPersonalizadoSimple
.obtener_listado_archivos()
y
obtener_listado_archivos_por_patron()
: se agregó el parámetro
$excluir, para excluir archivos del resultado por patrón del nombre.@tipo='Constante'
ahora se puede
definir con un llamado a función en vez de un valor literal o una variable,
usando el elemento "funcion" en vez de "valor". Ejemplo:
<campo tipo="Constante"> <dato>iporigen</dato> <funcion>Request::ipOrigen()</funcion> </campo>
<listado xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:noNamespaceSchemaLocation="../../xsd/listado.xsd"> ... <columnas> <columna> <titulo>Codigo</titulo> <dato>cafiliado</dato> </columna> ... <xi:include href="afiliado_listado-campos.inc.xml" xpointer="xpointer(/columnas/*)"/> </columnas> </listado>
<columnas> <columna> <titulo>Tipo Doc.</titulo> <dato>dtipodocumento</dato> </columna> <columna> <titulo>Nro. Doc.</titulo> <dato>ndocumento</dato> </columna> <columna> <titulo>Fecha Nac.</titulo> <dato>ffechanac</dato> </columna> <columna> <titulo>Hab.</titulo> <tip>¿Habilitado?</tip> <dato>dhabilitado</dato> </columna> </columnas>
Request::ipOrigen()
y Request::trazaOrigen()
.es_ip_valido()
en funciones.php.$campos = array(..., array( 'nombre' => 'pfperiodo', 'etiqueta' => 'Período', 'nombre_desde' => 'pfinicio', 'etiqueta_desde' => 'Inicio', 'valor_desde' => $pfinicio, 'nombre_hasta' => 'pffin', 'etiqueta_hasta' => 'Fin', 'valor_hasta' => $pffin, 'tipo' => 'rangofechas' ), ...); Componentes::buscadorPersonalizadoSimple($campos, true, $objeto_conexion);Ejemplo XML:
<listado> ... <configuracion> ... <buscador> <personalizado-simple incluir-navegador="true"> ... <rangofechas nombre="periodo" etiqueta="Período" nombre-desde="pffechainicio" valor-desde="$pffechainicio" etiqueta-desde="Inicio" nombre-hasta="pffechafin" valor-hasta="$pffechafin" etiqueta-hasta="Fin"/> ... </personalizado-simple> </buscador> ... </configuracion> ... <consulta> ... <condiciones_de_parametros> <and> ... <lte> <param>pffechainicio</param> <col>ffechainicio</col> </lte> <gte> <param>pffechafin</param> <col>ffechafin</col> </gte> ... </and> </condiciones_de_parametros> </consulta> ... </listado>
iSeguridad
: puedeVerPagina()
.
Implementado en la clase Seguridad
.direccionAbsolutaPagina()
,
direccionSinConsulta()
, esDireccionInterna()
,
es_array_indexado()
, es_array_asociativo()
.Html::referenciaAnchor()
.fechaEnPeriodo()
, periodosSolapan()
y periodoSolapaPeriodos()
.Form::select()
y Form::select_multiple()
:
se estaba ignorando el valor del parámetro $clase.Form::select_multiple()
,
de 'Select'
a 'Select Multiple'
.@tipo='SeleccionableMultiple'
,
de 'Select'
a 'Select Multiple'
(en realidad la clase que se estaba generando en el XSL era 'ListSelect'
,
pero por el bug indicado dos puntos antes, en la página quedaba la clase por defecto, 'Select'
).Conexion.getTablas()
: $mascara
.Conexion
: getVistas()
,
referenciasEntrantes()
y estaSiendoReferenciado()
.estaSiendoReferenciado()
de la clase Conexion
; si se encuentra al menos una clave extranjera
que lo referencie, se deshabilita el botón "Borrar"./formulario/configuracion/@borrado-incondicional
./formulario/campos//campo/@solo-lectura
.
Si tiene valor 'true', el campo se presenta con edición deshabilitada.formulario/campos//campo/@ignorar-seleccionado
,
que se aplica cuando @tipo='Seleccionable'
.
Cuando es 'true', no se filtra el listado del seleccionable por el valor seleccionado./*/configuracion/volver/condicion
,
que permite indicar mediante código PHP si el botón debe incluirse en la página o no.Componentes::buscadorPersonalizadoSimple()
, para generar
un buscador personalizado simple para un listado./listado/configuracion/buscador/personalizado-simple
,
que permite definir fácilmente un buscador personalizado simple.<listado> ... <configuracion> ... <buscador> <personalizado-simple> <texto nombre="pafiliado" etiqueta="Afiliado" valor="$pafiliado" ancho="50"/> <texto nombre="pusuario" etiqueta="Usuario" valor="$pusuario" ancho="20"/> <calendario nombre="pfconsulta" etiqueta="Fecha de consulta" valor="$pfconsulta"/> <calendario nombre="pfrespuesta" etiqueta="Fecha de respuesta" valor="$pfrespuesta"/> </personalizado-simple> </buscador> ... </configuracion> ... </listado>
/formulario/campos//campo[@tipo='SoloLectura']/@ignorar-modificacion
.utilidades.js
:
comparacionTimestamps()
,
comparacionHoras()
,
comparacionFechas()
.antes_consulta
.Request
para trabajar específicamente con $_GET
o $_POST
, en vez de con $_REQUEST
.Mensaje::errorAplicacion()
: $pagina_simple
.crearDireccionPagina()
: $convertir_booleanos
.formulario/@pagina-simple
, que se aplica a formularios normales y masters.PARAMETRO_ESTRUCTURA_PAGINA_SIMPLE
)
se puede usar en formularios normales y masters.crearDireccionPagina()
: si la página actual es simple, el url que genera
incluye el parámetro para que la nueva página también lo sea.xgap_req_sinvolver
(booleano, constante PHP XGAP_REQUEST_SINVOLVER
)
en listados normales, páginas de contenido, formularios normales y masters,
para forzar que aparezca o no el botón "Volver"
("Cancelar" en el caso de formularios)./listado/configuracion/acciones/accion
:
accion/destino
, para permitir acciones que envíen a otra página, en vez de procesarse en la misma.accion/@clase
y accion/@imagen
, para personalizar la presentación del botón de la acción.accion/parametros
, dado que no se estaba aplicando correctamente; movido a accion/destino/parametros
.
Es decir, ahora se utiliza cuando la acción es accion/destino
, no cuando es accion/codigo
.request
" a las expresiones de condiciones_de_parametros
, para filtrar por variables del request. Por ejemplo:
<condiciones_de_parametros> <equal> <request>nusuario</request> <col>nusuario</col> </equal> </condiciones_de_parametros>
'recordset'
a @ubicación='despues_inicializacion'
en listados pdf, rtf, xls y csv./listado/columnas/acciones/accion
).Conexion::obtenerFila()
.XGAP_APP_TITULO
y XGAP_APP_COPYRIGHT
, con los valores de /aplicacion/titulo
y /aplicacion/copyright
en aplicacion.xml, disponibles en todas las páginas.#cont-cuerpo-pagina
, que envuelve el contenido y la barra de comandos #cont-comandos
.codificacion_cliente
, que permite indicar la codificación a usar en la parte cliente de las conexiones a la base de datos./formulario/campos/@foco-inicial
. Permite indicar el campo que debe tener el foco al cargar la página.prepararParametrosLogo()
,
que estaba embebida en el PHP generado, saliendo como código repetido, y se pasó a
funciones/funciones.php como preparar_parametros_imagen().
Además se
solucionó un bug en la función, que hacía que fallara si el nombre de la imagen
tenía una 'x'.MotorGeneracion::NOMBRE_DIRECTORIO_EXTRAS
y MotorGeneracion::NOMBRE_DIRECTORIO_MENUES
.MotorGeneracion::directorioOrigenAplicacion()
,
MotorGeneracion::directorioDestinoAplicacion()
y
$motorGeneracion->directorioMotor().
Form
: al generar un botón, si está deshabilitado se le agrega la clase CSS 'deshab';
por ejemplo, un botón para agregar deshabilitado se genera con el atributo class='ButtonAgregar deshab'.$onclick
a Html::link()
.Conexion::obtenerResultadoCompleto()
.tip
a las definiciones de columnas de listados, para incluir tooltips en los encabezados de la tabla.xgap_pagina_simple
.
param2boolean()
. Cualquier valor que evalúe como true
produce una página simple.PARAMETRO_ESTRUCTURA_PAGINA_SIMPLE
, definida en estructura.inc.php.@pagina-simple
en el XML.usuario_listado.php?xgap_historial=reset&xgap_pagina_simple=true
css_menu_details
. Se usa para indicar un CSS a cargar en un formulario master, cuando existe un menú de details.nombre_archivo_saneado()
.nombre_archivo_saneado()
.Mensaje
: Agregado parámetro $mensaje_debug
a los métodos mensajeHtml()
, error()
, alerta()
, notificacion()
e info()
, para pasar un mensaje que se muestra solamente cuando el entorno no es de producciónForm
: agregado parámetro $propiedades_extra_opciones
a select()
; agregados parámetros $imagen
y $onclick
a agregar_boton_accion_listado()
Html
: agregados métodos saltoLinea()
, arrayJavascript()
, mapaJavascript()
y arrayDeMapasJavascript()
PREFIJO_PARAMETRO_XGAP
, que indica el prefijo para los parámetros del request que son propios de XGAPesParametroXgap()
y existeParametroXgapEnRequest()
(funciones.php)scripts/utilidades.js
: serialize_string_array()
, establecerPropiedadesEnObjeto()
y establecerPropiedadesEnObjetos()
inicio_pagina
.datos_adicionales/correspondencia
se tomaba @origen
en vez de @destino
como nombre de columna de la tabla relacionada.NOMBRE_INDICE
, definida en xgap.php./*/seguridad/descripcion
), con una lista de dichos archivos.mensajesError(array)
a la clase Componentes
.Html
:
comentarioCondicional()
.Html::head()
para que permita indicar la versión
de navegador a que se deben aplicar los CSSs.css_ie6
y css_ie7
,
que permiten indicar archivos CSS que sólo se deben aplicar a Internet Explorer.paginaInicio()
.icono_aplicacion
,
pagina_copyright
y pagina_about
.$relativa_a
a la función
crearDireccionPagina()
.<div id="titulo-pag"><span>texto del titulo</span></div>
'c-buscador'
,
'c-navegador'
y 'pie-buscador'
;
se elimina la tabla con ID 'tabla_buscador'
y las celdas con clase
'BuscadorTD'
y 'NavegadorTD'
./* Contiene el buscador estándar */ #c-buscador { float: left; } /* Contiene el navegador */ #c-navegador { float: right; margin-left: 10px; } /* Permite cancelar el float de #c-buscador y #c-navegador */ #pie-buscador { clear: both; height: 0; margin: 0; padding: 0; visibility: hidden; }
<checkbox> <nombre>cpaciente_imprimir</nombre> <controlSeleccionTodos/> <funcion-habilita> <![CDATA[ global $objeto_conexion,$rs,$j; if ($objeto_conexion->obtenerResultado($rs,$j,'chistclinica')!='004236732') return true; return false; ]]> </funcion-habilita> <funcion-estado-inicial> <![CDATA[ global $j; if ($j%2==0) return true; return false; ]]> </funcion-estado-inicial> </checkbox> <combo> <nombre>cpaciente_sexo</nombre> <texto-para-nulo>No Procesar</texto-para-nulo> <consulta> <tabla>traduccion</tabla> <valor>cvalor</valor> <etiqueta>dvalortraducido</etiqueta> <where>cnombre='SEXO'</where> </consulta> <funcion-habilita> <![CDATA[ global $objeto_conexion,$rs,$j; if ($objeto_conexion->obtenerResultado($rs,$j,'chistclinica')!='045393191') return true; return false; ]]> </funcion-habilita> </combo>
$verificador_version = VerificadorVersion::crearVerificadorVersion(); $configuracion = $verificador_version->recuperarConfiguracion(); $prefijo_directorio = $configuracion->recuperarParametro('prefijo_directorio'); $prefijo_web = $configuracion->recuperarParametro('prefijo_web');debajo de la línea://if (!file_exists("configuracion.ini")) // die("index.php: no se encuentra el archivo de configuracion"); //$params= $verificador_version->recuperar(); //$_SESSION['path_configuracion'] = realpath("configuracion.ini");
require_once("verificadorversion.inc.php");
<listado> <salidas> <normal /> <seleccion /> </salidas> </listado>
<formulario> <salidas> <normal /> </salidas> </formulario>
<depende> <campo referencia="codigo_pais">codigo_pais</campo> </depende>
<codigo anterior="si" tipo="JAVASCRIPT"> function controlarDependencias(){ document.getElementById('codigo_provincia_fila').style.display = (document.formulario.codigo_pais.value!='') ? '' : 'none'; } setInterval(controlarDependencias,50); </codigo>