Unofficial Content

Templates

Patterns es una herramienta que está basada en templates (archivos dkt). Esto es que en base a las instancias generadas, a la aplicación de ciertos archivos de configuración y a ciertos templates, se generan los archivos xpz que se podrán consolidar en GX para generar más objetos GX.

Los template mezclan código C# con el lenguaje KMW que se utiliza en GX, de esa forma el texto de salida que se produce (xml correspondiente al xpz) tiene código copiado directamente desde el template y código xml generado por las sentencias C#.

Si se visualiza el código de un template se puede ver algo como lo siguiente:

Imagen7

Aquí se puede ver que se está generando un Case para ser colocado en el xpz, y se pueden distinguir dos componentes:
El código que está entre <% y %> es código C#, por ejemplo <%=icAtt.Name%>, en ese caso se sustituye ese trozo por el valor de la variable en ese momento.
O el resultado de procesar con el foreach ?
Lo que está fuera de los signos <% y %>, es código GX, se copia directamente al xpz.

Template engine

Es un programa que procesa un texto de entrada (instancia, formato xml) y produce otro texto, en el caso de patterns es un xpz (archivo xml).

En resumen:
KMW - GeneXus (output)
C# (processing)

De esta forma, a partir de la KB, de la generación de las instancias y de los archivos de configuración, aplicando los templates, se obtienen las definiciones de los objetos GX que se desean consolidar en la nueva versión de la KB.

Imagen8

Como dijimos hasta ahora, para generar una instancia asociada a un objeto, basta con dar doble click sobre el objeto y en ese momento se utiliza el programa configurado en la propiedad DefaultGenerator (que por defecto tiene el valor GXPatterns.WorkWith.WorkWithGenerator) para generar la instancia por defecto.
Una vez que la(s) instancia(s) están prontas para ser procesadas, al dar F5 desde Patterns (opción Build\Apply and Consolidate) es cuando se comienza el proceso de instanciación, en este proceso se ejecutan los siguientes pasos.

Por cada instancia que se tenga:

  • Se genera un xml (que representa el xpz correspondiente a esa instancia)
  • El xpz mencionado contiene todos los objetos que se consolidarán en GX asociados a la instancia mencionada
  • Se genera un único xpz con todos los xml de las instacias
  • Se consolida el output.xml.xpz en la KB obteniéndose la versión 2 de la KB

Imagen9

El primer paso (generar los xml de cada una de las instancias) lo hace el template engine, el segundo paso (generar un solo xpz) lo hace directamente la tool.

El proceso de template engine es el que se encarga de tomar una instancia y aplicarle un template para generar a partir de ella un xml (xpz) con todos los objetos.
Además de los dkts para realizar este proceso se utilizan algunas dlls auxiliares.

Para cada pattern hay un dkt que se encarga de realizar estas acciones y a partir de él se llaman al resto, en el caso del pattern Work With se usa el ViewGenerator.dkt.
Para indicar cuál es el dkt a usar, se configura la propiedad Build Information\GeneratorFilename del Pattern.Definition.

Imagen10

Este template utiliza varios subtemplates, por ejemplo en el ViewGenerator.dkt están las siguientes líneas:

<%@ SubTemplate Name="ViewTemplate" File="ViewTemplate.dkt" %>
<%@ SubTemplate Name="GridTemplate" File="GridTemplate.dkt" %>
<%@ SubTemplate Name="TabularTemplate" File="TabularTemplate.dkt" %>
...................................................................................

 Aqui se indica que subtemplate se usarán.
Hay algunos templates importantes y mencionamos especialmente (aunque los nombres son bastante descriptivos y es fácil saber que genera cada uno):

GridTemplate.dkt
Generar toda la información de los work with, grids, prompts

ViewTemplate.dkt
Generar toda la información de los views

TabularTemplate.dkt
Generar toda la información referente al componente General que se usa en los Views

WWTransaction.dkt
Generar toda la información de las TRNs.

Dentro del template también se utilizan algunas dlls (assemblies), que ayudan a la generación del xml.
En el ViewGenerator.dkt se usan:

<%@ Assembly Name="GXKnowledgeBase" %>
<%@ Assembly Name="WorkWith" %>
<%@ Assembly Name="TemplateHelpers" %>
...................................


La GXKnowledgeBase.dll y la TemplateHelpers.dll ayudan a recorrer la KB y a la generación del xml, en particular estas dlls ayudan en la generación de variables, generación de controles, etc.
Estas dlls son genéricas para cualquier pattern.
En el Documentation.chm se encuentra la documentación asociada de estos programas.

También dentro del template se utiliza la WorkWith.dll ya que dentro de esta dll se encuentran varias rutinas para generar partes de los objetos.
Si se visualizan los fuentes de la WorkWith.dll se puede ver que dentro del GXPatternsSources hay un directorio WorkWith\Helpers, en ese directorio se encuentran varios cs que son los auxiliares mencionados antes.

Por ejemplo el PagingButton.cs es el fuente que genera el código en el xpz para generar los botones de paginación.
En el GridTemplate.dkt se puede ver que se hace referencia a esta rutina:

private string PagingButtons(ArrayList buttons)
{
 string r = "";
 foreach (PagingButton button in buttons)
  r += button.ToHtmlImage();
 return r;
}

Y en el PagingButton.cs se tiene:

public string ToHtmlImage()
  {
   return HtmlToKmw.Image(Name, GlobalWorkWithConfig.Config.Theme("Image"), m_Caption, GlobalWorkWithConfig.Config.ImagePath() + Image) + "\r\n";
  }

De esta forma se devuelve el código para generar el trozo de xpz de los botones.

Otra rutina interesante que se encuentra dentro de la workwith.dll es la IsLastInstance.
Al dar F5 también se controla si es necesario o no generar en el xpz los objetos que se consolidarán una sola vez (list programs, recent links, etc.)
Esta rutina es la que controla si se tienen que generar estos objetos o no, como estos objetos van una sola vez se generan en la última instancia.

Más información sobre otros templates:

 

Last update: February 2024 | © GeneXus. All rights reserved. GeneXus Powered by Globant