Descargar - K2BTools

Transcripción

Descargar - K2BTools
Manual de usuario 1.0
K2BWebPanelBuilder Beta1
1
Introducción: ______________________________________________________ 3
2
Pautas previas: _____________________________________________________ 3
2.1
Pautas previas antes de la aplicación K2BWebPanelBuilder _________________ 3
2.2
Funcionamiento de la herramienta ______________________________________ 3
2.2.1
2.2.2
2.2.3
2.2.4
2.3
2.3.1
2.3.2
2.3.3
2.3.4
3
Variables ________________________________________________________________ 4
Eventos _________________________________________________________________ 5
Rules ___________________________________________________________________ 7
WebForm ________________________________________________________________ 7
Nomenclatura del WebPanel Builder ____________________________________ 8
Variables ________________________________________________________________ 8
Eventos _________________________________________________________________ 8
Rules ___________________________________________________________________ 8
WebForm ________________________________________________________________ 8
Lenguaje de especificación de los WebPanels ____________________________ 9
Nodo WebForm __________________________________________________________________ 9
Nodo Grid _____________________________________________________________________ 10
4
Avanzado ________________________________________________________ 14
4.1
Modificación de la interfaz ____________________________________________ 14
1
2
1 Introducción:
K2BWebPanelBuilder fue creado con el objetivo de poder desarrollar aplicaciones
WEB más rápido, escalables, de fácil mantenimiento y propagación de cambios. Desde
el punto de vista del desarrollador la herramienta permite abstraerse de complejidades
inherentes al diseño de los WebPanels presentes en Genexus, de esta forma puede
enfocarse en la parte funcional de su aplicación dado que los problemas comunes en el
desarrollo son solucionados por el patrón.
La idea del web panel builder es poder generar y mantener desde un nivel de abstracción
mayor, aquellas pantallas que no tienen porqué cumplir con el patrón workwith. Mediante
el uso del web panel builder el desarrollador, no debería trabajar más en el web form de
los web panels sino especificar este en un nivel de abstracción superior.
Para una guía de uso rápido de esta herramienta, recomendamos en la sección
capacitación -> descargas, descargar el taller de las k2btools, en la que se encuentra un
ejercicio que explica paso por paso la construcción de un panel usando esta aplicación.
2 Pautas previas:
En esta sección se presentarán las consideraciones a tener presentes antes de comenzar a
utilizar la herramienta.
2.1 Pautas previas antes de la aplicación K2BWebPanelBuilder
Dado que la herramienta es una extensión de Genexus X Evolution 1, esta debe ser
instalada sobre dicha versión de Genexus.
Se recomienda que la propiedad Dynamic K2B Web Form Pattern Update sea seteada en
No. De esta forma el pattern se comportará mas estilo diseñador y se actualizara
solamente al salvar el objeto si la casilla Apply this pattern on save esta seleccionada.
2.2 Funcionamiento de la herramienta
Consideraciones más importantes a tener en cuenta antes de empezar a utilizar la
herramienta:
3
1) El pattern actualmente no genera ningún objeto, solamente actualiza el WebPanel
al que se le aplica el patrón. Notar que se comporta como una parte nueva del
WebPanel, en el futuro se podrá cambiar a extensión.
2) Las partes del WebPanel que hacen uso del WebPanelBuilder son mantenidas
tanto por el patrón como por el usuario. El WebFom es la única parte que hasta el
momento es mantenida únicamente por el editor. Esto implica que el usuario
puede agregar sus propios eventos, variables, subrutinas, reglas del WebPanel
siempre y cuando las mismas cumplan con la nomenclatura adecuada (ver
Nomenclatura WebPanelBuilder).
a. WebForm: será sobrescrito en caso de ser necesario cada vez que se
aplique el patrón. Por lo tanto la única forma de agregar contenido al
WebForm del WebPanel es mediante su especificación en la instancia del
patrón.
b. Eventos: se pueden agregar subrutinas, eventos de usuario, agregar
comentarios; modificar la posición, lugar u orden de los eventos y
subrutinas; etc. En caso de modificar una subrutina o evento perteneciente
al editor (ver nomenclatura), al salvar el objeto esos cambios no tendrán
efecto en el WebPanel, es decir se sobrescribe los eventos pertenecientes
el editor (ya sean de Internos o del Editor).
3) Las propiedades del WebPanel se modifican directamente en el mismo, un
ejemplo de esto sería cambiar la propiedad Type a Component para que pueda ser
utilizado como WebComponent o setearle un tema de usuario son algunos
ejemplos. La única propiedad forzada por el patrón es la propiedad Automatic
Refresh la cual se modifica a No.
4) El editor genera una cantidad importante de comentarios de ayuda al usuario de
cómo trabajar con la herramienta, en el futuro esto se podrá configurar para no
generar dichos comentarios.
2.2.1 Variables
Como se ha mencionado anteriormente las variables son mantenidas tanto por el editor
como por el usuario.
Que sean mantenidas por el editor significa que el editor agrega, modifica y borra
variables a partir de la metadata que especifican los componentes del WebPanel.
El editor maneja tres tipos de variables: variables del editor, variables internas, variables
de usuario.
4
Variables del Editor: Son mantenidas por el editor y su nombre siempre comienza con
E_. El usuario puede hacer referencia a estas variables y modificar su valor. Puede ocurrir
que la variable esté referenciada por un evento de usuario y el editor intente borrarla
dado que la especificación que la generaba se eliminó. En este caso el objeto no salvará y
habrá que eliminar la referencia de forma manual. Este caso y otros casos similares van a
ser contemplados en futuras versiones, dando la posibilidad al desarrollador a mantener la
variable, borrar el fragmento de código que referencia la variable o comentarlo.
Variables Internas: También son mantenidas por el editor, a diferencia de las anteriores,
el usuario no puede modificar su valor. El nombre siempre posee I_ como prefijo.
Un ejemplo de este tipo de variable es I_HasNextPage la cual determina si una grilla
tiene una pagina siguiente y luego es utilizada por el editor para determinar si es visible el
botón de next page asociado a una grilla. Otro ejemplo podría ser I_GridLoadCount la
cual lleva un conteo de la cantidad de registros cargados en una grilla, variable que puede
ser consultada por el usuario pero no modificada.
Variables de Usuario: Son creadas, modificadas y eliminadas exclusivamente por el
desarrollador. En la mayoría de los casos van a ser variables destinadas a lógica de
negocio. El diseñador intenta minimizar la definición de estas variables ofreciendo un
conjunto de variables de ayuda para tareas comunes en el diseño de un WebPanel.
Es importante aclarar que estas variables no pueden comenzar con I_ ni con E_ en dicho
caso el editor las considerará como internas o del Editor y las eliminará.
2.2.2 Eventos
El patrón intenta generar la mayor parte de los eventos del WebPanel, dejando algunas
subrutinas y eventos para que el usuario las programe.
Existen tres tipos de bloques de código que el diseñador reconoce:
Eventos y Subrutinas de Editor: Son eventos mantenidos por el editor que
normalmente invocan a algún método de usuario para extender o cambiar su
funcionamiento.
Algunos ejemplos sencillos de estos eventos pueden ser el evento Start, refresh, Load de
Grillas, Eventos que atienden las acciones en grilla, acciones de paginado, evento Search,
eventos de acciones Standalone etc. Además de los eventos anteriores todos los que su
nombre comience con E_ pertenecen a esta categoría.
También dentro de este grupo encontramos subrutinas que son de ayuda para el
programador, la tendencia es que a medida que se siga desarrollando la herramienta
existan mas de estas subrutinas facilitando el trabajo al desarrollador. Estas últimas en
lugar de invocar a subrutinas de usuario (como lo hacen los eventos del editor en la
mayoría de los casos) deben ser invocadas por código del desarrollador.
5
Un ejemplo de este tipo de subrutinas puede ser las dos subrutinas siguientes que el
diseñador crea cuando se tiene multirrow en una grilla (acción asociada a una grilla):
Sub 'E_ResetMultirowIterator(CountryGrid)'
&I_MRowIterator_CountryGrid = 1
EndSub
Sub 'E_GetNextMultirow(CountryGrid)'
&E_MRowHasNext_CountryGrid = False
&I_MRowCurrentIndex = 1
For Each line in CountryGrid
If &E_CountryGrid_Item_Selected = True
If &I_MRowCurrentIndex = &I_MRowIterator_CountryGrid
&I_MRowIterator_CountryGrid += 1
&E_MRowHasNext_CountryGrid = True
exit
EndIf
&I_MRowCurrentIndex += 1
EndIf
EndFor
EndSub
Estos métodos son utilizados para iterar sobre las filas seleccionadas de una grilla.
Cuando el desarrollador agrega una acción MultiRow que se encuentre bajo el nodo Grid
el diseñador genera automáticamente las subrutinas descriptas arriba, además genera el
procedimiento
Event 'E_ViewCountriesCitiesMultirow' que atiende al evento click y la subrutina de
usuario 'U_ViewCountriesCitiesMultirow' en la cual el desarrollador podrá poner su
código específico y funcional para realizar un comportamiento específico (invocar a un
procedimiento, habilitar o deshabilitar controles, cambiar registros en la base de datos,
modificar cualquier estado, etc).
Notar que el desarrollador no se preocupa en la seguridad de la acción, ni en validar que
realmente se haya seleccionado alguna fila, esta tarea es realizada por el diseñador y en
caso de cambiar la propiedad MultiRow de la acción a single, cambiar la seguridad de la
acción o otra configuración se actualizará automáticamente dicho evento.
Event 'E_ViewCountriesCitiesMultirow'
// ---- K2BTools - Do Not Change, Editor Method ---Do 'E_ResetMultirowIterator(CountryGrid)'
Do 'E_GetNextMultirow(CountryGrid)'
If &E_MRowHasNext_CountryGrid = False
msg("Error : Debe seleccionar alguna línea")
Else
Do 'E_ResetMultirowIterator(CountryGrid)'
Do 'U_ViewCountriesCitiesMultirow'
EndIf
EndEvent
6
Sub 'U_ViewCountriesCitiesMultirow'
// ---- K2BTools - To Be Completed By User ---// Do 'E_GetNextMultirow(CountryGrid)'
// Do While &E_MRowHasNext_CountryGrid = True
//
<Specific User Code, you can use all grid variables
and attributes>
//
Do 'E_GetNextMultirow(CountryGrid)'
// EndDo
EndSub
Eventos y Subrutinas de Usuario (creadas y mantenidas por el diseñador, el usuario
tiene total control sobre su contenido):
El diseñador generará un conjunto de subrutinas para que el desarrollador agregue su
propio código y brindarle flexibilidad en sus soluciones, estas subrutinas poseen U_
como prefijo del nombre.
Por ejemplo para cada grilla el diseñador genera y mantiene el código del Load y para
cada registro a cargar invoca la subrutina Do 'U_LoadRowVars(<GridName>)' la cual se
puede utilizar para realizar diversas tareas como, sumar todos los valores de alguna
columna de la grilla para calcular algún total, modificar la variable a cargar en la grilla,
cancelar la carga de una línea o registro, salir de la carga de la grilla, etc.)
Eventos y Subrutinas creados y mantenidos por el usuario
Estos eventos o subrutinas que son definidos por el usuario, el diseñador los dejara en su
lugar y forma correspondiente cuando se generen las demás secciones de los eventos.
2.2.3 Rules
El patrón actualmente no genera ninguna regla. El usuario puede hacer los cambios que
considere necesarios.
2.2.4 WebForm
Esta parte es totalmente actualizada por el patrón. Cualquier cambio que el usuario
realice se sobrescribirá cuando se aplique el patrón.
7
2.3 Nomenclatura del WebPanel Builder
2.3.1 Variables
Variables del Editor: Poseen el prefijo E_ en el nombre
Variables Internas: Poseen el prefijo I_ en su nombre
Variables de usuario: Son variables que no se corresponden a ninguna de las dos
anteriores.
2.3.2 Eventos
Eventos o Subrutinas del Editor:
Poseen el prefijo E_, también incluye los eventos Start, Refresh, Load de grillas, e
eventos que comienzan con nombres de variables internas (&I_ como prefijo, ejemplo
&I_OrderedBy_GridX.IsValid).
Eventos o subrutinas de Usuario:
El nombre asociado a estos eventos comienza con U_, es decir posee U_ como prefijo.
Eventos o Subrutinas Nuevos:
Subrutinas que no están abarcadas en ningún caso anterior.
2.3.3 Rules
Actualmente el WebPanelBuilder no especifica ninguna regla.
2.3.4 WebForm
Los contoles del webForm siguen los mismos lineamientos que las variables con la única
diferencia que actualmente todos los controles son mantenidos por el patrón.
Controles de Editor: Poseen el prefijo E_ en el nombre.
Controles Internos: Poseen el prefijo I_ en su nombre.
8
3 Lenguaje de especificación de los WebPanels
El lenguaje de especificación tiene una estructura de árbol. Una instancia de este árbol
abstrae la definición del WebForm (la cual se puede ver naturalmente en el árbol),
además a partir de una instancia se genera gran parte del código de los eventos (explicado
más adelante) y la mayor parte de las variables presentes en el WebPanel.
Nodo WebForm
En la raíz está presente el nodo WebForm, el cual permite la configuración de
propiedades generales del WebPanel.
La propiedad Title se puede utilizar para agregar un título. En caso de que esta propiedad
se encuentre vacía el diseñador no agregará dicha sección al webForm.
NeedErrorViewer es usada para indicar cuando no se requiere tener en el webpanel un
control error viewer, esto se puede dar por que no se necesite o por que el
WebComponent que se está diseñando estará contenido en otro objeto que si contenga
una sección para mostrar mensajes en pantalla.
Para configurar la seguridad de acceso al objeto se puede hacer uso de la propiedad
ActivityName. En caso de setearle un nombre a la propiedad se generará el siguiente
código en el evento Start.
Del nodo raíz se tiene como hijos los nodos Attributes, Grid, QueryObject,
WebComponent los cuales se pueden utilizar para agregar información de la aplicación
al WebPanel y los nodos Columns, LineSeparator, Group que son de utilidad al
momento de darle formato y diseño al HTML.
9
Nodo Grid
Para especificar grillas se utiliza el nodo Grid, en este nodo se determinan los filtros
(nodo Filters), ordenes (nodo Orders), condiciones de carga de usuario (nodo
Conditions), acciones (nodo Actions). Los ítems de la grilla como atributos, variables y
acciones se especifican bajo nodo Columns.
El editor soluciona problemas comunes que se dan en el momento agregar grillas en un
WebForm: agregar la grillas con sus atributos y/o variables en el formulario, el combo
con los ordenes, los controles de paginado, el botón de búsqueda, eventos de paginado,
eventos de carga de la grilla, condiciones de carga, inicializar las variables, acciones y
links, etc.
Las propiedades del nodo Grid son:
Name: Nombre de la Grilla debe ser único dentro del conjunto de grillas y controles que
se especifican para el WebPanel. El diseñador a partir de la grilla genera un conjunto de
variables para resolver el paginado, los filtros, órdenes y otras problemáticas asociadas a
la grilla.
Theme: Tema de la grilla.
Page: Máxima cantidad de registros que se pueden cargar en la grilla.
DefnedBy: En caso de grillas sin tabla base se puede especificar atributos para determinar
la navegación. (Únicamente utilizado en grillas “Grillas con ForEach inferido sin Tabla
Base”.)
10
Existen tres clases de grillas:
• Grillas con tabla base.
• Grillas sin tabla base en las cuales se puede inferir un foreach para el evento load
• Grillas sin tabla base.
3.1.1.1 Grillas con tabla Base
Son todas aquellas grillas que poseen al menos un atributo en la grilla (dentro del nodo
Columns).
3.1.1.2 Grillas con ForEach inferido sin Tabla Base
En caso de tener algún orden, alguna variable bajo el nodo Filtres con la propiedad
Condition seteada o alguna variable en grilla basada en un atributo y además que tenga
la propiedad LoadFromAttribute = True el for each de la grilla será generado
automáticamente como se muestra a continuación.
11
Este tipo de grillas pueden contener variables que no pueden ser inferidas, ya sea por que
tenga la propiedad LoadFromAttribute = False (basada en atributo) o por que no este
basada en un atributo. En este caso se tendrá que brindar al desarrollador la posibilidad de
cargar dichas variables, para esto el editor genera el método
‘U_LoadRowVars(<GridName>)’ adonde el desarrollador puede escribir su código
particular y pueda modificar el comportamiento de la carga de la grilla. Este método se
invoca para cada registro a cargar perteneciente al foreach, antes de invocar el evento se
setean las variables:
&I_GridLoadCount += 1
&E_GridLoadRow = True
La primera se utiliza para contar los registros que se cargan, como se puede apreciar es
una variable interna por lo cual el usuario puede consultar su valor pero no modificarla.
La variable E_GridLoadRow es del editor y por lo tanto el usuario puede modificar su
valor, en caso de setearla en false el registro no se cargara. Esta variable puede ser de
utilidad para realizar filtros complejos de carga. Notar que antes de invocarse el método
el editor la setea en true, por lo que no necesita ser asignada nuevamente si se quiere
cargar el registro.
Sub 'U_LoadRowVars(CityGrid)'
12
//
//
//
//
//
---- K2BTools - To Be Completed By User ---&I_GridLoadCount - 1: Number of record loaded in grid (Do not
change variable value)
&E_GridLoadRow: Set to False when you don't want to load
current record
EndSub
Todo el código y la interfaz referente al paginado, órdenes y filtros son totalmente
generados por el editor.
A continuación vemos ejemplo de la generación de este código para este tipo de
grilla:
13
3.1.1.3 Grillas sin tabla Base
Este tipo de grilla ocurre cuando no se tiene ningún attributo en grilla (nodo columns) o
por que no se pudo inferir un foreach desde la especificación de la misma. En estos casos
el editor intenta subsanar los problemas de carga de la grilla, paginado, etc, mediante el
siguiente evento load:
Event CountryGrid.Load
// ---- K2BTools - Do Not Change, Editor Method ---&I_GridLoadCount = 0
&I_HasNextPage = False
&E_Exit = False
Do While True
&I_GridLoadCount += 1
If (&I_GridLoadCount > 10 * &E_CountryGrid_CurrentPage)
&I_HasNextPage = True
exit
EndIf
Do 'U_LoadRowVars(CountryGrid)'
If (&E_Exit = True)
exit
EndIf
If (&I_GridLoadCount > (10 * (&E_CountryGrid_CurrentPage 1)) and &I_GridLoadCount <= (10 * &E_CountryGrid_CurrentPage))
Load
EndIf
EndDo
Do 'E_UpdateControls(CountryGrid)'
EndEvent
Como se puede apreciar en el evento se realiza un Do While en el cual se controla la
carga de la grilla para esto el evento load mantenido por el diseñador invoca la subrutina
'U_LoadRowVars(<GridName>)' en la cual se deberá cargar las columnas de la misma.
Para terminar la carga se deberá setear la variable &E_Exit a true, en caso de no setear
esta variable la ejecución entrara en un loop infinito.
4 Avanzado
4.1 Modificación de la interfaz
Dado que la interfaz generada no tiene un formato estándar (es decir depende fuertemente
de la especificación y de que controles estén presentes), no se pudo desarrollar el mismo
mecanismo (objeto layout) presente en los otros patrones para modificar la interfaz.
14
Dada esta limitante y la necesidad de customizar la interfaz se brinda otro mecanismo,
que está basado en dkt’s. Para esto el generador invoca un dkt antes y otro después de la
construcción de ciertas regiones de la UI.
Cada dkt recibe como parámetro el nodo de la instancia a generar (grilla, filtros ,
webComponent, embedded page, etc) como se muestra a continuación:
<%@ Property Name="PatternInstanceElement"
Type="Artech.Packages.Patterns.Objects.PatternInstanceElement" %>
En el mismo se pueden importar los dll (ensamblados) que sean pertinentes y utilizar los
namespace (espacio de nombres) deseados.
La idea de los dkt (Before… y After…..) es generar HTML que contenga una sección
específica.
Como ejemplo se mostrará como se crea el contenedor a la sección de filtros de las
grillas.
<%@ Template Language="C#" TargetLanguage="GX" Description="Before Grid
Filters" %>
<%@ Property Name="PatternInstanceElement"
Type="Artech.Packages.Patterns.Objects.PatternInstanceElement" %>
<div class="Section_FiltersHeader" >
<%= WebForm.TextBlock(String.Empty, "TextBlock_FilterTitleED",
"Filters") %>
</div>
<div class="Section_Filters">
Se puede observar que en el primer div se agrega un textblock con caption Filters y
theme TextBlock_FilterTitleED.
Luego se abre otro div el cual contendrá la seccion de filtros generada por el diseñador (el
segundo tag html <div>), que se deberá cerrar el dkt AfterGridFilters, como vemos a
continuación:
<%@ Template Language="C#" TargetLanguage="GX" Description="After Grid
Filters" %>
<%@ Property Name="PatternInstanceElement"
Type="Artech.Packages.Patterns.Objects.PatternInstanceElement" %>
</div>
Los dkt’s se pueden encontrar en la carpeta
<genexusDir>\Packages\Patterns\K2BWebForm\Templates, la nomeclatura de
los mismos es Before<ComponenteInterfaz>.dkt y
After<ComponenteInterfaz>.dkt.
15
16

Documentos relacionados