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_permanentescolumnas/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-seguiriSeguridad::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=truecss_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');
//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");
            debajo de la línea:
            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>