Libro de Kamila 1.0.1 yiyi 2009 Universidad Centroocidental
Transcripción
Libro de Kamila 1.0.1 yiyi 2009 Universidad Centroocidental
Libro de Kamila 1.0.1 yiyi 2009 Universidad Centroocidental Lisandro Alvarado Decanato de Ciencias y Tecnología Departamento de Sistemas Área de Laboratorios Libro de Kamila Framework Versión 1.0.1 ... En honor a mi hija Camila S. Gonzalez A. Autor: Prof. Edgar Gonzalez [email protected] 1 Libro de Kamila 1.0.1 yiyi 2009 Instalación de KAMILA Para usar el framework de Kamila éste funciona sobre una distribución Linux como: Kubuntu 8.04 ó mayor, Ubuntu 8.04 ó mayor, Debian 3.0 o mayor. Luego de instalado dicha distribución, se debe instalar el servidor Web Apache2 versión 2.2.8 ó mayor a través del programa adept ó synactic los siguientes paquetes a instalar son: apache2, apache2-mpm-prefork, apache2-util, apache2.2-common. Luego instalar el lenguaje ruby, para ello los paquetes necesitados son: eruby, irb1.8, libapache-ruby1.8, libcairo-ruby1.8, libapache2-mod-ruby, libatk1-ruby, libdbd-mysql-ruby1.8, libdbd-pg-ruby1.8, libdbi- ruby1.8, liberuby, libgdk-pixbuf2-ruby1.8, libgems-ruby1.8, libglib2ruby1.8, libgtk2-ruby1.8, libmysql-ruby1.8, libodbc-ruby1.8, libopensslruby1.8, libpango1-ruby1.8, libpgsql-ruby1.8, libqt0-ruby1.8, libqt4ruby1.8, libreadline-ruby1.8, librmagick-ruby1.8, librmagick-ruby, librmagick-ruby-doc, libruby1.8, libxml-ruby1.8, libzip-ruby.1.8, rdoc, rdoc1.8, rmagic, ruby, ruby1.8, ruby1.8-dev. Después, para cumplir el estándar de web: http://DNS ó IP /Sitio Web/controlador/accion/parámetros, se agregó el módulo rewrite al servidor web apache, a través del comando en una consola del sistema operativo como super usuario de la siguiente forma: # a2enmod rewrite 2 Libro de Kamila 1.0.1 yiyi 2009 Luego de instalar el mod_rewrite habilitamos para la carpeta de publicación de apache2: /var/www el uso de éste módulo Ubica el archivo : /etc/apache2/sites-enabled/000-default ó /etc/apache2/sites-enabled/default Busca la línea para el directorio: /var/www donde dice: AllowOverride None y cambiar por: AllowOverride All y reinicias el apache con: # /etc/init.d/apache2 restart Esto le permite al Apache hacer rediccionamientos de URLs según lo indique el archivo: .htaccess. El archivo .htaccess debe residir en la carpeta raíz del framework y su contenido es el siguiente: # Permitir ejecución de scripts CGI y no presentar indice de directorios Options +ExecCGI -Indexes <IfModule mod_rewrite.c> # Configuración del Framework Kamila RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #RewriteRule ^(.*)$ public/ [L,QSA] RewriteRule ^(.*)$ index.rhtml [QSA,L] # Descomentar alguna regla, si deseas desactivar # alguna carpeta del Framework Kamila #RewriteRule ^(controllers)/$ - [F] #RewriteRule ^(models)/$ - [F] #RewriteRule ^(views)/$ - [F] </IfModule> 3 Libro de Kamila 1.0.1 yiyi 2009 Donde podemos resaltar la expresión regular o regla RewriteRule ^(.*)$ index.rhtml [QSA,L], donde del módulo rewrite de Apache2, redireccionará cualquier dirección url que involucre el sitio web (Kamila) a la página index.rhtml que se encuentra en la raíz de Kamila. Para configurar el apache y reconozca e interprete el código ruby en los archivos con extensión *.rhtml se debe hacer lo siguiente: Crear el archivo ruby.load con el siguiente contenido: LoadModule ruby_module /usr/lib/apache2/modules/mod_ruby.so Crear el archivo ruby.conf con el siguiente contenido: # Agregar el modulo ruby para apache2 <IfModule mod_ruby.c> AddType text/html .rhtml DirectoryIndex index.rhtml RubyRequire apache/ruby-run RubyRequire apache/eruby-run #RubyRequire apache/ruby-debug RubySafeLevel 0 RubyTimeOut 60 # Handle *.rhtml files as eRuby files <Files *.rhtml> SetHandler ruby-object RubyHandler Apache::ERubyRun.instance #RubyHandler Apache::ERubyDebug.instance </Files> </IfModule> # fin del modulo ruby Copiar los archivos ruby.load sino existe y ruby.conf al directorio: /etc/apache2/mods-available 4 Libro de Kamila 1.0.1 yiyi 2009 Posicionarse en: /etc/apache2/mods-enabled Crear un enlace simbolico como super usuario: # ln -s /etc/apache2/mods-available/ruby.conf ruby.conf # ln -s /etc/apache2/mods-available/ruby.load ruby.load (sino existe) y luego se debe restaurar el servicio de apache2: # /etc/init.d/apache2 restart Después se debe instalar través de adept o synatic, el servidor de base de datos MySQL y los paquetes que se necesitan son: libmysqlclient15off, mysql-client-5.0, mysql-common, mysql-gui-toolscommon, mysql-query-browser, mysql-server-5.0. Luego se debe instalar las siguientes librerías para ruby: Descargar desde: http://rubyforge.org el archivo: rubygems1.0.1.gz o de seducla Extraer como super usuario el archivo: rubygems-1.0.1.gz posicionarse en la carpeta: rubygems-1.0.1 y ejecutar: # ruby setup.rb Como super usuario posicionarse en: /usr/bin y renombrar el archivo gem1.8 a gem # mv gem1.8 gem Instalar como super usuario los siguientes librerías que puedes buscar y descargar en: http://rubyforge.org : # gem install rubyforge-0.4.5.gem # gem install session-2.4.0.gem # gem install abstract-1.0.0.gem # gem install erubis-2.5.0.gem 5 Libro de Kamila 1.0.1 yiyi 2009 # gem install tree-0.2.1.gem # gem install transaction-simple-1.3.0.gem # gem install color-tools-1.3.0.gem # gem install pdf-writer-1.1.3.gem # gem install rake-0.7.3.gem # gem install hoe-1.2.1.gem # gem install gruff-0.2.8.gem # gem install activesupport-1.3.1.gem # gem install activerecord-1.14.4.gem Luego descargar: fpdf-1.53.gem y kamila-1.0.1.gem desde http://rubyforge.org/projects/kamila/ para su instalación: # gem install fpdf-1.53.gem # gem install kamila-1.0.1.gem Luego descargar kamilaweb-1.0.1.zip desde http://rubyforge.org/projects/kamila/ y descomprimir dicho archivo en la carpeta: /var/www como super usuario: # cd /var/www # unzip kamilaweb-1.0.1.zip 6 Libro de Kamila 1.0.1 yiyi 2009 Documentación de las Clases de Kamila La siguiente clase es: Mycgi y su fuente se llama: mycgi.rb que está empaquetada en la librería: kamila-1.0.0.gem y su diseño es: Tarjeta CRC Proyecto: Framework Kamila Super Clase: CGI Require: cgi Sub Clase: Mycgi Descripción: Esta clase permite el redicionamiento a un URL Atributos Nombre Descripción Responsabilidades Nombre Descripción Dado el parámetro where o URL a redirect( where ) redireccionar. Observaciones: Se creó esta clase que hereda de CGI, ya que éste método redirect, no existe en la clase CGI. La siguiente clase es: Scanear_disco y su fuente se llama: scanear_disco.rb que está empaquetada en la librería: kamila1.0.0.gem y su diseño es: Tarjeta CRC Proyecto: Framework Kamila Super Clase: Require: fileutils, tree, open-uri, rexml/document Sub Clase: Scanear_disco Descripción: Esta clase contiene los métodos que permiten obtener todos los directorios y archivos de cada directorios dado una rama o raíz. Atributos Nombre Descripción @control : Boolean Variable de control de la clase @directorio : Boolean Indica si el archivo es de tipo 7 Libro de Kamila 1.0.1 yiyi 2009 directorio @nivel : Integer Es un de tipo entero que indica el nivel de profundidad en el scaneo del disco @raiz : Tree De tipo árbol que contiene la raíz que a partir de él se scaneará los siguientes niveles de directorio Responsabilidades Nombre Descripción initialize() Constructor de la clase Obtiene las propiedades del getArchivo(archivo) archivo Método que permite scanear el directorio actual y hacer la scandisco(nodo,dirActual) llamada recursiva a él mismo para seguir scaneando los siguietes niveles imprimirArbol() Imprime el árbol adicionarElementos(elementoAr Adiciona elementos al arrelgo de ray,rama) tipo Rama o Tree. Genera un documento XML dado generarXML(archivo) el archivo de tipo Tree. Observaciones: La siguiente clase es: Mypdf y su fuente se llama: mypdf.rb que está empaquetada en la librería: kamila-1.0.0.gem y su diseño es: Tarjeta CRC Proyecto: Framework Kamila Super Clase: fpdf Require: rubygems y fpdf Sub Clase: Mypdf Descripción: Esta clase contiene los atributos y métodos que permiten generar reportes tabulares, basado en el ejemplo 5 del sitio http://www.fpdf.org. Atributos Nombre Descripción @font Arreglo que contiene las caracteristicas de la fuente para el 8 Libro de Kamila 1.0.1 @fontf @image1 @image2 @xy1 @xy2 @xy3 @xy4 @title1 @title2 @title3 yiyi 2009 encabezado, ver ejemplo: quince. Arreglo que contiene las caracteristicas de la fuente para el pie de página, ver ejemplo: quince. Arreglo que contiene las caracteristicas de la imagen o logo que se ubicará al tope izquierdo de la página en el encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las caracteristicas de la imagen o logo que se ubicará al tope derecho de la página en el encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las coordenadas del primer título del encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las coordenadas del segundo título del encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las coordenadas del tercer título del encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las coordenadas del cuarto título del encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las características del primer título del encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las características del segundo título del encabezado del reporte tabular, ver ejemplo: quince. Arreglo que contiene las características del tercer título del encabezado del reporte tabular, 9 Libro de Kamila 1.0.1 yiyi 2009 ver ejemplo: quince. @title4 Arreglo que contiene las características del cuarto título del encabezado del reporte tabular, ver ejemplo: quince. @lines Contiene cuantas líneas queda de separación entre encabezado del reporte y la tabla donde se vaciará la información, ver ejemplo: quince. @y Contiene cuantas líneas antes del final de pie de página, ver ejemplo: quince. @pagef Arreglo que contiene las características del del pie de página del reporte tabular, ver ejemplo: quince. Responsabilidades Nombre Descripción HeaderPage(font,image1,image Método que recibe los parámetros 2,xy1,title1,xy2,title2,xy3,title3, para el encabezado del reporte. xy4,title4,lines) Método sobrecargado para personalizar el encabezado, según Header() los parámetros recibidos en HeaderPage(). Método que recibe los parámetros FooterPage(font,y,page) para el pie de página del reporte. Método sobrecargado para personalizar el pie de página, Footer() según los parámetros recibidos en FooterPage(). Para cargar los datos de un archivo de texto, separados por LoadData(file) punto y coma, y retorna un arreglo de arreglos. BasicTable(header, data) Genera un reporte tabular básico, dado el arreglo header con los datos de las columnas y el arreglo data que es un arreglo de arreglos con los datos que se vaciarán en la tabla básica, ver ejemplo quince. ImprovedTable(header, data, Equivalente al método BasicTable, 10 Libro de Kamila 1.0.1 yiyi 2009 wh, wd) pero con la diferencia que podemos personalizar los datos del encabezado de las columnas y los mismos datos, ver ejemplo quince. FancyTable(header, data, wh, wd, fillcolor, textcolor, drawcolor, linewidth, font, fillcolorRestart, textcolorRestart, fontRestart) Equivalente al método ImprovedTable, pero con la diferencia que podemos personalizar todo los datos del reporte tabular, ver ejemplo quince. Observaciones: La siguiente clase es la llamada: Kamila y su fuente se llama: kamila.rb que está empaquetada en la librería: kamila-1.0.0.gem y su diseño es: Tarjeta CRC Proyecto: Framework Kamila Super Clase: Require: rubygems, mycgi, cgi/session, cgi/session/pstore, utilidades, fileutils, yaml. Sub Clase: Kamila Descripción: La clase núcleo del framework (core) que permite, incializar variables globales a través del método: init() y validar a través del URL, el controlador y acción a ejecutar a través del método: dispatcher(). Atributos Globales Nombre Descripción $kamila_titulo: String Variable global contiene el título del mensaje a mostrar. $kamila_mensaje: String Variable global el mensaje a mostrar. $kamila_icon_mensaje: String Variable global contiene el nombre del icono para el mensaje a mostrar. $kamila_linkto: String Variable global contiene el URL 11 Libro de Kamila 1.0.1 $kamila_array_items: Array $kamila_website: String $kamila_site: String $kamila_home: String $kamila_lib: String $kamila_serveraddr: String $kamila_remoteddr: String $kamila_DatabaseAdapter: String $kamila_DatabaseHost: String $kamila_DatabasePort: String $kamila_DatabaseName: String $kamila_DatabaseUsername: String $kamila_DatabasePassword: String yiyi 2009 que se desea ir. Variable global que obtiene por fragmento los datos dados en el URL. Variable global obtiene la raíz del servidor web apache. Variable global y contiene el URL del sitio web. Variable global y contiene el directorio raiz del sitio web: /var/www/kamila. Variable global que contiene la ruta de la librería Kamila. Variable global que contiene el IP del servidor donde se ejecuta Kamila Web. Variable global que contiene el IP del cliente que se conecta para usar Kamila Web. Variable global que contiene el adaptador del motor de la base de datos leido del database.yml en la carpata: /var/www/kamila/config. Variable global que contiene el Host o IP del motor de la base de datos leido del database.yml en la carpata: /var/www/kamila/config. Variable global que contiene el Puerto del motor de la base de datos leido del database.yml en la carpata: /var/www/kamila/config. Variable global que contiene el Nombre de la base de datos leido del database.yml en la carpata: /var/www/kamila/config. Variable global que contiene el usuario permitido a la base de datos leido del database.yml en la carpata: /var/www/kamila/config. Variable global que contiene la clave permitido a la base de datos leido del database.yml en la carpata: /var/www/kamila/config. 12 Libro de Kamila 1.0.1 $kamila_array_controllers: Array yiyi 2009 Obtiene todos los controladore (archivos: *.rb) que el programador lo haya definido en la carpeta: controllers del framework. $kamila_controller_exist: Boolean Variable global que indica si existe o no el controlador solicitado por el usuario en la llamada escrita en el URL del navegador. $kamila_controller_class: String Variable global que tiene el nombre de la clase que es el mismo nombre del controlador, pero con la inicial del controlador en mayúscula porque las clases en ruby la incial es en mayúscula. $kamila_controller_object: Variable global, que contiene la String instancia de la clase controlador. $kamila_action: String Variable global, que contiene el método de la clase controlador que el usuario denotó en el URL donde dispatcher valida si existe o no dicha acción. Responsabilidades Nombre Descripción initialize() Constructor de la clase Este método inicializa las variables Kamila.init() globales Este método, desglosa el URL y toma el estándar: http://DNS ó IP /Sitio Web/controlador /accion/parámetros, toma el controlador valida si existe, Kamila.dispatcher() instancia el controlador y ejecuta el método de ese controlador dado en el URL en la acción definida y si envian parámetros también son tomados para la ejecución del mismo. Observaciones: Los dos métodos son métodos de clase (está clase no es instanciada) y son ejecutados cuando el usuario hace una solicitud siguiendo el estándar: http://DNS ó IP /Sitio Web/controlador/accion/parámetros 13 Libro de Kamila 1.0.1 yiyi 2009 Cada vez que el usuario sigue ese patrón para cada llamada de un controlador y acción, el módulo rewrite de apache2 sigue las reglas de expresión definidas en el archivo: .htaccess, haciendo un redireccionamiento a la carpeta raíz del framework y ejecuta el archivo: index.rhtml. Parte del contenido de éste archivo, se puede ver la llamada dichos métodos: if File.exist?("/etc/apache2/mods-available/rewrite.load") begin require 'kamila' Kamila::init() Kamila::dispatcher() rescue LoadError $kamila_icon_mensaje = "Ext.MessageBox.ERROR" $kamila_titulo = "Error" #$kamila_mensaje = $kamila_defaultMessages["message014"] $kamila_mensaje = $! $kamila_linkto = ENV['HTTP_REFERER'] %> <script language="javascript"> location.href = "public/message/message.rhtml"; </script> <% end La siguiente clase es la llamada: Applicaction y su fuente se llama: application.rb que está empaquetada en la librería: kamila- 1.0.0.gem y su diseño es: Tarjeta CRC Proyecto: Framework Kamila Super Clases: Require: rubygems, utilidades, fileutils, erubis, overload, mycgi, cgi, pstore, digest Sub Clase: Application Descripción: Una vez que el método de clase: dispatcher de la clase anterior: Kamila, ejecuta el controlador y acción denotado en la url, un controlador hereda de está clase Apllicaction, donde se encuentra el método render(vista) que hace uso del módulo erubis para evaluar las instrucciones de la vista donde puede usar la gran 14 Libro de Kamila 1.0.1 yiyi 2009 cantidad de APIs que ofrece esta clase y además validar que la vista no use instrucciones del modelo. Atributos Nombre Descripción @kamila_array_views_dir : Obtiene todas las carpetas que Array estan en la carpeta: views del framework. @kamila_array_views_file : Obtiene todas las vistas (archivos: Array *.rhtml) que el programador lo haya definido en la carpeta: views/controlador del framework. @kamila_array_models: Array Obtiene todas las modelos basado en ORM usando active-record (archvios *.rb) que el programador lo haya definido en la carpeta: models del framework. @kamila_views_dir_exist: Indica si la carpeta con el mismo Boolean nombre del controlador existe o no en la carpeta: views del framework. @kamila_views_file_exist: Indica si la vista en: Boolean views/controlador existe o no cuando el controlador a tráves de su método render(vista o page) trata de mostrar en el navegador. @kamila_model_exist: Boolean Indica si el modelo existe o no cuando el controlador a tráves de su método: loadmodel(modelo) trata de usar una clase ubicada en la carpeta: models. $kamila_view: String Variable global, que contiene la vista que existe en la carpeta: views que necesitará el controlador usando el método: render(vista o page). Responsabilidades Nombre Descripción initialize() Constructor de la clase. verifyviews() Esté método verifica, dada una vista: *.rhtml, si existe la carpeta y la vista o no en la carpeta: views del framework. loadmodel(modelo) Esté método carga el modelo, dado 15 Libro de Kamila 1.0.1 render(page) create_html() close_html() create_head() close_head() create_title(titulo) close_title() create_meta() create_meta(httpequiv,content,c harset) create_body() create_body(background,bgcolo r,css,js) create_body(marginheight,margi nwidth,topmargin,leftmargin,bgc olor) yiyi 2009 como parámetro el nombre de la clase , si existe o no en la carpeta: models del framework. Nota: el nombre del archivo *.rb que contiene la clase de tipo modelo, y el nombre de la clase deben ser del mismo nombre. Este método permite mostrar o generar todo el contenido de una vista o página *.rhtml, que el programador haya creado o programado con las APIs de Kamila, en la carpeta: views/nombre del controlador/nombre de la vista: *.rhtml Genera la etiqueta <html> Genera la etiqueta </html> Genera la etiqueta <head> Genera la etiqueta </head> Genera la etiqueta <title>titulo Genera la etiqueta </title> Genera la etiqueta <meta name="GENERATOR" content="kamila version 1.0.0"> Genera la etiqueta como: <meta http-equiv="Content-Type" content="text/html; charset=iso8859-1"> Genera la etiqueta <body> Genera la etiqueta <body> con los atributos dados como parámetros. Genera la etiqueta <body> con los atributos dados como parámetros. close_body() create_center() Genera la etiqueta </body> close_center() Genera la etiqueta </center> create_css(css) Genera etiqueta <link rel, dado el parámetro como por ejemplo: Genera la etiqueta <center> 16 Libro de Kamila 1.0.1 create_javascript() create_javascript(js) create_javascript(url_externo,fla g) close_javascript() create_javascript_md5() create_javascript_livevalidation( ) create_javascript_extjs() create_javascript_rialto(theme) yiyi 2009 <link rel="stylesheet" type="text/css" href="http://192.168.232.132/kami la/public/css/estilo_rojo.css"> Genera la etiqueta <script> Genera etiqueta <script type="text/javascript" src=, dado el parámetro como por ejemplo: <script type="text/javascript" src=$kamila_site+"/public/js/msg.j s"></script> Genera etiqueta <script type="text/javascript" src=, dado el parámetro como por ejemplo: <script type="text/javascript" src="url_externo/msg.js"></script > Genera la etiqueta </script> Genera la etiqueta javascript que incluye la librería md5.js para ser uso del algoritmo de encriptación para los campos de tipo password, para los frameworks: livevalidation, extjs y rialto. Genera la etiqueta de javascript y css que incluye la librería Livevalidation para ser uso de las APIs o funciones de está clase con sufijo: _lv, como por ejemplo: input_text_presence_lv('text','form' ,'f1','usuario','','false',12,12,'false',' introduzca el usuario',1,'cajatexto') Genera la etiqueta de javascript y css que incluye del framework Extjs para ser uso de las APIs o funciones de está clase con sufijo: _extjs, como por ejemplo: input_textField_extjs(id,name,input Type,width,allowBlank,value,disabl ed,cls) Genera la etiqueta de javascript y css que incluye del framework Rialto para ser uso de las APIs o funciones de está clase con sufijo: 17 Libro de Kamila 1.0.1 create_javascript_language_extj s(language,charset) create_javascript_validate_rang e_extjs(funcion) create_heading(h) create_heading(h,texto) create_heading(h,id,texto) close_heading(h) create_paragraphs() create_paragraphs(id) create_paragraphs(id,text) create_paragraphs(id,text,css) close_paragraphs() insert_linebreaks(cantidad) insert_text(texto) create_span(text) create_span(text,id) create_span(text,id,css) create_div() create_div(id) create_div(id,css) create_div(id,css,text) yiyi 2009 _rialto, como por ejemplo: input_checkbox_rialto(name,top,lef t,parent,text,isChecked,className ) Genera el javascript para el idioma en los mensajes que se emitirán cuando se use las APIs o funciones con sufijo _extjs Genera el javascript para la validación de fechas entre un rango, necesitada por la API: input_datefield_extjs(id,name,valu e,readonly,blankText,invalidText,ty pe,vtype,disabled,dateField) Genera la etiqueta <h1> o <h2> ... <hn> Genera la etiqueta <h1>texto o <h2>texto Genera la etiqueta <hn id='id1'>texto Genera la etiqueta </h1> o </h2> ... </hn> Genera la etiqueta <p> Genera la etiqueta <p id=”id”> Genera la etiqueta <p id=”id”>texto Genera la etiqueta <p id=”id” class=”css”> Genera la etiqueta </p> Genera tanta(s) etiqueta(s) <br/> según la cantidad. Inserta un texto Genera la etiqueta <span>text Genera la etiqueta <span id>text Genera la etiqueta class=css>text Genera la etiqueta Genera la etiqueta Genera la etiqueta class=”css”> Genera la etiqueta 18 <span id, <div> <div id=”id”> <div id=”id” <div id=”id” Libro de Kamila 1.0.1 create_div(id,css,align,text) close_div() create_font(face,size,color,css) close_font() create_ol() create_ol(id) create_ol(id,css) close_ol() create_li() create_li(id) create_li(id,css) close_li() yiyi 2009 class=”css”>texto Genera la etiqueta <div id=”id” class=”css” align=”align”>texto Genera la etiqueta </div> Genera la etiqueta <font face=”face” size=”size” color=”color” class=”css”> Genera la etiqueta </font> Genera la etiqueta <ol> Genera la etiqueta <ol id=”id”> Genera la etiqueta <ol id=”id” class=”css”> Genera la etiqueta </ol> Genera la etiqueta <li> Genera la etiqueta <li id=”id”> Genera la etiqueta <li id=”id” class=”css”> Genera la etiqueta </li> create_href(url) Genera la etiqueta <a href=”url”> Genera la etiqueta <a create_href(url,texto) href=”url”>texto create_href(url,texto,target) Genera la etiqueta <a href=”url” target=”target”>texto close_href() Genera la etiqueta </a> Genera la etiqueta <table create_table(border) border=”border”> create_table(border,width) Genera la etiqueta <table border=”border” width=”width”> create_table(cellpadding,cellspa Genera la etiqueta <table cing,border,align,width,height,ba cellpadding=”cellpadding” ckground) cellspacing=”cellspacing” border=”border” align=”align” width=”width” height=”height” background=”background”> close_table() Genera la etiqueta </table> create_tr() Genera la etiqueta <tr> 19 Libro de Kamila 1.0.1 yiyi 2009 close_tr() create_td() create_td(width) Genera la etiqueta </tr> Genera la etiqueta <td> Genera la etiqueta <td width=”width”> create_td(width,css) Genera la etiqueta <td width=”width” class=”css”> create_td(width,height,css) Genera la etiqueta <td width=”width” height=”height” class=”css”> create_td(valign,align,height,css Genera la etiqueta <td ) valign=”valign” align=”align” height=”height” class=”css”> create_td(width,height,align,bor Genera la etiqueta <td der,css) width=”width” height=”height” align=”align” border=”border” class=”css”> close_td() Genera la etiqueta </td> Genera la etiqueta <img src=”src” create_img(src) /> Genera la etiqueta <img id=”id create_img(id,src) ”src=”src” /> Genera la etiqueta <img id=”id create_img(id,src,alt) ”src=”src” alt=”alt” /> Genera la etiqueta <img id=”id create_img(id,src,alt,border) ”src=”src” alt=”alt” border+”border” /> Genera la etiqueta <img id=”id create_img(id,src,alt,border,hei ”src=”src” alt=”alt” ght) border+”border” height=”height” /> Genera la etiqueta <img id=”id create_img(id,src,alt,border,hei ”src=”src” alt=”alt” ght,width) border+”border” height=”height” width=”width” /> create_text_lightbox2(url,text) Ver ejemplo veinte.rb create_text_lightbox2(src,title, description) Ver ejemplo veinte.rb create_img_lightbox2(src,title,al t,height,width) Ver ejemplo veinte.rb create_img_lightbox2(src,title,h Ver ejemplo veinte.rb 20 Libro de Kamila 1.0.1 yiyi 2009 eight,width) Genera la etiqueta <form id=”id” create_form(id,name,method,act name=”name” method=”method” ion) action=”action”> Genera la etiqueta <form id=”id” create_form(id,name,method,act name=”name” method=”method” ion,multipart) action=”action” enctype="multipart/form-data> close_form() Genera la etiqueta </form> Genera el código javascript para seleccionar el foco de un campo del formulario dado, por ejemplo: select_focus(form,name) <script language="JavaScript"> document.form.usuario.select(); document.form.usuario.focus(); </script> input_button(id,name,value,css, Genera la etiqueta: <input js) type=”button” id=”id” name=”name”, value=”value” class=”css”> Genera la etiqueta: <input type=”submit” id=”id” input_submit(id,name,value,css) name=”name”, value=”value” class=”css”> Genera la etiqueta: <input type=”reset” id=”id” input_reset(id,name,value,css) name=”name”, value=”value” class=”css”> nput_hidden(id,name,value) Genera la etiqueta: <input type=”hidden” id=”id” name=”name”, value=”value” > input_submit_lv(id,name,value,c Genera la etiqueta: <input ss,form,fieldsHidden) type=”submit” id=”id” name=”name”, value=”value” class=”css”> Pero, además genera el código javascript, según el contenido del parámetro: fieldsHidden que debe ser de la siguiente forma: “tipo,eliminar| valor,10” donde vienen pares de valores separados por coma, y cada par de valores separado por “|”. El código javascript generado 21 Libro de Kamila 1.0.1 input_submit_lv(id,name,value,c ss,form,fieldsHidden,ids,messag eError) input_reset_lv(id,name,value,css ) input_text_key_validate_lv(name form,range,type,id,name,value,r eadonly,size,maxlength,disabled ,alt,tabindex,css) input_text_presence_lv(type,na meform,id,name,value,readonly, size,maxlength,disabled,alt,tabi ndex,css) input_textarea_key_validate_lv(r ange,id,name,value,readonly,dis abled,alt,tabindex,css,rows,cols) input_textarea_presence_lv(id,n ame,value,readonly,disabled,alt, tabindex,css,rows,cols) input_numericality_lv(typeinteg er,type,id,name,value,readonly,s yiyi 2009 es: form.tipo=”eliminar”; form.valor=”10”; Equivalente a la anterior función, pero además, el parámetro ids, contiene los id de los campos que deseamos validar según el tipo de dato que hallamos definido usando la librería livevalidation ( por ejemplo una entrada de datos según la API: input_text_presence_lv) antes de hacer un submit, de lo contrario mostrará el mensaje de error que contiene: messageError. Genera la etiqueta: <input type=”reset” id=”id” name=”name”, value=”value” class=”css”> Genera la etiqueta <input type=”text” ...> con los demas atributos. Pero además genera el código javascript que dado el parámetro: range, no permitirá la entrada de datos a la caja de texto que no esté en el rango. Genera la etiqueta <input type=”text” ...> con los demas atributos. Pero además genera el código javascript que valida que el campo no esté vacío. Genera la etiqueta <textarea ... > con los demas atributos. Pero además genera el código javascript que dado el parámetro: range, no permitirá la entrada de datos a la caja de texto que no esté en el rango. Genera la etiqueta <textarea ... > con los demas atributos. Pero además genera el código javascript que valida que el campo no esté vacío. Genera la etiqueta <input type=”text” ...> con los demas 22 Libro de Kamila 1.0.1 ize,maxlength,disabled,alt,tabin dex,css) input_length_lv(typelength,type size,type,id,name,value,readonly ,size,maxlength,disabled,alt,tabi ndex,css) input_checkbox_lv(id,name,valu e,readonly,disabled,alt,tabindex, css) input_checkbox_lv(id,name,valu e,readonly,disabled,alt,tabindex) input_radio_button_lv(id,name,v alue,readonly,disabled,alt,tabind ex) input_radio_button_lv(id,name,v alue,readonly,disabled,alt,tabind ex,css) input_combobox_lv(id,name,ran ge,readonly,disabled,alt,tabinde x) input_combobox_lv(id,name,ran ge,readonly,disabled,alt,tabinde x,css) input_inclusion_lv(range,partial, type,id,name,value,readonly,size ,maxlength,disabled,alt,tabindex ,css) input_exclusion_lv(range,partial, type,id,name,value,readonly,size ,maxlength,disabled,alt,tabindex yiyi 2009 atributos. Pero además genera el código javascript que valida que el campo sea númerico. Genera la etiqueta <input type=”text” ...> con los demas atributos. Pero además genera el código javascript que valida que el campo no exceda la longitud según el parámetro: typelength y typesize. Gener la etiqueta <input type="checkbox" ..> con los atributos dados. Usando css. Gener la etiqueta <input type="checkbox" ...> con los atributos dados. Sin usar css. Genera la etiqueta <input selected type="radio"..> con los atributos dados, pero sin usar css. Genera la etiqueta <input selected type="radio"..> con los atributos dados, pero usando css. Genera la etiqueta <select ...><option ..></select> con los atributos dados, pero sin usar css. Genera la etiqueta <select ...><option ..></select> con los atributos dados, pero usando css. Genera la etiqueta <input type=”text” ...> con los demás atributos dato. Pero además general el código javascript de validación basada en la libería livevalidation, que los datos introducidos esté en el rango. Ese rango es por el parámetro: range y su contenido puede ser: “casa,hotel,apartamento”. Solo aceptará en ese rango, sino emite un mensaje de error al lado de la caja de texto. Genera la etiqueta <input type=”text” ...> con los demás atributos dato. Pero además 23 Libro de Kamila 1.0.1 yiyi 2009 general el código javascript de validación basada en la libería livevalidation, que los datos introducidos NO esté en el rango. Ese rango es por el parámetro: ,css) range y su contenido puede ser: “casa,hotel,apartamento”. Solo aceptará cualquier palabra pero no las contenidas en el rango, sino emite un mensaje de error al lado de la caja de texto. Genera la etiqueta <input type=”text” ...> con los demás atributos dato. Pero además general el código javascript de validación basada en la libería input_validate_email_lv(id,name, livevalidation, que el dato value,readonly,size,maxlength,di introducido sea del formato de un sabled,alt,tabindex,css) correo, por ejemplo: [email protected] es formato valido. Un formato no valido es: casa@ y mite un mensaje de error al lado de la caja de texto. Genera el código javascript de validación basada en la libería livevalidation, dando como parámetros los ids de las validaciones de las APIs create_massValidate_lv(ids,,mes anteriores, para validar en masa, sageError) si alguno de los ids o campos de datos hay un error emitirá un mensaje dado por el parámetro messageError y no se ejecutará el submit dentro del formulario. create_label_extjs(id,width,text, Genera un texto o label, con los disabled,cls) parámetros dado, a través de javascript basada en el framework Extjs, por ejemplo: <script> var e1 = new Ext.form.Label({... }); input_datefield_extjs(id,name,va Genera un caja de texto de tipo lue,readonly,blankText,disabled, fecha, con los parámetros dado, a invalidText) través de javascript basada en el 24 Libro de Kamila 1.0.1 yiyi 2009 framework Extjs, por ejemplo: <script> var fecha = new Ext.form.DateField({..}); Igual que la función anterior, excepto por el último parámetro input_datefield_extjs(id,name,v que se da un campo fecha de Extjs alue,readonly,blankText,invalidT para validar el rango y segundo ext,type,vtype,disabled,dateFiel que use la API: d) create_javascript_validate_range(f uncion), incluida en la sección: HEAD. Genera un caja de texto de tipo fecha, con los parámetros dado, a través de javascript basada en el framework Extjs, por ejemplo: input_textField_extjs(id,name,in <script> putType,width,allowBlank,value, var nombre = new disabled,cls) Ext.form.TextField({..}); Uno de los parámetros importantes es inputType, que puede ser de los tipos: textfield, password, md5. Genera una Area de texto con los parámetros dado, a través de input_textArea_extjs(id,name,wi javascript basada en el framework dth,height,allowBlank,value,disa Extjs, por ejemplo: bled,cls) <script> var memo = new Ext.form.TextArea({..}); Genera un caja de texto de tipo hora o tiempo, con los parámetros input_timeField_extjs(id,name,w dado, a través de javascript basada idth,minValue,maxValue,increm en el framework Extjs, por ent,allowBlank,value,disabled,cl ejemplo: s) <script> var hora = new Ext.form.TimeField({..}); input_numberField_extjs(id,nam Genera un caja de texto de tipo e,inputType,width,allowBlank,va númerico con los parámetros dado, lue,disabled,cls) a través de javascript basada en el framework Extjs, el parámetro inputType, puede ser integer y generará: 25 Libro de Kamila 1.0.1 yiyi 2009 <script> var cedula = new Ext.form.TextField({..}); y valida solo enteros. Si es double, generará: <script> var monto = new Ext.form.NumberField({..}); validando datos númericos de tipo punto flotante. Genera un radio button, con los parámetros dado, a través de javascript basada en el framework input_radioGroup_extjs(id,name, Extjs, por ejemplo: columns,items,disabled,cls) <script> var sexo = new Ext.form.RadioGroup({..}); Genera un comboBox, con los parámetros dado, a través de input_comboBox_extjs(id,name, javascript basada en el framework width,store,emptyText,disabled, Extjs, por ejemplo: cls) <script> var estado = new Ext.form.ComboBox({..}); Genera un grupo de checkBoxs, con los parámetros dado, a través de javascript basada en el input_checkboxGroup_extjs(id,n framework Extjs, por ejemplo: ame,columns,items,disabled,cls) <script> var titulos = new Ext.form.CheckboxGroup({..}); Genera un caja de texto de tipo email, con los parámetros dado, a través de javascript basada en el input_emailField_extjs(id,name, framework Extjs, por ejemplo: width,allowBlank,value,disabled <script> ,cls) var correo = new Ext.form.TextField({..}); y valida que el dato sea del formato de tipo email. input_htmlEditor_extjs(id,name, Genera una Area de Texto del tipo value,width,height,allowBlank,d Rich Editor, con los parámetros isabled,cls) dado, a través de javascript basada en el framework Extjs, por 26 Libro de Kamila 1.0.1 yiyi 2009 ejemplo: <script> var curriculum = new Ext.form.HtmlEditor({..}); Genera una ventana de tipo modal dentro del navegador mostrando un mensaje, con los parámetros dado, a través de javascript basada show_Message_extjs(icon,title,m en el framework Extjs, por essage) ejemplo: <script> var mensaje = Ext.MessageBox.show({..}); Igual que la API o función anterior, pero con la diferencia que el show_Message_extjs(icon,title,m parámetro linkto, tiene la URL essage,linkto) donde se redireccionará luego de presionar el botón OK de la ventana de mensaje. Genera tantas pestañas y la URL que se cargará, con los parámetros create_tabpanel_extjs(id,active,c dado, a través de javascript basada ollapsible,floating,width,height, en el framework Extjs, por plain,titles,icons,tabtips,urls,clo ejemplo: seable,col,row) <script> var f1tabs = new Ext.TabPanel({..}); Genera un catálogo estático de tipo modal dentro del navegador, con los parámetros dado, a través de javascript basada en el framework Extjs, por ejemplo: create_gridView_extjs(nameFun <script> ction,title,idCatalogo,ids,ds,cm, miGridgrid = new widthcm,data) Ext.grid.GridPanel({..}); Se denota estático porque el parámetro data donde resisde los datos, no se actualiza o no se sincroniza con el servidor. create_gridAjaxView_extjs(name Genera un catálogo dinámico de Function,title,idCatalogo,ids,ds, tipo modal dentro del navegador, cm,widthcm,pageserver) con los parámetros dado, a través de javascript basada en el framework Extjs, por ejemplo: 27 Libro de Kamila 1.0.1 input_submit_extjs(id,name,valu e,css,form,fieldsHidden,js) input_submit_extjs(id,name,valu e,css,form,fieldsHidden,fieldsNa mes,messageError) input_reset_extjs(id,name,value, css) yiyi 2009 <script> miGridgrid = new Ext.grid.GridPanel({..}); Se denota dinámico porque el parámetro data donde reside los datos, se actualiza sincronizadamente con el servidor a tráves de la página servidora por el parámetro pageserver usando Ajax. Genera la etiqueta: <input type=”submit” id=”id” name=”name”, value=”value” class=”css”> Pero, además genera el código javascript, según el contenido del parámetro: fieldsHidden que debe ser de la siguiente forma: “tipo,eliminar| valor,10” donde vienen pares de valores separados por coma, y cada par de valores separado por “|”. El código javascript generado es: form.tipo=”eliminar”; form.valor=”10”; y por el parámetro: js, donde se le indica la función de javascript que es generada por la API: create_massValidate_extjs Equivalente a la anterior función, pero además, el parámetro fieldsNames, contiene los nombres de los campos que deseamos validar según el tipo de dato que hallamos definido usando la librería Extjs ( por ejemplo una entrada de datos según la API: input_emailField_extjs) antes de hacer un submit, de lo contrario mostrará el mensaje de error que contiene: messageError. Genera la etiqueta: <input type=”reset” id=”id” name=”name”, value=”value” class=”css”> 28 Libro de Kamila 1.0.1 yiyi 2009 Genera el código javascript de validación basada en la librería Extjs, dando como parámetros los ids de las validaciones de las APIs create_massValidate_extjs(form, anteriores, para validar en masa, name,ids,mensaje) si alguno de los ids o campos de datos hay un error emitirá un mensaje dado por el parámetro mensaje y no se ejecutará el submit dentro del formulario. Genera una ventana de tipo modal dentro del navegador mostrando un mensaje, con los parámetros dado, a través de javascript basada en el framework Rialto, por show_Message_rialto(top,left,wi ejemplo: dth,height,title,message,gray) <script> var sPopup = new rialto.widget.PopUp("popupRialto", 150,420,"260","80","Datos no completados","Informacion","gray" ); Igual que la función anterior, pero show_Message_rialto(top,left,wi al presionar el botón: OK, nos dth,height,title,message,gray,lin redirecciona a la url dado por el kto) parámtro: linkto. Genera el código javascript para la creación de una etiqueta, con los parámetros dado, basada en la librería Rialto: create_label_rialto(name,top,left <script> ,parent,text,className) var lab6 = new rialto.widget.Label("lab6",parseInt (screen.height * 0.35),parseInt(screen.width * 0.15),id7,"Comentario:","e6"); input_text_rialto(name,top,left, Genera el código javascript para la width,type,parent,options) creación de una caja texto, con los parámetros dado, basada en la librería Rialto: <script> var nombre = new rialto.widget.Text("nombre",parseI nt(screen.height * 29 Libro de Kamila 1.0.1 yiyi 2009 0.10),parseInt(screen.width * 0.24),300,"A",id2,{initValue:"yiyi", autoUp:false,isRequired:true,disab le:false,alt:"Introduzca el nombre",accessKey:"n",rows:5,tabI ndex:1}); Dado el parámetro type, puede ser los siguientes tipo de datos, A:Alfanúmerico, N:Númerico, D:Fecha, H:Hora, T:Area de Texto, P:Password, MD5: Tipo password con encriptamiento md5. Genera el código javascript para la creación de una entrada de dato de tipo verficación, con los parámetros dado, basada en la input_checkbox_rialto(name,top, librería Rialto: left,parent,text,isChecked,class <script> Name) var titulo1 = new rialto.widget.Checkbox("titulo1",pa rseInt(screen.height * 0.50),parseInt(screen.width * 0.24),id9,"Pregrado",true,"chk01"); Genera el código javascript para la creación de una entrada de dato de tipo selección o combo box, con los parámetros dado, basada en la librería Rialto: input_combo_rialto(name,top,lef <script> t,width,items,selWithText,parent var estado = new ,enable,heightItem) rialto.widget.Combo("","estado",pa rseInt(screen.height * 0.60),parseInt(screen.width * 0.24),100,id12,{suggest:true,enabl e:true,heightItem:0}); input_submit_rialto(name,top,lef Genera la etiqueta: <input t,text,alt,parent,options,form,fie type=”submit” id=”id” ldsHidden,rialtoMassValidate) name=”name”, value=”value” class=”css”> Pero, además genera el código javascript, según el contenido del parámetro: fieldsHidden que debe ser de la siguiente forma: “tipo,eliminar| valor,10” donde vienen pares de 30 Libro de Kamila 1.0.1 yiyi 2009 valores separados por coma, y cada par de valores separado por “|”. El código javascript generado es: form.tipo=”eliminar”; form.valor=”10”; y por el parámetro: rialtoMassValidate, donde se le indica la función de javascript que es generada por la API: create_massValidate_rialto Equivalente a la anterior función, pero además, el parámetro fieldsNames, contiene los nombres de los campos que deseamos input_submit_rialto(name,top,lef validar según el tipo de dato que t,text,alt,parent,options,form,fie hallamos definido usando la ldsHidden,fieldsNames,message librería Rialto ( por ejemplo una entrada de datos según la API: Error) input_text_rialto) antes de hacer un submit, de lo contrario mostrará el mensaje de error que contiene: messageError. Genera la etiqueta: <input input_reset_rialto(name,top,left, type=”reset” id=”id” text,alt,parent,options,form) name=”name”, value=”value” class=”css”> Genera el código javascript de validación basada en la librería Rialto, dando como parámetros los ids de las validaciones de las APIs create_massValidate_rialto(form anteriores, para validar en lote, si ,name,ids,mensaje) alguno de los ids o campos de datos hay un error emitirá un mensaje dado por el parámetro mensaje y no se ejecutará el submit dentro del formulario. Genera un catálogo estático de create_gridView_rialto(top,left, tipo modal dentro del navegador, width,height,nameFunction,title con los parámetros dado, a través ,nameCatalogo,nameFields,cn,w de javascript basada en el idthc,typec,data) framework Rialto. create_gridAjaxView_rialto(top,l Genera un catálogo dinámico, eft,width,height,nameFunction,t basado en AJAX, de tipo modal itle,nameCatalogo,nameFields,c dentro del navegador, con los n,widthc,typec,pageserver) parámetros dado, a través de 31 Libro de Kamila 1.0.1 yiyi 2009 javascript basada en el framework Rialto. Da formato a un número String, por ejemplo si tenemos: 12354.50 format_number(number, y el segundo parámetro es el separator) separador de unidades de mil es: “,” nos genera: 12,354.50 Genera gráficas según el create_graph_gruff(type,theme,f parámetro type, de tipo: line, pie, ont,fontsize,title,x_axis_label,y_a bar, area, sidebar, stackedbar, xis_label,titlearray,dataarray,xla sidestackedbar, basadas en la bels,xvalue,file) librería Gruff, ver ejemplo: catorce. create_css_contentslider(borderli ne,bordercolor,width,height,ctp, Ver dieciseis.rb btp,sctp,sbtp) create_ContentSlider_text(id,con tent,link,label1,label2) Ver dieciseis.rb create_ContentSlider_image(id,c ontent,link,label1,label2,isTable) Ver diecisiete.rb create_showVideo_wmv(id,width ,height,url) Ver dieciocho.rb create_showVideo_flash(id,width ,height,url) Ver dieciocho.rb create_showVideo_jwplayer(id,wi dth,height,url) Ver dieciocho.rb callController(controller) Desde un controlador llamar a otro controlador por ejemplo callcontroller('inicio') callController(controller,message Desde un controlador llamar a otro ,link) controlador donde aparecerá el mensaje y luego al presionar el botón OK irá a otro controlador dado por el parámetro: link antespor ejemplo callcontroller('informacion','No existe el usuario','inicio') 32 Libro de Kamila 1.0.1 yiyi 2009 initSession() initSession('minutos') Inicia un objeto sesión por defecto de 30 minutos. Inicia un objeto sesión cuyo parámetro es un String indicadole los minutos de la sesión. deleteSession() Elimina un objeto sesión setValueSession(variable,valor) Guarda en el objeto sesión ya iniciado en un arreglo hash el par la variable y su respectivo valor Obtiene el valor dada una variable de un objeto sesión ya iniciado. getValueSession(variable) Observaciones: Estructura de Directorios de Kamila Luego de haber instalado las librerías (gems) de soporte para Kamila, la estructura de directorios del framework: Kamila reside en la carpeta de publicación web: /var/www, en cualquier distribución Linux. La estructura de directorios de Kamila, se puede ver en la siguiente figura: Figura 8: Estructura de directorios de Kamila. Fuente: el autor. En la carpeta config, reside los archivos: config.yml que sirve para definir las siguientes variables del framework: Kamila, como: mvcplusplus, los valores que reconece Kamila es: yes, que estará 33 Libro de Kamila 1.0.1 yiyi 2009 activa en las vistas y modelos el uso del patrón de diseño: MVC++, además que en las vistas sólo se programará con las APIS de Kamila, si el parámetro es: no, no validará MVC++ y además en las vistas se puede programar con las primitivas de etiquetas de: HTML y XHTML. Además, se puden definir los mensajes de error según el idioma que desee, en el atributo defaultMessage: es, significa que los mensajes de error que emitirá el framework será en idioma español, si es: es, si se desea en idioma inglés, es: en, también puede recibir como parámetro: ruby, esto permitirá ser más ser específicos en algunos errores y los mensaje se emitirá en idioma inglés. El contenido de dicho archivo, es el siguiente: # MVC++ mvcplusplus: no # Default Messages defaultMessages: es # Definitions of Messages english: message001: Not installed mod_rewrite for Apache 2 message002: session can't created message003: Not load using require for the controller message004: Not exist the class message005: undefined action meessge006: or not exist the class message007: undefined controller message008: for controller message009: Not permited in meesage010: to using views instructions (puts,print,etc...) referenced MVC++ message011: to using active record instructions referenced MVC++ or native instruccions html,css,javascript message012: Undefined parametes for message013: View not exist message014: Not load or init Kamila or Application message015: Not installed gems for kamila, to see help installation of kamila 34 Libro de Kamila 1.0.1 yiyi 2009 message016: Configuration damaged in the file database.yml message017: Configuration file database.yml not exist message018: Syntax error in the view message019: In the folder views not exist the folder with the same name of the controller spanish: message001: No ha instalado el modulo mod_rewrite de Apache2 message002: sesion no creada message003: No se pudo cargar usando require en el controlador message004: No existe la clase message005: indefinida la accion message006: o no existe la clase message007: Indefinido el controlador message008: para el controlador message009: No esta permitido en message010: para usar instrucciones de la vista como (puts,print,etc...) referenciado por MVC++ message011: para usar instrucciones de active record referenciado por MVC++ o instrucciones nativas de html,css,javascript message012: Indefinido parametros para message013: Vista no existe message014: No se pudo cargar o iniciar Kamila o la Aplicacion message015: No estan instaladas las librerias o gems para kamila, ver la ayuda de la instalacion de kamila message016: Archivo de configuracion database.yml errada message017: El archivo de configuracion database.yml no existe message018: Sintaxis de error en la vista message019: En la carpeta views no existe la carperta con el mismo nombre del controlador El otro archivo que reside en la carpeta: config, es el archivo: database.yml, donde se definen los parámetros de conexión al motor de base de datos que se usarán en las clases de tipo modelo, de los archivos que residen en la carpeta: models. El contenido de dicho archivo es: # MySQL development: active: yes 35 Libro de Kamila 1.0.1 yiyi 2009 adapter: mysql host: localhost port: 3306 database: kamila username: root password: test: active: no adapter: mysql host: port: database: username: password: production: active: no adapter: mysql host: port: database: username: password: El método: Kamila.init(), leerá éste archivo en formato: yml y generá las siguientes variables golbales: $kamila_DatabaseAdapter = “mysql” $kamila_'DatabaseHost = “localhost” $kamila_DatabasePort = “3306” $kamila_DatabaseName = “kamila” $kamila_DatabaseUsername = “root” $kamila_DatabasePassword = “” Cuando un controlador usa el método: loadmodel(“nombre del modelo”) usará los objetos sesión antes descritos para realizar la conexión a través 36 del método: Libro de Kamila 1.0.1 yiyi 2009 ActiveRecord::Base.establish_connection de la clase: ActiveRecord basado en ORM. Por ejemplo: =begin Application: octava.rb, novena.rb y once.rb View : index.rhtml models : usuarios.rb Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 10 de Agosto del 2008 =end require "active_record" class Usuarios < ActiveRecord::Base end Ahora, sino deseamos que por defecto tomar los parámetros de conexión a un motor de base de datos definido en database.yml, podemos definir la conexión en la clase modelo. Por ejemplo, en la clase: Mensajes, que /var/www/kamila/models/mensaje.rb: =begin Application: doce.rb View : index.rhtml models : mensajes.rb Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 10 de Agosto del 2008 =end require "active_record" ActiveRecord::Base.establish_connection( :adapter => "pgsql", # Posgres :host => "192.168.232.132", :port => 5243, 37 reside en Libro de Kamila 1.0.1 yiyi 2009 :database => "mibd", :username => "root", :password => "123456" ) class Mensajes < ActiveRecord::Base end En la carpeta: controllers, se archivarán los controladores de la aplicación web y la extensión de los archivos son: *.rb, dentro de esos archivos, contendrán clases que describen la lógica del negocio y heredan de la clase: Application. En la carpeta: models, se archivarán los mdelos de la aplicación web y la extensión de los archivos son: *.rb, dentro de esos archivos, contendrán las clases que describen el nombre de las tablas que a tráves de la clase que heredan: ActiveRecord, y usarán la tecnica de programación: ORM. En la carpeta: views/nombre del controlador, se archivarán las vistas de la aplicación web y la extensión de los archivos son: *.rhtml, dentro de esos archivos, contendrán clases que describen la capa de presentación e interacción que los usuarios de la aplicación web lo harán a tráves de un navegador. En la carpeta: lib es para colocar los fuentes de ruby que sean clases para ser usada como librerías o instanciadas en los controladores. En la carpeta: public residen los recursos como: hojas de estilos, imagenes y código javascript necesitados por las vistas: *.rhtml; como se puede ver en la figura: 38 Libro de Kamila 1.0.1 yiyi 2009 Figura 1: Estructura de directorios de Kamila/public. Fuente: el autor. En la carpeta: css, donde se ubican las hojas de estilos del framework Kamila, más las hojas de estilos de los framework basado en javascript como: Livevalidation, los basados en AJAX, como: Extjs y Rialto, como también, las hojas de estilo del programador que halla creado. En la carpeta: img, donde se ubican las imagenes del framework Kamila, más las imagenes de los framework basado en javascript como: Livevalidation, los basados en AJAX, como: Extjs y Rialto, como también, las imagenes del programador que halla creado. En la carpeta: js, donde se ubican los archivos javascript del framework Kamila, más los archivos javascript de los framework basado en javascript como: Livevalidation, los basados en AJAX, como: Extjs y Rialto, como también, los archivos javascript del programador que halla creado. 39 Libro de Kamila 1.0.1 yiyi 2009 Presentación de Kamila Luego de definir los archivos de configuración el idioma, la configuración el motor de base de datos que por defecto usará la aplicación web que vamos a desarrollar y de describir la estructura de directorios y archivos del framework; veamos la presentación de Kamila. Para ello, en cualquier navegador colocamos la url en la caja de texto de direcciones, donde reside Kamila, por ejemplo: http://192.168.232.132/kamila/ Figura 2: Inicio de Kamila, Fuente: el autor. Luego el Apache2 basado en el módulo: rewrite, redirecciona según lo indique las reglas definidas en el archivo: .htaccess, que reside en la raíz del framework: Kamila a la siguiente url: Figura 3: Redireccionamiento a la presentación Kamila, Fuente: el autor. Y nos mostrará la presentación del framework Kamila: 40 Libro de Kamila 1.0.1 yiyi 2009 Figura 4: Presentación de Kamila, Fuente: el autor. Primera Aplicación usando Kamila Luego de la presentación, vamos a programar nuestra primera aplicación en Kamila. Primero programamos nuestro controlador que se llamará: primera.rb, a través de cualquier editor de texto y lo guardamos en la carpeta: /var/www/kamila/controllers. Su codigo es el siguiente: 41 Libro de Kamila 1.0.1 yiyi 2009 =begin Application: primera.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 =end require $kamila_lib+"application" class Primera < Application def initialize() end def index() render("index") end end La primera instrucción es un comentario en bloque, en ruby se denota el comienzo con: =begin y el final: =end donde se documenta la clase: Primera. La segunda instrucción es la clase que se necesita, en este caso: Application, que reside en el directorio de las librerías de ruby y que se instalarón anteriormente. Esto se hace con la instrucción: require (equivale a la instrucción include que se usa en PHP) luego la variable global del framework que contiene el camino de la librería concatenado con el archivo fuente: application.rb donde reside la clase Applicaction, en el require no se coloca la extensión del archivo: require $kamila_lib+"application". La tercera instrucción se define la clase, con la palabra reservada: class y luego se coloca su nombre con la inicial en mayúscula y la herencia se denota con el símbolo menor: < y luego el nombre de la clase que se hereda: class Primera < Application. Luego se definen los atributos de la clase, en este ejemplo no se definieron. La cuarta instrucción se define el constructor de la clase y se denota con el nombre de: initialize(), en ruby los 42 Libro de Kamila 1.0.1 yiyi 2009 métodos se definen con la palabra reservada: def, por ejemplo: def initialize(), sin parámetros en este ejemplo, luego el código, que este caso no hay y finaliza el método con la palabra reservada: end. Todos los controladores deberían definir el método: index, el framework lo sobre entenderá, en la barra de direcciones del navegador, sino se coloca la acción a ejecutar, luego que de el nombre del controlador, ejemplo: http://192.168.232.132/kamila/primera es igual a: http://192.168.232.132/kamila/primera/index El contenido del método index, es ejecutado a través del método: render(“index”), éste método es heredado de la clase Application, y su parámetro es la página a mostrar: index.rhtml, que debe residir: en la carpeta con el mismo nombre del controlador: primera, que pertenezca a la carpeta: views del framework: Kamila, en otras palabras: /var/www/kamila/views/primera/index.rhtml. El contenido de la vista: index.rhtml, que reside en la carpeta: /var/www/kamila/views/primera/index.rhtml, es el siguiente: <!-Application: primera.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Primera Aplicación') %> 43 Libro de Kamila 1.0.1 yiyi 2009 <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> <%=close_head() %> <%=create_body() %> <%=create_heading('h1','Prueba de Primera:') %><%=close_heading("h1") %> <%="Hola , mi primera aplicación con kamila" %> <%=insert_linebreaks(1) %> <%=create_heading('h1','Fin de Prueba de Primera') %><%=close_heading("h1") %> <%=close_body() %> <%=close_html() %> En el mismo se programa con las APIs definidas en la clase diseñada y programada: Application. Basado en el concepto de etiquetas personalizadas y así estandarizar la programación en la vista. Ahora ejecutemos la primera aplicación programa en el framework: Kamila, para ello debemos seguir el patrón o estándar: http://DNS ó IP /Sitio Web/controlador/accion/parámetros, http://192.168.232.132/kamila/primera es decir: ó http://192.168.232.132/kamila/primera/index en la barra de direcciones del navegador: 44 Libro de Kamila 1.0.1 yiyi 2009 Figura 5: Primera aplicación usando Kamila, Fuente: el autor. Si vemos el código generado por el framework en la vista: index.rhtml de la aplicación primera, donde a tráves del método render evalúa todas las APIs y genera el codigo HTML correspondiente para poder ser visualizado en el navegador: <!-Application: primera.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <html> <head> <title>Primera Aplicación</title> <meta name="GENERATOR" content="kamila version 1.0.0"> <meta http-equiv="Content-Type" content="text/html; charset=iso8859-1"> </head> <body> 45 Libro de Kamila 1.0.1 yiyi 2009 <h1>Prueba de Primera:</h1> Hola , mi primera aplicación con kamila <br/> <h1>Fin de Prueba de Primera</h1> </body> </html> Manejo de Errores en Kamila según MVC++ Ahora, veamos algunos errores que el framework: Kamila valida siguiendo el patrón de diseño: MVC++. Si colocamos en la barra de direcciones un método que no está definido en la clase controladora: Primera, como por ejemplo, otrometodo: http://192.168.232.132/kamila/primera/otrometodo, el framework nos emite el siguiente error: Indefinida la accion otrometodo para el controlador primera. Figura 6: Error de una acción indefinida, Fuente: el autor. Al presionar el botón OK, el framework redirecciona a la presentación de Kamila. 46 Libro de Kamila 1.0.1 yiyi 2009 Si colocamos un controlador que no esta programado, por ejemplo: otrocontrolador http://192.168.232.132/kamila/otrocontrolador, nos emite el siguiente error: Indefinido el controlador otrocontrolador. Figura 7: Error de un controlador indefinido, Fuente: el autor. Si en el método: index(), llamamos a través del método: render otra vista que no existe, por ejemplo: index1, el framework: Kamila, lo validará def index() render("index1") # Error, Vista no existe index1.rhtml 47 Libro de Kamila 1.0.1 yiyi 2009 end Figura 8: Error, Vista no existe index1.rhtml, Fuente: el autor. Si renombramos la carpeta: primera por primero, que se encuentra en: /var/www/kamila/views/, el framework: Kamila, validarará que en la carpeta: /var/www/kamila/views/ no existe una carpeta con el mismo nombre del controlador. 48 Libro de Kamila 1.0.1 yiyi 2009 Figura 9: Error, No existe en la carpeta views una carpeta con el mismo nombre del controlador, Fuente: el autor. Si renombramos la clase: Primera, por Primero, el framework Kamila, validarará y emitirá el siguiente mensaje: “indefinida la accion index o no existe la clase Primera para el controlador primera”. En otras palabras el fuente del controlador: primera.rb, debe ser del mismo nombre y con la inicial en mayúsculas: class Primera < Application por 49 Libro de Kamila 1.0.1 yiyi 2009 class Primero < Application Figura 10: Error, indefinida la accion index o no existe la clase Primera para el controlador primera, Fuente: el autor. Variables globales que usa o se definen Kamila Luego de ver el funcionamiento de la primera aplicación, ahora vamos a crear el segundo controlador, que llamaremos: segunda, en la carpeta: controllers: =begin Application: segunda.rb Views : index.rhtml models : Ninguno Autor : Edgar Gonzalez 50 Libro de Kamila 1.0.1 kamila Fecha =end yiyi 2009 : versión 1.0.0 : 18 de Julio del 2008 require $kamila_lib+"application" class Segunda < Application public def initialize() end def index() render("index") end def otro() render("index") end end Luego programamos las vista: index.rhtml, en la views/segunda: <!-Application: segunda.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Segunda Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> <%=close_head() %> <%=create_body() %> <%=create_heading('h1','Prueba de Segunda:') %><%=close_heading("h1") %> <%="$kamila_site: " %><%=$kamila_site%><%=insert_linebreaks(1) %> 51 carpeta: Libro de Kamila 1.0.1 yiyi 2009 <%="$kamila_home: " %><%=$kamila_home.to_s%><%=insert_linebreaks(1) %> <%="$kamila_controller: "%><%=$kamila_controller%><%=insert_linebreaks(1) %> <%="$kamila_action: "%><%=$kamila_action%><%=insert_linebreaks(1) %> <%="@kamila_view: "%><%=@kamila_view%><%=insert_linebreaks(1) %> <%="$kamila_DatabaseAdapter= " %><%=$kamila_DatabaseAdapter%><%=insert_linebreaks(1) %> <%="$kamila_DatabaseHost= " %><%=$kamila_DatabaseHost%><%=insert_linebreaks(1) %> <%="$kamila_DatabasePort= " %><%=$kamila_DatabasePort%><%=insert_linebreaks(1) %> <%="$kamila_DatabaseName= " %><%=$kamila_DatabaseName%><%=insert_linebreaks(1) %> <%="$kamila_DatabaseUsername= " %><%=$kamila_DatabaseUsername%><%=insert_linebreaks(1) %> <%="$kamila_DatabasePassword= " %><%=$kamila_DatabasePassword%><%=insert_linebreaks(1) %> <%=create_heading('h1','Fin de Prueba de Segunda') %><%=close_heading("h1") %> <%=close_body() %> <%=close_html() %> Al ejecutarlo en el navegador: http://192.168.232.132/kamila/segunda ó podemos llamar el método: otro() de la clase: segunda: http://192.168.232.132/kamila/segunda/otro y hará lo mismo. La salida es la siguiente: 52 Libro de Kamila 1.0.1 yiyi 2009 Figura 11: Segunda aplicación usando Kamila, Fuente: el autor. Esta aplicación, nos permite ver las variables globales que se denotan con el prefijo: $ y son las siguientes: $kamila_site $kamila_home $kamila_controller $kamila_action $kamila_view. Y las variables globales: $kamila_DatabaseAdapter $kamila_DatabaseHost $kamila_DatabasePort $kamila_DatabaseName $kamila_DatabaseUsername 53 Libro de Kamila 1.0.1 yiyi 2009 $kamila_DatabasePassword Pase de Parámetros en Kamila a tráves de GET En la aplicación: tercera, veamos como es el pase de parámetros vía url, usando el estándar: GET en vez de POST. Para ello creamos la clase o controlador: Tercera, en la carpeta: controllers: =begin Application: tercera.rb Views : otro_index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 =end require $kamila_lib+"application" class Tercera < Application private @atributo = nil @parametros = nil @parametro1 = nil @parametro2 = nil @valor = nil public attr_accessor :atributo def initialize() @atributo = "nada" @parametros = Array.new @parametro1 = Array.new @parametro2 = Array.new end def index() render("otro_index") end def hola() @parametros = $kamila_params_get.split("&") 54 Libro de Kamila 1.0.1 yiyi 2009 @atributo = "yiyi" @valor = 10 render("otro_index") end def otro() if $kamila_params_get.to_s!='' begin @parametros = $kamila_params_get.split("&") @parametro1 = @parametros[0].split("=") @parametro2 = @parametros[1].split("=") rescue @parametro1 = @parametros[0].split("=") end end render("otro_index") end end En la primera parte declaramos los atributos de la clase que son atributos de instancias, los atributos de instancias llevan el prefijo: @ y los atributos de clase llevan el prefijo: @@, en ruby y la inicializamos con nil, es decir, con nada: private @atributo = nil @parametros = nil @parametro1 = nil @parametro2 = nil @valor = nil En ruby para declarar lo equivalente en Java a los métodos getter y setter para cada atributo, se declara en la sección pública con: attr_accessor: public attr_accessor :atributo 55 Libro de Kamila 1.0.1 yiyi 2009 Después se crea el constructor de la clase y se inicializa, el atributo: @atributo con la cadena de carácteres: “nada”, y a los atributos de instancias: @parametros, @parametro1, @parametro2 como objetos de Arreglos, al atributo de instancia @valor con cero y se crea una variable de sesión 'valor' con el valor de cero. Es bueno hacer notar que en ruby no es tipeado como Java o C++, por lo tanto no se declaran los atributos con un tipo especifíco de datos: def initialize() @atributo = "nada" @parametros = Array.new @parametro1 = Array.new @parametro2 = Array.new @valor = 0 end Luego declaramos el método index() que llama a la vista: otro_index.rhtml a tráves del método render: def index() render("otro_index") end Después definimos al método: hola() que asigna al atributo de instancia: @parametros que es un arreglo, en cada posición los parámetros dados en el url separado cada parámetro y valor por el carácter: &, que están contenido en la variable global: @kamila_params_get y a tráves del método split, se obtienen cada par, parámetro y valor. En otras palabras el usuario coloca en la caja de texto del navegador la url: http://192.168.232.132/kamila/tercera/hola/cedula=1234567&nombre=camila ^ | ^ | 56 ^ | ^ | Libro de Kamila 1.0.1 yiyi 2009 controlador acción parámetro 1 parámetro 2 def hola() @parametros = $kamila_params_get.split("&") @atributo = "yiyi" @valor = 10 render("otro_index") end Al ejecutar: @parametros = $kamila_params_get.split("&"), asigna, en la posición cero, del atríbuto @parametros, @parametros[0] = “cedula=1234567” y la posición 1, @parametros[1] = “nombre=camila”. Si vemos la ejecución de la misma la salida es la siguiente: Figura 12: Tercera aplicación usando Kamila, pase de parámetros vía GET, Fuente: el autor. La definición del método: otro() , es más especifíco para extaer los parámetros. @parametro1[0]=”cedula”, @parametro1[0]=”123456” y @parametro2[0]=”nombre”, @parametro2[0]=”camila” def otro() if $kamila_params_get.to_s!='' 57 Libro de Kamila 1.0.1 yiyi 2009 begin @parametros = $kamila_params_get.split("&") @parametro1 = @parametros[0].split("=") @parametro2 = @parametros[1].split("=") rescue @parametro1 = @parametros[0].split("=") end end render("otro_index") end El manejo de excepciones en ruby, es usando begin/rescue. Si hay una excepción al extraer los parámetros en: @parametros[1].split("="), porque puede no existir, entonces sólo extraerá: @parametros[0].split("="). La ejecución de la misma la veremos en la siguiente pantalla: Figura 13: Tercera aplicación usando Kamila, ejecutando la acción: otro, Fuente: el autor. El código de la vista de tercera: otro_index.rhtml es el siguiente: <!-Application: tercera.rb 58 Libro de Kamila 1.0.1 View models Autor kamila Fecha yiyi 2009 : otro_index.rhtml : Ninguno : Edgar Gonzalez : versión 1.0.0 : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Tercera Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> <%=close_head() %> <%=create_body() %> <%=create_heading('h1','Prueba de otro_index:') %><%=close_heading("h1") %> <%="Parametros: "%><%=$kamila_params_get %> <%=insert_linebreaks(1) %> <%=create_heading('h1','Parámetro 1:') %><%=close_heading("h1") %> <%="Parametro: "%><%=@parametro1[0].to_s %> <%=insert_linebreaks(1) %> <%="Valor: "%><%=@parametro1[1].to_s %> <%=insert_linebreaks(1) %> <%=create_heading('h1','Parámetro 2:') %><%=close_heading("h1") %> <%="Parametro: "%><%=@parametro2[0].to_s %> <%=insert_linebreaks(1) %> <%="Valor: "%><%=@parametro2[1].to_s %> <%=insert_linebreaks(1) %> <%=create_heading('h1','Fin de otro_index') %><%=close_heading("h1") %> <%=close_body() %> <%=close_html() %> Uso de Apis de Kamila basadas en Livevalidation En el siguiente ejemplo, vamos a ver las bondades de las APIs que tienen relación con la librería basada en javascript: Livevalidation; este conjunto de funciones nos permite validar los datos de entrada, como también, al presionar un botón para enviar los datos vía submit, entonces no se permitirá la enviada de datos, hasta que el usuario llene los datos según el tipo de datos que se solicite. 59 Libro de Kamila 1.0.1 yiyi 2009 Para ello creamos el controlador: cuarta.rb, en la carpeta: controllers, a la clase la llamaremos: Cuarta. Figura 14 de la clase: Cuarta, Fuente el autor. Si observamos la figura, en las líneas del 1 al 8, son los comentario en bloque de la clase Cuarta. En la línea 10, se debe incluir el fuente de la clase applicaction.rb. En la línea 11 declaramos la clase: Cuarta que hereda de Applicaction, desde la línea 13 hasta la 27, declaramos los atributos de instancias de la clase Cuarta. Figura 15 de la clase: Cuarta, definición del constructor y el método index, Fuente el autor. 60 Libro de Kamila 1.0.1 yiyi 2009 En la línea 29 a la 30 definimos al constructor de la clase, y desde la línea 31 hasta la 33 al método: index, donde en la 32 se llama al método render que mostrará la vista: index.rhtml. Figura 16 de la clase: Cuarta, definición métodos: recibirParametros_uno y recibirParametros_dos, Fuente el autor. En la línea 34 definimos el método: recibirParametros_uno(), donde cada variable de instancia, por ejemplo como la línea 34, el atributo @usuario se le asigna el parámetro recibido a vía: POST a tráves del formulario que se encuentra diseñado en la vista: index.rhtml. $kamila_cgi, es un objeto global que contiene los parámetros vía: POST. Recuerde que en el ejemplo anterior, enviamos datos vía: GET, donde el objeto: $kamila_params_get contiene los parámetros enviado por esa vía. En la línea 49, a tráves del método render, llamamos la vista: recibirParametros_uno.rhtml para que muestre los datos enviados vía: POST, validados antes en el formulario que se encuentra en la vista: index.rhtml. 61 Libro de Kamila 1.0.1 yiyi 2009 Desde la línea 51 a la 54, se define el método: recibirParametros_dos(), donde la línea 52, se denota con el método: params del objeto global: $kamila_cgi, como otra forma de recibir todos los parámetros enviados vía: POST, desde el formulario que se encuentra en: index.rhtml. Para accesar cada parámetro, sería de la forma @arregloparametros['usuario'], como se verá en la vista: recibirParametros_dos.rhtml, que es llamada en la línea 53 a tráves del método, render. Veamos la ejecución de cuarta, llamado a la acción: index, que a su vez llama a la vista: index.rhtml, donde reside el formulario que capta los diferentes tipos de datos que se base de la librería: Livevalidation: Figura 17: Ejecución del controlador: cuarta, acción: index, Fuente el autor. Cada campo tiene un tipo de dato que es definido por las APIs basada en la librería: Livevalidation, por ejemplo: Usuario es alfanúmerico, pero todos los campos además, no se permite que esten vacíos, si presionamos el botón: Aceptar, se enviará un error, porque no se llenaron todos los datos según su tipo. 62 Libro de Kamila 1.0.1 yiyi 2009 Figura 18: Ejecución del controlador: cuarta, mostrando el error por no llenar los datos correspondientes, en la vista: index.rhtml, Fuente el autor. Veamos el código de la vista: index.rhtml, donde reside el formulario que muestra la figura anterior. Figura 19: Fuente de la vista index.rhtml, líneas 1 a la 21, Fuente el autor. Desde la línea 1 hasta la 8, comentarios en bloque documentando la vista. La línea 10 se llama a la API o método de la clase Applicaction: create_html(), que genera la etiqueta: <html>, asi mismo desde las líneas: 11, 12, 19, 20 y 21 a las etiquetas: <head>, <title>,</head>, 63 Libro de Kamila 1.0.1 yiyi 2009 <body> y <div> respectivamente. La línea 15 incluye al archivo de definición de hoja de estilo: estilo_rojo.css que debemos ubicar en la carpeta: public/css del framework. En la línea 16, llamamos a la API o función: create_javascript_livevalidation(), que agrega la librería de javascript y hoja de estilo de la librería que necesitarán para las otras APIs de entrada de datos basadas en la misma. La línea: 17, agrega las librería de javascript: Extjs, para los mensajes de error que se mostrarán, de hecho el framework: Kamila, para los mensajes de error se basan en: Extjs, la línea: 18, agrega la librería de javascript: MD5, el algoritmo de encriptación para los campos de tipo password, para la API: input_text_presence_lv('md5','form','f2','clave','','false',12,12,'fals e','introduzca la clave',2,'cajatexto') Figura 20: Fuente de la vista index.rhtml, líneas 22 a la 42, Fuente el autor. La línea 27, se llama a la API o función create_form, donde se crea un formulario basado en el envío de datos al servidor vía: POST, y la acción o método del controlador cuarta es: recibirParametros_dos(). En la línea 32, se llama a la API o función: insert_text, que agrega el texto o etiqueta: Usuario, en la línea 40, se llama a la función: input_text_presence_lv, donde se crea una caja de texto con los 64 Libro de Kamila 1.0.1 yiyi 2009 parámetros dados, donde se valida que sea alfanúmerico y no puede estar vacío, si lo está, aparece un mensaje de error al lado de la caja de texto que está vacío, todas estas APIs un funciones que se una en esta vista, se basan en la librería: Livevalidation. A continuación todo el fuente de la vista: index.rhtml, que contiene todas las APIs basada en: Livevalidation, de todos los tipos de datos que se pueden usar. <!-Application: cuarta.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Cuarta Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> <%=create_css('estilo_rojo.css') %> <%=create_javascript_livevalidation()%> <%=create_javascript_extjs() %> <%=create_javascript_md5() %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','Formulario de Prueba de Cuarta:') %> <%=close_div() %> <!-create_form parametros: id, name, method, action --> <%=create_form('form','form','POST','cuarta/recibirParametros_dos') %> <%=create_paragraphs('p1','','h12d') %> <%=create_table("0") %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Usuario: ') %> <%=close_td() %> <%=create_td() %> <!-65 Libro de Kamila 1.0.1 yiyi 2009 input_text_presence_lv parametros: type, nameform, id, name, value, readonly=true o false, size, maxlength, disabled, alt, tabindex, css --> <%=input_text_presence_lv('text','form','f1','usuario','','false',12,12,' false','introduzca el usuario',1,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Clave: ') %> <%=close_td() %> <%=create_td() %> <!-input_text_presence_lv parametros: type, id, name, value, readonly, size, maxlength, disabled, alt, tabindex, css --> <%=input_text_presence_lv('md5','form','f2','clave','','false',12,12,'fa lse','introduzca la clave',2,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('nivel: ') %> <%=close_td() %> <%=create_td() %> <!-input_numericality_lv parametros: typeinteger: true o false, type, id, name, value, readonly, size, maxlength, disabled, alt, tabindex, css --> <%=input_numericality_lv('true','text','f3','nivel','','false',12,12,'false ','introduzca el nivel',3,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('texto: ') %> <%=close_td() %> <%=create_td() %> <!-input_length_lv parametros: typelength: is, minumum o maximum; typesize: numero, type, id, 66 Libro de Kamila 1.0.1 yiyi 2009 name, value, readonly, size, maxlength, disabled, alt, tabindex, css --> <%=input_length_lv('is',5,'text','f4','texto','','false',12,12,'false','intr oduzca un texto',4,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('rango 1: ') %> <%=close_td() %> <%=create_td() %> <!-input_inclusion_lv parametros: range: edgar,yiyi; partial: true o false, type, id, name, value, readonly, size, maxlength, disabled, alt, tabindex, css --> <%=input_inclusion_lv('edgar,yiyi','true','text','f5','rango1','','false',1 2,12,'false','introduzca edgar o yiyi',5,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('rango 2: ') %> <%=close_td() %> <%=create_td() %> <!-input_exclusion_lv parametros: range: edgar,yiyi o A..9, A..Z, a..9, a..z, 0..9; partial: true o false, type, id, name, value, readonly, size, maxlength, disabled, alt, tabindex, css --> <%=input_exclusion_lv('0..9','true','text','f6','rango2','','false',12,12,' ','Introduzca alfabeticos exceptos del 0 al 9',6,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Frase: ') %> <%=close_td() %> <%=create_td() %> <!-input_textarea_presence_lv parametros: id, name, value, readonly, disabled, alt, tabindex, css, rows, cols --> 67 Libro de Kamila 1.0.1 yiyi 2009 <%=input_textarea_presence_lv('f7','frase','algo','false','false','intro duzca una frase',7,'cajatexto3','5','30') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Acepto: ') %> <%=close_td() %> <%=create_td() %> <!-input_checkbox_lv parametros: id, name, value, readonly, disabled, alt, tabindex, css --> <%=input_checkbox_lv('f8','acepto','1','false','false','Acepte por favor',8) %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Sexo: ') %> <%=close_td() %> <%=create_td() %> <!-input_radio_button_lv parametros: id, name, value, readonly, disabled, alt, tabindex, css --> <%=input_radio_button_lv('f9','sexo','Hombre','false','false','Diga el sexo por favor',9) %> <%=input_radio_button_lv('f10','sexo','Mujer','false','false','Diga el sexo por favor',10) %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Seleccione: ') %> <%=close_td() %> <%=create_td() %> <!-input_combobox_lv parametros: id, name, range, readonly, disabled, alt, tabindex, css --> <%=input_combobox_lv('f11','seleccion','lara,caracas,merida,zulia',' false','false','selecciones un estado',11,'cajatexto') %> <%=close_td() %> 68 Libro de Kamila 1.0.1 yiyi 2009 <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Email: ') %> <%=close_td() %> <%=create_td() %> <!-input_validate_email_lv parametros: id, name, value, readonly, size, maxlength, disabled, alt, tabindex, css --> <%=input_validate_email_lv('f12','correo','','false',150,150,'false','in troduzca un email',12,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Solo alfa numericos: ') %> <%=close_td() %> <%=create_td() %> <!-input_text_key_validate_lv parametros: formname,range,type=text,password,md5, id, name, value, readonly=true o false, size, maxlength, disabled, alt, tabindex, css --> <%=input_text_key_validate_lv('form','a..9','md5','f13','solonumeros ','','false',12,12,'false','introduzca solo alfa numericos',13,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Solo letras en el area de texto: ') %> <%=close_td() %> <%=create_td() %> <!-input_textarea_key_validate_lv parametros: range,id, name, value, readonly, disabled, alt, tabindex, css, rows, cols --> <%=input_textarea_key_validate_lv('a..z','f14','sololetras','','false','fa lse','introduzca solo letras',14,'cajatexto3','5','30') %> <%=close_td() %> <%=close_tr() %> 69 Libro de Kamila 1.0.1 yiyi 2009 <%=close_table() %> <%=input_hidden('f15','tipo','buscar') %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <!-input_submit parametros: id, name, value, css, form, hidden1,valor1...hiddenn,valorn --> <%=input_submit_lv('f30','Aceptar','Aceptar','botones','form','tipo,eli minar') %> <%=input_reset_lv('f31','Cancelar','Cancelar','botones') %> <!-close_form sin parametros --> <%=close_form() %> <!-create_massValidate parametros: form, id1,id2,...,idn, messageError --> <%=create_massValidate_lv('f1,f2,f3,f4,f5,f6,f7,f8,f12,f13,f14','Datos No completados') %> <%=select_focus('form','usuario') %> <%=create_div('div2','h1','Fin de Prueba de Cuarta') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> También el fuente de: recibirParametros_uno.rhtml: <!-Application: cuarta.rb View : recibirParametros_uno.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Cuarta Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> 70 Libro de Kamila 1.0.1 yiyi 2009 <%=create_css('estilo_rojo.css') %> <%=create_javascript_livevalidation(“es”)%> <%=create_javascript_extjs() %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','recibirParametros_uno: Datos llenados del Formulario de Cuarta:') %> <%=close_div() %> <%=create_paragraphs('p1','','h12d') %> <%=insert_text('Usuario: ') %><%=@usuario%> <%=insert_linebreaks(1) %> <%=insert_text('Clave: ') %><%=@clave%> <%=insert_linebreaks(1) %> <%=insert_text('Nivel: ') %><%=@nivel%> <%=insert_linebreaks(1) %> <%=insert_text('Texto: ') %><%=@texto%> <%=insert_linebreaks(1) %> <%=insert_text('Rango 1: ') %><%=@rango1%> <%=insert_linebreaks(1) %> <%=insert_text('Rango 2: ') %><%=@rango2%> <%=insert_linebreaks(1) %> <%=insert_text('Frase: ') %><%=@frase%> <%=insert_linebreaks(1) %> <%=insert_text('Acepto: ') %><%=@acepto%> <%=insert_linebreaks(1) %> <%=insert_text('Sexo: ') %><%=@sexo%> <%=insert_linebreaks(1) %> <%=insert_text('Seleccion: ') %><%=@seleccion%> <%=insert_linebreaks(1) %> <%=insert_text('Correo: ') %><%=@correo%> <%=insert_linebreaks(1) %> <%=insert_text('solo numeros: ') %><%=@solonuneros%> <%=insert_linebreaks(1) %> <%=insert_text('solo letras: ') %><%=@sololetras%> <%=insert_text('tipo: ') %><%=@tipo%> <%=insert_linebreaks(1) %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=create_div('div1','h1','Fin de recibirParametros_uno de Cuarta') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> 71 Libro de Kamila 1.0.1 yiyi 2009 Como también el fuente de: recibirParametros_dos.rhtml: <!-Application: cuarta.rb View : recibirParametros_dos.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Cuarta Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> <%=create_css('estilo_rojo.css') %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','recibirParametros_dos: Datos llenados del Formulario de Cuarta:') %> <%=close_div() %> <%=create_paragraphs('p1','','h12d') %> <% for i in [email protected] %> <% case i %> <% when 0 %> <%=insert_text('Usuario: ') %><%=@arregloparametros['usuario'].to_s %> <% when 1 %> <%=insert_text('Clave: ') %><%=@arregloparametros['clave'].to_s %> <% when 2 %> <%=insert_text('Nivel: ') %><%=@arregloparametros['nivel'].to_s %> <% when 3 %> <%=insert_text('Texto: ') %><%=@arregloparametros['texto'].to_s %> <% when 4 %> <%=insert_text('Rango 1: ') %><%=@arregloparametros['rango1'].to_s %> <% when 5 %> <%=insert_text('Rango 2: ') %><%=@arregloparametros['rango2'].to_s %> 72 Libro de Kamila 1.0.1 yiyi 2009 <% when 6 %> <%=insert_text('Frase: ') %><%=@arregloparametros['frase'].to_s %> <% when 7 %> <%=insert_text('Acepto: ') %><%=@arregloparametros['acepto'].to_s %> <% when 8 %> <%=insert_text('Sexo: ') %><%=@arregloparametros['sexo'].to_s %> <% when 9 %> <%=insert_text('Seleccion: ') %><%=@arregloparametros['seleccion'].to_s %> <% when 10 %> <%=insert_text('Correo: ') %><%=@arregloparametros['correo'].to_s %> <% when 11 %> <%=insert_text('Solo Numeros: ') %><%=@arregloparametros['solonumeros'].to_s %> <% when 12 %> <%=insert_text('Solo Letras: ') %><%=@arregloparametros['sololetras'].to_s %> <% when 13 %> <%=insert_text('tipo: ') %><%=@arregloparametros['tipo'].to_s %> <% end %> <%=insert_linebreaks(1) %> <% end %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=create_div('div1','h1','Fin de recibirParametros_dos de Cuarta') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> Veamos la ejecución cuando se llenan todos los datos, según el tipo que se pide, y llamará al método: recibirParametros_dos(), de la clase cuarta, que a su vez llamará a la vista: recibirParametros_dos.rhtml. Si deseamos llamar al método: recibirParametros_uno(), solo cambiamos el último parámetro a la API o función: create_form(), y sustituir: 'cuarta/recibirParametros_dos' por: 'cuarta/recibirParametros_uno', que a su vez llamará a la vista: 73 Libro de Kamila 1.0.1 recibirParametros_uno.rhtml, framework: MVC++. yiyi 2009 basado según las reglas del Figura 21: Ejecución de la vista: index.rhtml, con los datos correctos, Fuente el autor. 74 Libro de Kamila 1.0.1 yiyi 2009 Figura 22: Vista: recibirParametros_dos.rhtml, donde recibe los datos desde la vista: index.rhtml, del controlador: cuarta, Fuente el autor. APIS de Kamila basado en el Framework Extjs El ejemplo del controlador: cuarta.rb, demuestra el uso de las APIs del framework, basada en la librería: Livevalidation. Del mismo modo, el controlador: quinta.rb, demostrará lo equivalente, pero usando, el framework o librería: Extjs. Para ello creamos el controlador: quinta.rb, que dentro del mismo, se encuentra la clase: Quinta: =begin Application: quinta.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 75 Libro de Kamila 1.0.1 yiyi 2009 =end require $kamila_lib+"application" class Quinta < Application def initialize() end def index() render("index") end def recibirParametros_dos() @arregloparametros = $kamila_cgi.params render("recibirParametros_dos") end end Ahora veamos el fuente, de la vista: index.rhtml, donde reside el formulario, que contiene las APIs, basada en la librería: Extjs: <!-Application: quinta.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Quinta Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('estilo_rojo.css') %> <%=create_javascript_extjs() %> <%=create_javascript_md5() %> <%=create_javascript_language_extjs('es','ascii') %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','Formulario de Prueba de Quinta:') %> <%=close_div() %> <%=create_form('form','form','POST','quinta/recibirParametros_dos') %> 76 Libro de Kamila 1.0.1 yiyi 2009 <%=create_paragraphs('p1','','h12d') %> <%=create_table("0") %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e1','300','Nombre:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_textField_extjs('f1','nombre','textfield','130','false','','false','cajatex to') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e2','300','Clave:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_textField_extjs('f2','clave','md5','130','false','','false','h12e') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e3','300','Cedula:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_numberField_extjs('f3','cedula','integer','130','false','','false','h12e' ) %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e4','300','Monto Bs.F.:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_numberField_extjs('f4','monto','double','130','false','','false','h12m' ) %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e5','300','Sexo:','false','h12e') %> 77 Libro de Kamila 1.0.1 yiyi 2009 <%=close_td() %> <%=create_td() %> <%= input_radioGroup_extjs('f5','sexo','70,70','Mujer,1,false| Hombre,2,true','false','h12b') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e6','300','Estados:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_comboBox_extjs('f6','estado','175','Amazonas,Apure,Lara,Merida, Sucre','Seleccione un Estado...','false','cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e7','300','Correo:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_emailField_extjs('f7','correo','180','false','','false','h12e') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e8','300','Titulos:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_checkboxGroup_extjs('f8','titulos','120,120','Titulo Bachiller,titulo1,true|Titulo Pregrado,titulo2,false,|Titulo Postgrado,titulo3,false|Titulo Doctorado,titulo4,false','false','h12b') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e9','300','Hora:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_timeField_extjs('f9','hora','130','12:00 PM','2:00 PM','1','false','','false','cajatexto') %> <%=close_td() %> <%=close_tr() %> 78 Libro de Kamila 1.0.1 yiyi 2009 <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e10','300','Memo:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_textArea_extjs('f10','memo','600','150','false','','false','cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e11','300','Curriculum:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_htmlEditor_extjs('f11','curriculum','Coloque algo','600','300','false','false','h12e') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e12','300','Fecha:','false','h12e') %> <%=close_td() %> <%=create_td() %> <%= input_datefield_extjs('idfecha','fecha','20/08/2008','false','Fecha requerida','false','Fecha super invalida') %> <%=close_td() %> <%=close_tr() %> <%=close_table() %> <%=input_hidden('f15','tipo','buscar') %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=input_submit_extjs('f30','Aceptar','Aceptar','x-btnclick','form','tipo,eliminar','massValidateExtjs()') %> <%=input_reset_extjs('f31','Cancelar','Cancelar','x-btn-click') %> <%=close_form() %> <%=create_massValidate_extjs('massValidateExtjs()','nombre,clave,ced ula,monto,correo,hora,memo,fecha','Datos no completados') %> <%=select_focus('form','nombre') %> <%=create_div('div11','h1','Fin de Prueba de Quinta') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> 79 Libro de Kamila 1.0.1 yiyi 2009 Veamos la vista: index.rhtml, al ejecutar el controlador: quinta: Figura 23: Ejecución del controlador: quinta, acción: index, Fuente el autor. Si presionamos el botón: Aceptar, emitirá un error porque no se llenaron todos los datos: Figura 24: Ejecución del controlador: quinta, mostrando el error por no llenar los datos correspondientes, en la vista: index.rhtml, Fuente el autor. 80 Libro de Kamila 1.0.1 yiyi 2009 Si llenamos todos los datos correspondiente de la vista: index.rhtml, del controlador: quinta, la acción del formulario de: index.rhtml, llamará al método: recibirParametros_dos() y este a su vez llamará a la vista: recibirParametros_dos.rhtml. Figura 25: Vista: recibirParametros_dos.rhtml, donde recibe los datos desde la vista: index.rhtml, del controlador: quinta, Fuente el autor. 81 Libro de Kamila 1.0.1 yiyi 2009 Apis de Kamila basada en Extjs para validaciones de Rangos de Fechas Nuestro controlador se llamará: sexta.rb, por supuesto la clase se llamará: Sexta, he aquí su fuente: =begin Application: sexta.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 =end require $kamila_lib+"application" class Sexta < Application def initialize() end def index() render("index") end def otro() render("index") end end Ahora veamos el fuente de la vista: index.rhtml <!-Application: sexta.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Sexta Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> 82 Libro de Kamila 1.0.1 yiyi 2009 <%=create_css('estilo_rojo.css') %> <%=create_javascript_extjs() %> <%=create_javascript_language_extjs('es','ascii') %> <%=create_javascript_validate_rangedate_extjs('validarrangofec ha') %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','Formulario de Prueba de Sexta:') %> <%=close_div() %> <!-create_form parametros: id, name, method, action --> <%=create_form('form','form','POST','primera') %> <%=create_paragraphs('p1','','h12d') %> <%=create_table("0") %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Fecha de inicio: ') %> <%=close_td() %> <%=create_td() %> <%= input_datefield_extjs('fechainicio','fechaini','','false','Fecha requerida','Fecha invalida','1','validarrangofecha','false','fechafinal') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Fecha de Finalizacion: ') %> <%=close_td() %> <%=create_td() %> <%= input_datefield_extjs('fechafinal','fechafin','','false','Fecha requerida','Fecha invalida','2','validarrangofecha','false','fechainicio') %> <%=close_td() %> <%=close_tr() %> <%=close_table() %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <!-input_submit parametros: id, name, value, css 83 Libro de Kamila 1.0.1 yiyi 2009 --> <%=input_submit('f30','Aceptar','Aceptar','botones') %> <!-close_form sin parametros --> <%=close_form() %> <%=create_div('div1','h1','Fin de Prueba de Sexta') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> En la vista hay dos (2) Apis importante para solicitar las fechas y validarla para que este dentro de un rango: La primera API es: create_javascript_validate_rangedate_extjs('validarrangofecha') Esta api, permite generar el javascript basado en el framework Extjs, donde el parámetro que se le pasa, es el nombre de la función que hara la validación entre rango de fechas. La segunda API es: input_datefield_extjs('fechainicio','fechaini','','false','Fecha requerida','Fecha invalida','1','validarrangofecha','false','fechafinal') input_datefield_extjs('fechafinal','fechafin','','false','Fecha requerida','Fecha invalida','2','validarrangofecha','false','fechainicio') Note el primer parámetro es el nombre del campo o id: fechainicio, del campo de la primera fecha solicitada, es decir la fecha de inicio, además se puede resaltar el parámetro de la función de validación de rango que es: validarangofecha y el último parámetro: fechafinal, que es el id o nombre del campo fecha para la validación dentro del rango. De igual modo el segundo campo fecha: fechafinal, que tiene lo equivalente, pero el último campo, es el id o nombre del campo: 84 Libro de Kamila 1.0.1 yiyi 2009 fechainicio, que la fecha de inicio para la validación del rango a tráves de la función: validarrangofecha. Veamos la ejecución de la misma Figura 26: Ejecucuón de Sexta, Fecha de Inicio: 26/09/2008. Fuente el autor. En la fecha de inicio, se escogio: 26/09/2008, cuando se escoja la segunda fecha, la función: validarrangofecha, no permitirá escoger fechas anteriores a: 26/09/2008, ya que dibujará el calendario en dichas fechas inferiores en gris y desabilitadas para escoger. 85 Libro de Kamila 1.0.1 yiyi 2009 Figura 27: Ejecucuón de Sexta, Fecha de Final debe ser mayor o igual a: 26/09/2008. Fuente el autor. Crear TabPanel usando Kamila Esta API de Kamila, llamada: create_tabpanel_extjs, permite crear u marco con pestañas, donde cada pestaña se puede llamar un controlador y este a su vez llamará a la vista respectiva que se verá en dicha pestaña. Los métodos de estos controladores, que llaman a su vista respectiva, no pueden llamar vistas de tipo formulario, porque NO funcionan en dicha pestaña. Solo se llaman vistas para mostrar información estática o dinámica que no tenga formularios. Para ello creamos el controlador: septima.rb y por supuesto su clase se llama: Septima, he aquí su fuente: =begin Application: septima.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de Julio del 2008 =end require $kamila_lib+"application" 86 Libro de Kamila 1.0.1 yiyi 2009 class Septima < Application @itemsTitulos=nil @id=nil @activo=nil @expandible=nil @flotante=nil @amplitud=nil @altura=nil @plano=nil @itemsTitulos=nil @itemsIcons=nil @itemsTips=nil @itemsUrls=nil @itemsCloseable=nil @columna=nil @fila=nil def initialize() end def index() @id = 'f1' @activo = '0' @expandible = 'true' @flotante = 'true' @amplitud = '600' @altura = '510' @plano = 'false' @itemsTitulos = 'Primera,Segunda,Tercera' @itemsIcons = 'icon1,icon2,icon3' @itemsTips = 'Ejemplo de Primera,Ejemplo de Segunda,Ejemplo de Tercera' @itemsUrls = $kamila_site+'/'+'primera,' @itemsUrls = @itemsUrls+$kamila_site+'/'+'segunda,' @itemsUrls = @itemsUrls+$kamila_site+'/'+'tercera' @itemsCloseable = 'false,false,true' #@columna='parseInt(screen.width * 0.25)' @columna='300' #@fila='parseInt(screen.height * 0.075)' @fila='75' render("index") end end 87 Libro de Kamila 1.0.1 yiyi 2009 Podemos notar todos los atributos de la clase, llenados en el método: index con los valores respectivos, que luego serán parámetros para la API: create_tabpanel_extjs, en la llamada de la vista: index.rhtml. Veamos ahora el fuente de: index.rhtml: <!-Application: septima.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 01 de agosto del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Septima Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','iso-8859-1') %> <%=create_css('estilo_rojo.css') %> <%=create_javascript_extjs() %> <%=close_head() %> <%=create_body() %> <%=create_tabpanel_extjs(@id,@activo,@expandible,@flotante,@ amplitud,@altura,@plano,@itemsTitulos,@itemsIcons,@itemsTip s,@itemsUrls,@itemsCloseable,@columna,@fila) %> <%=close_div() %> <%=close_body() %> <%=close_html() %> 88 Libro de Kamila 1.0.1 yiyi 2009 Ahora veamos la ejecución de: séptima, por defecto carga la primera pestaña, donde dentro de la misma ejecuta la aplicación: primera, luego le damos a la segunda pestaña, y ejecutará a la seggunda aplicación, y asi la tercera. Note que podemos mover el Panel y además la tercera pestaña tiene la propiedad de poder cerrarla: Figura 28: Ejecución del controlador: septima, acción: index, ejemplo usando la API create_tabpanel_extjs. Fuente el autor. Grid o Catálogo Estático Una de las facilidades en cualquier aplicación sea de escritorio o web, es el uso de GRID o rejillas donde una de sus utilidades para el usuario, es mostrar la información en forma de un catálogo, donde el usuario navega en dicho grid o catálogo escoge el item o registro y este a su vez es traido en un formulario llenando los datos en cada caja de texto. 89 Libro de Kamila 1.0.1 yiyi 2009 Para ello, Kamila tiene la API: create_gridView_extjs, basada en el framework Extjs. A pesar que los datos son traidos de la tabla de la base de datos en el controlador y pasado a la API, se define como estático, porque cualquier cambio hecho en las tablas, el usuario tendría que hacer un request a toda la página, es decir llamar de nuevo al controlador, para que los datos sean actualizados en el catálogo. Para demostrar el uso de está API, primero creamos el controlador: octava.rb: =begin Application: octava.rb View : index.rhtml models : Ninguno. Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 09 de Agosto del 2008 =end require $kamila_lib+"application" class Octava < Application public def initialize() end def index() existe = loadmodel("mensajes") if existe==true @objetoDatosm = '|' @objetoMensajes=Mensajes.find(:all) totalregistros = @objetoMensajes.length i=1 @objetoMensajes.each do |mensaje| @objetoDatosm = @objetoDatosm + mensaje.descripcion + ',' if i==totalregistros @objetoDatosm = @objetoDatosm + mensaje.vinculo else @objetoDatosm = @objetoDatosm + mensaje.vinculo + '|' end i=i+1 end end existe = loadmodel("usuarios") if existe==true @objetoDatosu = '|' @objetoUsuarios=Usuarios.find(:all) totalregistros = @objetoUsuarios.length 90 Libro de Kamila 1.0.1 yiyi 2009 i=1 @objetoUsuarios.each do |usuario| @objetoDatosu = @objetoDatosu + usuario.usuario + ',' @objetoDatosu = @objetoDatosu + usuario.clave + ',' if i==totalregistros @objetoDatosu = @objetoDatosu + usuario.nivel else @objetoDatosu = @objetoDatosu + usuario.nivel + '|' end i=i+1 end end @nombreFuncion = 'catalogousuarios' @titulo = 'Catalogo de Usuario' @idGrid = 'miGrid' @ids = 'f1,f2,f3' @ds = 'usuario,clave,nivel' @cm = 'Usuario, Clave, Nivel' @amplitudcm = '70,120,30' render("index") end end Ahora veamos el contenido o fuente de la vista: index.rhtml: <!-Application: octava.rb View : index.rhtml models : usuarios y mensajes. Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 09 de Agosto del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Octava Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('estilo_rojo.css') %> <%=create_javascript_livevalidation("en")%> <%=create_javascript_extjs() %> 91 Libro de Kamila 1.0.1 yiyi 2009 <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','Formulario de Prueba de Octava:') %> <%=close_div() %> <%=create_form('form','form','POST','primera') %> <%=create_paragraphs('p1','','h12d') %> <%=create_table("0") %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Usuario: ') %> <%=close_td() %> <%=create_td() %> <%=input_text_key_validate_lv('form','0..9','text','f1','tusuario','','fal se',12,12,'false','introduzca el usuario',1,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Clave: ') %> <%=close_td() %> <%=create_td() %> <%=input_text_presence_lv('password','form','f2','tclave','','false',12 ,12,'false','introduzca la clave',2,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Nivel: ') %> <%=close_td() %> <%=create_td() %> <%=input_text_key_validate_lv('form','0..9','text','f3','tnivel','','false', 1,1,'false','introduzca el nivel',1,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=close_table() %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=input_submit('f30','Aceptar','Aceptar','x-btn-click') %> <%=input_reset('f31','Cancelar','Cancelar','x-btn-click') %> <%=input_button('f32','Catalogou','Catalogo de Usuarios','x-btnclick','onclick="catalogousuarios()"') %> <%=input_button('f33','Catalogom','Catalogo de Mensajes','x-btnclick','onclick="catalogomensajes()"') %> <%=create_gridView_extjs(@nombreFuncion,@titulo,@idGrid,@i 92 Libro de Kamila 1.0.1 yiyi 2009 ds,@ds,@cm,@amplitudcm,@objetoDatosu) %> <%=create_gridView_extjs('catalogomensajes','Catalogo de Mensajes','miGridM','','descripcion,vinculo','Descripcion,Vinculo' ,'120,120',@objetoDatosm) %> <%=close_form() %> <%=select_focus('form','tusuario') %> <%=create_div('div1','h1','Fin de Prueba de Octava') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> En la primera llamada de la API, los parámetros son llenados en el controlador, como atributos de la clase: Octava, note el cuarto parámetro, donde se le pasa los ids de los datos que serán actualizados de las caja de texto cuando se escoja un registro en el catálogo: create_gridView_extjs(@nombreFuncion,@titulo,@idGrid,@ids,@d s,@cm,@amplitudcm,@objetoDatosu) En la segunda llamada, note que los parámetros son pasados directamente, no con atributos de la clase Octava, excepto el último parámetro, además en el cuarto parámetro no se le pasa nada, es decir vacío, ya que nuestro formulario, maneja usuarios y no mensajes, y es por ello que se verá en el catálogo el botón: Salir , pero no el botón: Aceptar, para seleccionar un elemento del catálogo, como se verá en la primera llamada, con el manejo del catálogo de usuarios: create_gridView_extjs('catalogomensajes','Catalogo de Mensajes','miGridM','','descripcion,vinculo','Descripcion,Vinculo ','120,120',@objetoDatosm) Veamos la ejecución de octava: 93 Libro de Kamila 1.0.1 yiyi 2009 Figura 29: Ejecución del controlador: octava, acción: index, ejemplo usando la API create_gridView_extjs. Escogiendo el tercer registro del grid de usuarios. Fuente el autor. Figura 30: Ejecución del controlador: octava, acción: index, ejemplo usando la API create_gridView_extjs. El dato escogido, vaciado en el formulario, en los campos respectivos. Fuente el autor. 94 Libro de Kamila 1.0.1 yiyi 2009 Grid o Catálogo Dinámico Para crear un catálogo dinámico, Kamila tiene la API: create_gridAjaxView_extjs, basada en el framework Extjs. La diferencia con el anterior, que cada vez que presionemos el botón para el catálogo respectivo, los datos serán cargados automáticamente, usando AJAX, a tráves de una página servidora llamada: ajaxnovena.rb, es decir, en nuestro catálogo siempre tendremos los datos actualizados. Para demostrar el uso de ésta API, primero creamos el controlador: novena.rb: =begin Application: novena.rb View : index.rhtml models : Ninguno. Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 10 de Agosto del 2008 =end require $kamila_lib+"application" class Novena < Application private @pageserver = nil @nombreFuncion = nil @titulo = nil @idGrid = nil @ids = nil @ds = nil @cm = nil @amplitudcm = nil public def initialize() end def index() @pageserver= 'ajaxnovena/usuarios' @nombreFuncion = 'catalogousuarios' @titulo = 'Catalogo de Usuario' @idGrid = 'miGrid' @ids = 'f1,f2,f3' @ds = 'usuario,clave,nivel' @cm = 'Usuario, Clave, Nivel' @amplitudcm = '70,120,30' render("index") 95 Libro de Kamila 1.0.1 yiyi 2009 end end Ahora veamos la vista: index.rhtml: <!-Application: novena.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 09 de Agosto del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('novena Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('estilo_rojo.css') %> <%=create_javascript_livevalidation("en")%> <%=create_javascript_extjs() %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','Formulario de Prueba de Novena:') %> <%=close_div() %> <%=create_form('form','form','POST','primera') %> <%=create_paragraphs('p1','','h12d') %> <%=create_table("0") %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Usuario: ') %> <%=close_td() %> <%=create_td() %> <%=input_text_key_validate_lv('form','0..9','text','f1','tusuario','','fal se',12,12,'false','introduzca el usuario',1,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Clave: ') %> <%=close_td() %> <%=create_td() %> <%=input_text_presence_lv('password','form','f2','tclave','','false',12 96 Libro de Kamila 1.0.1 yiyi 2009 ,12,'false','introduzca la clave',2,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Nivel: ') %> <%=close_td() %> <%=create_td() %> <%=input_text_key_validate_lv('form','0..9','text','f3','tnivel','','false', 1,1,'false','introduzca el nivel',1,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=close_table() %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=input_submit('f30','Aceptar','Aceptar','botones') %> <%=input_reset('f31','Cancelar','Cancelar','botones') %> <%=input_button('f32','Catalogou','Catalogo de Usuarios','botones','onclick="catalogousuarios()"') %> <%=input_button('f33','Catalogom','Catalogo de Mensajes','botones','onclick="catalogomensajes()"') %> <%=create_gridAjaxView_extjs(@nombreFuncion,@titulo,@idGr id,@ids,@ds,@cm,@amplitudcm,@pageserver) %> <%=create_gridAjaxView_extjs('catalogomensajes','Catalogo de Mensajes','miGridM','','descripcion,vinculo','Descripcion,Vinculo' ,'120,120','ajaxnovena/mensajes') %> <%=close_form() %> <%=select_focus('form','tusuario') %> <%=create_div('div1','h1','Fin de Prueba de Novena') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> Note el último parámetro, donde se llama la página servidora: para usuarios, llama el controlador: @pageserver = 'ajaxnovena/usuarios' y para mensajes: 'ajaxnovena/mensajes' este controlador a su vez tiene su vista: index.rhtml. Veamos el fuente de: ajaxnovena.rb: =begin Application: ajaxnovena.rb View : index.rhtml 97 Libro de Kamila 1.0.1 models Autor kamila Fecha =end yiyi 2009 : usuarios y mensajes. : Edgar Gonzalez : versión 1.0.0 : 10 de Agosto del 2008 require $kamila_lib+"application" class Ajaxnovena < Application private @objetoDatosu = nil @objetoUsuarios = nil @objetoDatosm = nil @objetoMensajes = nil @registros = nil public def initialize() @registros = '' end def mensajes() existe = loadmodel("mensajes") if existe==true @objetoDatosm = '|' @objetoMensajes=Mensajes.find(:all) totalregistros = @objetoMensajes.length i=1 @objetoMensajes.each do |mensaje| @objetoDatosm = @objetoDatosm + mensaje.descripcion + ',' if i==totalregistros @objetoDatosm = @objetoDatosm + mensaje.vinculo else @objetoDatosm = @objetoDatosm + mensaje.vinculo + '|' end i=i+1 end @registros = @objetoDatosm end render("index") end def usuarios() existe = loadmodel("usuarios") if existe==true @objetoDatosu = '|' @objetoUsuarios=Usuarios.find(:all) totalregistros = @objetoUsuarios.length 98 Libro de Kamila 1.0.1 yiyi 2009 i=1 @objetoUsuarios.each do |usuario| @objetoDatosu = @objetoDatosu + usuario.usuario + ',' @objetoDatosu = @objetoDatosu + usuario.clave + ',' if i==totalregistros @objetoDatosu = @objetoDatosu + usuario.nivel else @objetoDatosu = @objetoDatosu + usuario.nivel + '|' end i=i+1 end @registros = @objetoDatosu end render("index") end end Ahora veamos el index.rhtml para ajaxnovena.rb: <%=@registros %> @registros, es un atributo de la clase: Ajaxnovena del controlador. Recuerde que para AJAX, una página servidora envian los datos al cliente en formato: XML, a tráves del método responseXML, o TEXT con responseTEXT, en nuestro caso es: TEXT, donde los datos vienen separados por coma para cada registro y cada registo por el carácter: |, ejemplo: 22000000,camila,1|23000000,yeye,2|. Veamos la ejecuación de Novena: 99 Libro de Kamila 1.0.1 yiyi 2009 Figura 31: Ejecución del controlador: novena, acción: index, ejemplo usando la API create_gridAjaxView_extjs. Fuente el autor. APIS de Kamila basado en el Framework Rialto Kamila ofrece una cantidad de APIS basada en el framework: Rialto. Esto permite al programdor que usa el framework, tener una variedad de APIS para crear formularios, basados en: Livevalidation, Extjs y Rialto. Para ver casi todas las APIS de Kamila basadas en Rialto, veamos el siguiente ejemplo. El controlador se llamará: decima.rb, veamos el fuente: =begin Application: decima.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 03 de septiembre del 2008 =end require $kamila_lib+"application" class Decima < Application 100 Libro de Kamila 1.0.1 yiyi 2009 def initialize() end def index() render("index") end def recibirParametros_dos() @arregloparametros = $kamila_cgi.params render("recibirParametros_dos") end end Ahora veamos la vista: index.rhtml <!-Application: decima.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 03 de septiembre del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Decima Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('estilo_rojo.css') %> <%=create_javascript_rialto('defaultSkin.css') %> <%=create_javascript_md5() %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','Formulario de Prueba de Decima:') %> <%=close_div() %> <%=create_form('form','form','POST','decima/recibirParametros_dos') %> <%=create_label_rialto('lab1','parseInt(screen.height * 0.10)','parseInt(screen.width * 0.15)','id1','Nombre:','e1') %> <%=input_text_rialto('nombre','parseInt(screen.height * 0.10)','parseInt(screen.width * 0.24)','300','A','id2','yiyi','false,true,false,Introduzca el nombre,n,5,1') %> <%=create_label_rialto('lab2','parseInt(screen.height * 101 Libro de Kamila 1.0.1 yiyi 2009 0.15)','parseInt(screen.width * 0.15)','id2','Monto:','e2') %> <%=input_text_rialto('monto','parseInt(screen.height * 0.15)','parseInt(screen.width * 0.24)','100','N','id3','0.00','false,true,false,Introduzca el monto en Bs.F.,m,5,2') %> <%=create_label_rialto('lab3','parseInt(screen.height * 0.20)','parseInt(screen.width * 0.15)','id3','Fecha:','e3') %> <%=input_text_rialto('fecha','parseInt(screen.height * 0.20)','parseInt(screen.width * 0.24)','100','D','id4','','false,true,false,Introduzca la fecha de nacimiento,f,5,3') %> <%=create_label_rialto('lab4','parseInt(screen.height * 0.25)','parseInt(screen.width * 0.15)','id4','Hora:','e4') %> <%=input_text_rialto('hora','parseInt(screen.height * 0.25)','parseInt(screen.width * 0.24)','100','H','id5','','false,true,false,Introduzca la hora de nacimiento,h,5,4') %> <%=create_label_rialto('lab5','parseInt(screen.height * 0.30)','parseInt(screen.width * 0.15)','id5','Clave:','e5') %> <%=input_text_rialto('clave','parseInt(screen.height * 0.30)','parseInt(screen.width * 0.24)','100','md5','id6','','false,true,false,Introduzca la clave,c,5,5') %> <%=create_label_rialto('lab6','parseInt(screen.height * 0.35)','parseInt(screen.width * 0.15)','id7','Comentario:','e6') %> <%=input_text_rialto('comentario','parseInt(screen.height * 0.35)','parseInt(screen.width * 0.24)','200','T','id8','','false,true,false,Introduzca un breve comentario,t,5,6') %> <%=create_label_rialto('lab7','parseInt(screen.height * 0.50)','parseInt(screen.width * 0.15)','id8','Titulos:','e7') %> <%=input_checkbox_rialto('titulo1','parseInt(screen.height * 0.50)','parseInt(screen.width * 0.24)','id9','Pregrado','true','chk01') %> <%=input_checkbox_rialto('titulo2','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.24)','id10','Postgrado','false','chk02') %> <%=create_label_rialto('lab8','parseInt(screen.height * 0.60)','parseInt(screen.width * 0.15)','id11','Estados:','e8') %> <%=input_combo_rialto('estado','parseInt(screen.height * 0.60)','parseInt(screen.width * 0.24)','100','Lara,Barinas,Portuguesa,Yaracuy','','id12','true','0') %> <%=input_hidden('f15','tipo','buscar') %> <%=input_submit_rialto('aceptar','parseInt(screen.height * 0.70)','parseInt(screen.width * 0.15)','Aceptar','Enviar Datos','','true,90','form','tipo,eliminar','massValidateRialto()') %> 102 Libro de Kamila 1.0.1 yiyi 2009 <%=input_reset_rialto('cancelar','parseInt(screen.height * 0.70)','parseInt(screen.width * 0.25)','Cancelar','Limpiar Datos','','true,90','form') %> <%=close_form() %> <%=create_massValidate_rialto('form','massValidateRialto()','nombre, monto,fecha,hora,clave,comentario','Datos no completados') %> <%=insert_linebreaks(27) %> <%=create_div('div11','h1','Fin de Prueba de Decima') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> Todas las APIS de Kamila basada en Riato, tienen el sufijo: rialto, asi como para livevalidation: lv, ver ejemplo de: cuarta.rb y para Extjs: extjs, ver ejemplo de: quinta.rb. Para las APIS de Kamila basada en Rialto, se baso en las coordenadas: X y Y, es decir, Top y Left, para posicionar los elementos como: etiquetas, caja de textos, checkbox, entre otros. El framework o librería: Livevalidation, trae una función llamada: massValidate, para la validación de todos los datos, según su tipo, antes de hacer un request, de igual manera, el autor de Kamila, creo lo equivalente para los frameworks: Extjs y Rialto, para mantener el estándar como: Livevalidation. Ahora el fuente: recibirParametros_dos.rhtml, que recibe los datos enviados desde: index.rhtml <!-Application: decima.rb View : recibirParametros_dos.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 03 de septiembre del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Trece Aplicación') %> <%=create_meta() %> 103 Libro de Kamila 1.0.1 yiyi 2009 <%=create_meta('Content-Type','text/html','iso-8859-1') %> <%=create_css('estilo_rojo.css') %> <%=close_head() %> <%=create_body() %> <%=create_div('div1','h1','recibirParametros_dos: Datos llenados del Formulario de Decima:') %> <%=close_div() %> <%=create_paragraphs('p1','','h12d') %> <%=insert_text('Nombre: ') %><%=@arregloparametros['nombre'].to_s %><%=insert_linebreaks(1) %> <%=insert_text('Monto: ') %><%="Bs.F. "+format_number(@arregloparametros['monto'].to_s.gsub(/[.]/,","),".") %><%=insert_linebreaks(1) %> <%=insert_text('Hora: ') %><%=@arregloparametros['hora'].to_s %><%=insert_linebreaks(1) %> <%=insert_text('Clave: ') %><%=@arregloparametros['clave'].to_s %><%=insert_linebreaks(1) %> <%=insert_text('Comentario: ') %><%=@arregloparametros['comentario'].to_s %><%=insert_linebreaks(1) %> <%=insert_text('Titulo 1: ') %><%=@arregloparametros['titulo1'].to_s %><%=insert_linebreaks(1) %> <%=insert_text('Titulo 2: ') %><%=@arregloparametros['titulo2'].to_s %><%=insert_linebreaks(1) %> <%=insert_text('Estado: ') %><%=@arregloparametros['estado'].to_s %><%=insert_linebreaks(1) %> <%=insert_text('tipo: ') %><%=@arregloparametros['tipo'].to_s %><%=insert_linebreaks(1) %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=create_div('div1','h1','Fin de recibirParametros_dos de Decima') %> <%=close_div() %> <%=close_body() %> <%=close_html() %> Veamos la ejecución de: decima.rb 104 Libro de Kamila 1.0.1 yiyi 2009 Figura 32: Ejecución del controlador: decima, acción: index, ejemplo de las APIs de Kamila basadas en Rialto, usando create_massValidate_rialto. Fuente el autor. Figura 33: Ejecución del controlador: decima, acción: index, ejemplo de las APIs de Kamila basadas en Rialto, uso de calendario. Fuente el autor. 105 Libro de Kamila 1.0.1 yiyi 2009 Uso de Plantillas en Kamila En internet hay una variedad de platillas, libres o pagas, basadas en: html, xtml, flash, y css; que ahorra el desarrollo de las vistas, o capa de presentación para el usuario. En el siguiente ejemplo, veremos como ubicamos los recursos en los directorios de Kamila de una plantilla basada en css. Para ello descargamos la http://www.freecsstemplates.org/ platilla: prosperity desde Los documentos o archivos de dicha plantilla con extensión: css, lo ubicamos, en una carpeta nueva, que llamaremos: prosperidad en: /var/www/kamila/public/css. Asi mismo, las imagenes que utiliza la plantilla, lo ubicamos en una carpetna nueva que llamaremos: prosperidad en: /var/www/kamila/public/img. Luego creamos el controlador: once.rb, cuyo contenido es el siguiente: =begin Application: once.rb Views : index.rhtml y actualizarDatos.rhtml models : usuarios.rb Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 08 de septiembre del 2008 =end require $kamila_lib+"application" class Once < Application private @objetoDatos = nil @usuario = nil @clave = nil @nivel = nil @mensaje = nil @tipo = nil public attr_accessor :objetoDatos def initialize() @usuario='' @clave='' @nivel='' 106 Libro de Kamila 1.0.1 yiyi 2009 @mensaje = '' end def index() render("index") end def actualizarDatos() existe = loadmodel("usuarios") if existe==true @tipo = $kamila_cgi['tipo'].to_s case @tipo when 'buscar' @usuario = $kamila_cgi['usuario'].to_s @clave = $kamila_cgi['clave'].to_s @nivel = $kamila_cgi['nivel'].to_s @objetoDatos=Usuarios.find(:first, :conditions=>"usuario = '"+@usuario+"' and clave='"+@clave+"'") if @objetoDatos != nil @nivel = @objetoDatos.nivel @mensaje = show_Message_extjs('INFO','Mensaje','Datos encontrados') else @mensaje = show_Message_extjs('ERROR','Mensaje','Usuario o clave no existe') end when 'grabar' @usuario = $kamila_cgi['usuario'].to_s @clave = $kamila_cgi['clave'].to_s @nivel = $kamila_cgi['nivel'].to_s @objetoDatos=Usuarios.find(:first, :conditions=>"usuario = '"+@usuario+"' and clave='"+@clave+"'") if @objetoDatos != nil @objetoDatos.nivel=@nivel else @objetoDatos=Usuarios.new @objetoDatos.usuario=@usuario @objetoDatos.clave=@clave @objetoDatos.nivel=@nivel end @objetoDatos.save @mensaje = show_Message_extjs('INFO','Mensaje','Datos actualizados') when 'cancelar' @usuario='' 107 Libro de Kamila 1.0.1 yiyi 2009 @clave='' @nivel='' @mensaje = '' when 'eliminar' @usuario = $kamila_cgi['usuario'].to_s @clave = $kamila_cgi['clave'].to_s @nivel = $kamila_cgi['nivel'].to_s @objetoDatos=Usuarios.find(:first, :conditions=>"usuario = '"+@usuario+"' and clave='"+@clave+"'") if @objetoDatos != nil @objetoDatos.destroy @usuario='' @clave='' @nivel='' @mensaje = show_Message_extjs('INFO','Mensaje','Usuario Eliminado') else @mensaje = show_Message_extjs('ERROR','Mensaje','Usuario o clave no existe') end end else @mensaje = show_Message_extjs("INFO","Error","Modelo no existe","once") end render("actualizardatos") end end Y el fuente de la vista: index.rhtml, basada en la plantilla: prosperity <!-Application: once.rb View : index.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 08 de septiembre del 2008 --> <%=create_html() %> <%=create_head() %> 108 Libro de Kamila 1.0.1 yiyi 2009 <%=create_title('Once Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> <%=create_div("header") %> <%=create_heading("h1","logo","Kamila") %><%=create_span("...el mejor framework MVC++") %> <%=close_span() %><%=close_heading("h1") %> <%=create_ul("nav") %> <%=create_li() %><%=create_href("#","Inicio") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href($kamila_site+"/once/actualizarDatos","Actualizar") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Blog") %><%=close_href() %><%=close_li() %> <%=close_ul() %> <%=close_div() %> <%=create_div("content") %> <%=create_heading("h2","Usando Kamila...te sentirás enamorado.") %><%=close_heading("h2") %> <%=create_img("img/prosperidad/ct_img.jpg") %> <%=create_paragraphs()%> <%=insert_text("Kamila en su versión 1.0.0, es un Framework bajo WEB, basado en MVC++, que está desarrollado en el lenguaje Ruby 1.8.5 o mayor, sobre el servidor Web Apache 2.2.3 o mayor. Usa el módulo de Apache: mod_ruby 1.2.6 o mayor y erubis. :)") %> <%=close_paragraphs() %> <%=create_div("blog") %> <%=create_heading("h2","Sobre Camila visita su blog...") %><%=close_heading("h2") %> <%=create_paragraphs("id1","... y mucho más...") %><%=close_paragraphs() %><%=insert_linebreaks(2) %> <%=create_img("logokamila","img/prosperidad/kamila103x102.jpg" ,"fotos de Camila","0","103","102") %> <%=close_div() %> <%=close_div() %> <%=close_div() %> <%=create_div("footer") %> 109 Libro de Kamila 1.0.1 yiyi 2009 <%=create_div("ftlink") %> <%=create_href("#","Inicio") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://egonzale.wordpress.com","Acerca de") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://www.myjavaserver.com/~egonzale","Contacto ") %><%=close_href() %> <%=close_div() %> <%=create_paragraphs("copyright","© 2008. All Rights Reserved.") %> <%=insert_linebreaks(1) %> <%=insert_text("Designed by ") %><%=create_href("http://www.free-css-templates.com/","Free CSS Templates") %><%=close_href() %> <%=insert_text(" Thanks to ") %><%=create_href("http://www.dubaiapartments.biz","Dubai Villas") %><%=close_href() %> <%=close_paragraphs() %> <%=create_div("xhtml") %><%=create_img("img/prosperidad/xhtml.gif"," xhtml valid") %><%=create_img("img/prosperidad/css.gif","css vaild") %><%=close_div() %> <%=close_div() %> <%=close_body() %> <%=close_html() %> El controlador once es una aplicación que usa en sus vistas: index.rhtml y actualizarDatos.rhtml, la plantilla: propsperity, la página principal de la plantilla basada en css, y que está programada en html, se llevo a las APIs de Kamila para las vistas, vea los fuentes: index.rhtml y actualizarDatos.rhtml. Al llamar al controlador: once ó once/index, se presentará la página principal a tráves de la vista: index.rhtml, que contiene un pequeño menú con las opciones: Inicio, Actualizar y Blog. Vea la siguiente figura: 110 Libro de Kamila 1.0.1 yiyi 2009 Figura 34: Ejecución del controlador: once, acción: index. Fuente el autor. Si el usuario, escoge la opción del menú: Actualizar, este contiene un enlace para llamar al controlador: once, pero a la acción o método: actualizarDatos que a su vez renderizará a la vista: actualizarDatos.rhtml, veamos el fuente de dicha vista: <!-Application: once.rb View : actualizardatos.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 08 de septiembre del 2008 --> 111 Libro de Kamila 1.0.1 yiyi 2009 <%=create_html() %> <%=create_head() %> <%=create_title('Once Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> <%=create_javascript_livevalidation("es")%> <%=create_javascript_extjs() %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> <%=create_div("header") %> <%=create_heading("h1","logo","Kamila") %><%=create_span("...el mejor framework MVC++") %> <%=close_span() %><%=close_heading("h1") %> <%=create_ul("nav") %> <%=create_li() %><%=create_href($kamila_site+"/once","Inicio") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Actualizar") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Blog") %><%=close_href() %><%=close_li() %> <%=close_ul() %> <%=close_div() %> <%=create_div("contentUpdate") %> <%=create_form('form','form','POST','once/actualizarDatos') %> <%=insert_linebreaks(2) %> <%=create_paragraphs('p1','Actualizar Datos del Usuario:','h12d') %> <%=insert_linebreaks(2) %> <%=create_table("0") %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Usuario: ') %> <%=close_td() %> <%=create_td() %> <%=input_text_presence_lv('text','form','f1','usuario',@usuario,'fals e',12,12,'false','introduzca el usuario',1,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('Clave: ') %> 112 Libro de Kamila 1.0.1 yiyi 2009 <%=close_td() %> <%=create_td() %> <%=input_text_presence_lv('password','form','f2','clave',@clave,'fal se',12,12,'false','introduzca la clave',2,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=insert_text('nivel: ') %> <%=close_td() %> <%=create_td() %> <%=input_numericality_lv('true','text','f3','nivel',@nivel,'false',12,1 2,'false','introduzca el nivel',3,'cajatexto') %> <%=close_td() %> <%=close_tr() %> <%=close_table() %> <%=input_hidden('f15','tipo','buscar') %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=input_submit_lv('f30','Buscar','Buscar','botones','form','tipo,bus car','f1,f2','Usuario y/o clave no completados') %> <%=input_submit_lv('f31','Grabar','Grabar','botones','form','tipo,gra bar','f1,f2,f3','Datos no completados') %> <%=input_submit_lv('f32','Cancelar','Cancelar','botones','form','tipo, cancelar','','') %> <%=input_submit_lv('f33','Eliminar','Eliminar','botones','form','tipo, eliminar','f1,f2','Usuario y/o clave no completados') %> <%=input_button('f34','Catalogou','Catalogo de Usuarios','botones','onclick="catalogousuarios()"') %> <%=create_gridAjaxView_extjs('catalogousuarios','Catalogo de Usuarios','miGrid','f1,f2,f3','usuario,clave,nivel','Usuario, Clave, Nivel','70,120,30','ajaxnovena/usuarios') %> <%=close_form() %> <%=select_focus('form','usuario') %> <%=close_div() %> <%=close_div() %> <%=create_div("footer") %> <%=create_div("ftlink") %> <%=create_href("#","Inicio") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://egonzale.wordpress.com","Acerca de") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://www.myjavaserver.com/~egonzale","Contacto ") %><%=close_href() %> 113 Libro de Kamila 1.0.1 yiyi 2009 <%=close_div() %> <%=create_paragraphs("copyright","© 2008. All Rights Reserved.") %> <%=insert_linebreaks(1) %> <%=insert_text("Designed by ") %><%=create_href("http://www.free-css-templates.com/","Free CSS Templates") %><%=close_href() %> <%=insert_text(" Thanks to ") %><%=create_href("http://www.dubaiapartments.biz","Dubai Villas") %><%=close_href() %> <%=close_paragraphs() %> <%=create_div("xhtml") %><%=create_img("img/prosperidad/xhtml.gif"," xhtml valid") %><%=create_img("img/prosperidad/css.gif","css vaild") %><%=close_div() %> <%=close_div() %> <%=@mensaje%> <%=close_body() %> <%=close_html() %> Esta vista, muestra un formulario, que permite hacer las operaciones: , las entradas de datos se usa las APIs de Kamila basadas en Livevalidation. Una nota importante, es el uso de la API: input_submit_lv('f30','Buscar','Buscar','botones','form','tipo,buscar', 'f1,f2','Usuario y/o clave no completados') Esta API, en su séptimo parámetro, se envian los ids, de los campos que deseamos validar antes de hacer submit. Recuerden que existe una API para validar todos los campos antes de hacer submit, pero esta API permite hacer submit validando los campos que deseamos que sean pertinentes para la acción a tráves de un botón. En este caso, para: Buscar, solo necesitamos llenar los campos: Usuario y Clave, note en el envío de los ids: 'f1,f2' que son importantes para la búsqueda, no así, el campo: Nivel. Pero para el botón: Grabar, si es importante que todos los campos esten con datos y validados según su tipo, antes de hacer submit para realizar la acción de grabar, note los ids: 'f1,f2,f3', que corresponden a: Usuario, Clave y Nivel. 114 Libro de Kamila 1.0.1 yiyi 2009 input_submit_lv('f31','Grabar','Grabar','botones','form','tipo,grabar' ,'f1,f2,f3','Datos no completados') Veamos la vista: actualizarDatos.rhtml, de la aplicación: once Figura 35: Ejecución del controlador: once, acción: actualizarDatos. Fuente el autor. 115 Libro de Kamila 1.0.1 yiyi 2009 Figura 36: Ejecución del controlador: once, acción: actualizarDatos. Al presionar el botón: Buscar, sin llenar los campos: Usuario y Clave. Fuente el autor Ahora veamos, la aplicación: doce, que usa la misma plantilla, con la diferencia en la vista: actualizarDatos.rhtml, para la validación de los datos de entrada, usa las APIs de Kamila basadas en el framework: Extjs, he aquí el fuente de: actualizarDatos.rhtml <!-Application: doce.rb View : actualizardatos.rhtml models : Ninguno. Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 15 de septiembre del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Doce Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> 116 Libro de Kamila 1.0.1 yiyi 2009 <%=create_javascript_extjs() %> <%=create_javascript_language_extjs('es','ascii') %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> <%=create_div("header") %> <%=create_heading("h1","logo","Kamila") %><%=create_span("...el mejor framework MVC++") %> <%=close_span() %><%=close_heading("h1") %> <%=create_ul("nav") %> <%=create_li() %><%=create_href($kamila_site+"/doce","Inicio") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Actualizar") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Blog") %><%=close_href() %><%=close_li() %> <%=close_ul() %> <%=close_div() %> <%=create_div("contentUpdate") %> <%=create_form('form','form','POST','doce/actualizarDatos') %> <%=insert_linebreaks(2) %> <%=create_paragraphs('p1','Actualizar Datos del Usuario:','h12d') %> <%=insert_linebreaks(2) %> <%=create_table("0") %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e1','300','Usuario:','false','') %> <%=close_td() %> <%=create_td() %> <%= input_textField_extjs('f1','usuario','textfield','130','false',@usuario,'false' ,'') %> <%=close_td() %> <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e2','300','Clave:','false','') %> <%=close_td() %> <%=create_td() %> <%= input_textField_extjs('f2','clave','password','130','false',@clave,'false','') %> <%=close_td() %> 117 Libro de Kamila 1.0.1 yiyi 2009 <%=close_tr() %> <%=create_tr() %> <%=create_td() %> <%=create_label_extjs('e3','300','Nivel:','false','') %> <%=close_td() %> <%=create_td() %> <%= input_numberField_extjs('f3','nivel','integer','130','false',@nivel,'false','') %> <%=close_td() %> <%=close_tr() %> <%=close_table() %> <%=input_hidden('f15','tipo','buscar') %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=input_submit_extjs('f30','Buscar','Buscar','x-btnclick','form','tipo,buscar','usuario,clave','Usuario y/o clave no completados')%> <%=input_submit_extjs('f31','Grabar','Grabar','x-btnclick','form','tipo,grabar','usuario,clave,nivel','Datos no completados') %> <%=input_submit_extjs('f32','Cancelar','Cancelar','x-btnclick','form','tipo,cancelar','','') %> <%=input_submit_extjs('f33','Eliminar','Eliminar','x-btnclick','form','tipo,eliminar','usuario,clave','Usuario y/o clave no completados') %> <%=input_button('f34','Catalogou','Catalogo de Usuarios','x-btnclick','onclick="catalogousuarios()"') %> <%=create_gridAjaxView_extjs('catalogousuarios','Catalogo de Usuarios','miGrid','f1,f2,f3','usuario,clave,nivel','Usuario, Clave, Nivel','70,120,30','ajaxnovena/usuarios') %> <%=close_form() %> <%=select_focus('form','usuario') %> <%=close_div() %> <%=close_div() %> <%=create_div("footer") %> <%=create_div("ftlink") %> <%=create_href("#","Inicio") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://egonzale.wordpress.com","Acerca de") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://www.myjavaserver.com/~egonzale","Contacto ") %><%=close_href() %> <%=close_div() %> 118 Libro de Kamila 1.0.1 yiyi 2009 <%=create_paragraphs("copyright","© 2008. All Rights Reserved.") %> <%=insert_linebreaks(1) %> <%=insert_text("Designed by ") %><%=create_href("http://www.free-css-templates.com/","Free CSS Templates") %><%=close_href() %> <%=insert_text(" Thanks to ") %><%=create_href("http://www.dubaiapartments.biz","Dubai Villas") %><%=close_href() %> <%=close_paragraphs() %> <%=create_div("xhtml") %><%=create_img("img/prosperidad/xhtml.gif"," xhtml valid") %><%=create_img("img/prosperidad/css.gif","css vaild") %><%=close_div() %> <%=close_div() %> <%=@mensaje%> <%=close_body() %> <%=close_html() %> Esta vista, muestra un formulario, que permite hacer las operaciones: , las entradas de datos se usa las APIs de Kamila basadas en Extjs. Una nota importante, es el uso de la API: input_submit_extjs('f30','Buscar','Buscar','x-btnclick','form','tipo,buscar','usuario,clave','Usuario y/o clave no completados') Esta API, en su séptimo parámetro, se envian los nombres, de los campos que deseamos validar antes de hacer submit. Recuerden que existe una API para validar todos los campos antes de hacer submit, pero esta API permite hacer submit validando los campos que deseamos que sean pertinentes para la acción a tráves de un botón. En este caso, para: Buscar, solo necesitamos llenar los campos: Usuario y Clave, note en el envío de los campos: 'usuario,clave' que son importantes para la búsqueda, no así, el campo: Nivel. Pero para el botón: Grabar, si es importante que todos los campos esten con datos y validados según su tipo, antes de hacer submit para realizar la acción de grabar, note los nombres: 'usuario,clave,nivel'. 119 Libro de Kamila 1.0.1 yiyi 2009 input_submit_extjs('f31','Grabar','Grabar','x-btnclick','form','tipo,grabar','usuario,clave,nivel','Datos no completados') Veamos la vista: actualizarDatos.rhtml, de la aplicación: doce Figura 37: Ejecución del controlador: doce, acción: actualizarDatos. Fuente el autor. Figura 38: Ejecución del controlador: doce, acción: actualizarDatos. Al presionar el botón: Buscar, sin llenar los campos: Usuario y Clave. Fuente el autor 120 Libro de Kamila 1.0.1 yiyi 2009 Ahora veamos, la aplicación: trece, que usa la misma plantilla, con la diferencia en la vista: actualizarDatos.rhtml, para la validación de los datos de entrada, usa las APIs de Kamila basadas en el framework: Rialto, he aquí el fuente de: actualizarDatos.rhtml <!-Application: Trece.rb View : actualizardatos.rhtml models : Ninguno. Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 15 de septiembre del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Trece Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> <%=create_javascript_rialto('defaultSkin.css') %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> <%=create_div("header") %> <%=create_heading("h1","logo","Kamila") %><%=create_span("...el mejor framework MVC++") %> <%=close_span() %><%=close_heading("h1") %> <%=create_ul("nav") %> <%=create_li() %><%=create_href($kamila_site+"/trece","Inicio") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Actualizar") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Blog") %><%=close_href() %><%=close_li() %> <%=close_ul() %> <%=close_div() %> <%=create_div("contentUpdate") %> <%=create_form('form','form','POST','trece/actualizarDatos') %> <%=insert_linebreaks(2) %> <%=create_paragraphs('p1','Actualizar Datos del Usuario:','h12d') %> <%=insert_linebreaks(2) %> 121 Libro de Kamila 1.0.1 yiyi 2009 <%=create_label_rialto('lab1','parseInt(screen.height * 0.10)','parseInt(screen.width * 0.05)','id1','Usuario:','e1') %> <%=input_text_rialto('usuario','parseInt(screen.height * 0.10)','parseInt(screen.width * 0.15)','100','A','f1',@usuario,'false,true,false,Introduzca el usuario,n,5,1') %> <%=create_label_rialto('lab2','parseInt(screen.height * 0.15)','parseInt(screen.width * 0.05)','id2','Clave:','e2') %> <%=input_text_rialto('clave','parseInt(screen.height * 0.15)','parseInt(screen.width * 0.15)','100','P','f2',@clave,'false,true,false,Introduzca la clave,n,5,2') %> <%=create_label_rialto('lab3','parseInt(screen.height * 0.20)','parseInt(screen.width * 0.05)','id3','Nivel:','e3') %> <%=input_text_rialto('nivel','parseInt(screen.height * 0.20)','parseInt(screen.width * 0.15)','100','N','f3',@nivel,'false,true,false,Introduzca el nivel,n,5,3') %> <%=input_hidden('f15','tipo','buscar') %> <%=close_paragraphs() %> <%=insert_linebreaks(2) %> <%=input_submit_rialto('buscar','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.33)','Buscar','Buscar usuario','','true,70','form','tipo,buscar','usuario,clave','Usuario y/o clave no completados') %> <%=input_submit_rialto('grabar','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.40)','Grabar','Grabar usuario','','true,70','form','tipo,grabar','usuario,clave,nivel','Datos no completados') %> <%=input_submit_rialto('cancelar','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.47)','Cancelar','Limpiar datos','','true,70','form','tipo,cancelar','','') %> <%=input_submit_rialto('eliminar','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.54)','Eliminar','Eliminar usuario','','true,70','form','tipo,eliminar','usuario,clave','Usuario y/o clave no completados') %> <%=input_button_rialto('catalogou','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.61)','Catalogo','Catalogo de usuarios','','true,70','form','catalogousuarios') %> <!-Usando Catalogo o Grid, Estatico --> <%=create_gridView_rialto('100','250','500','340','catalogousuarios',' Catalogo de Usuarios','idcatalogo','usuario,clave,nivel','Usuario,Clave,Nivel','100,10 0,100','string,string,string',@objetoDatosu) %> 122 Libro de Kamila 1.0.1 yiyi 2009 <!-Usando Catalogo o Grid, Dinamico a traves de AJAX <%=create_gridAjaxView_rialto('100','250','500','340','catalogousuar ios','Catalogo de Usuarios','idcatalogo','usuario,clave,nivel','Usuario,Clave,Nivel','100,10 0,100','string,string,string','ajaxtrece/usuarios') %> --> <%=close_form() %> <%=select_focus('form','usuario') %> <%=close_div() %> <%=close_div() %> <%=create_div("footer") %> <%=create_div("ftlink") %> <%=create_href("#","Inicio") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://egonzale.wordpress.com","Acerca de") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://www.myjavaserver.com/~egonzale","Contacto ") %><%=close_href() %> <%=close_div() %> <%=create_paragraphs("copyright","© 2008. All Rights Reserved.") %> <%=insert_linebreaks(1) %> <%=insert_text("Designed by ") %><%=create_href("http://www.free-css-templates.com/","Free CSS Templates") %><%=close_href() %> <%=insert_text(" Thanks to ") %><%=create_href("http://www.dubaiapartments.biz","Dubai Villas") %><%=close_href() %> <%=close_paragraphs() %> <%=create_div("xhtml") %><%=create_img("img/prosperidad/xhtml.gif"," xhtml valid") %><%=create_img("img/prosperidad/css.gif","css vaild") %><%=close_div() %> <%=close_div() %> <%=@mensaje%> <%=close_body() %> <%=close_html() %> Esta vista, muestra un formulario, que permite hacer las operaciones: , las entradas de datos se usa las APIs de Kamila basadas en Rialto. Una nota importante, es el uso de la API: 123 Libro de Kamila 1.0.1 yiyi 2009 input_submit_rialto('buscar','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.33)','Buscar','Buscar usuario','','true,70','form','tipo,buscar','usuario,clave','Usuario y/o clave no completados') Esta API, en el noveno parámetro, se envian los nombres, de los campos que deseamos validar antes de hacer submit. Recuerden que existe una API para validar todos los campos antes de hacer submit, pero esta API permite hacer submit validando los campos que deseamos que sean pertinentes para la acción a tráves de un botón. En este caso, para: Buscar, solo necesitamos llenar los campos: Usuario y Clave, note en el envío de los campos: 'usuario,clave' que son importantes para la búsqueda, no así, el campo: Nivel. Pero para el botón: Grabar, si es importante que todos los campos esten con datos y validados según su tipo, antes de hacer submit para realizar la acción de grabar, note los nombres: 'usuario,clave,nivel'. input_submit_rialto('grabar','parseInt(screen.height * 0.55)','parseInt(screen.width * 0.40)','Grabar','Grabar usuario','','true,70','form','tipo,grabar','usuario,clave,nivel','Datos no completados') Veamos la vista: actualizarDatos.rhtml, de la aplicación: trece Figura 46: Ejecución del controlador: doce, acción: actualizarDatos. Fuente el autor. 124 Libro de Kamila 1.0.1 yiyi 2009 Figura 39: Ejecución del controlador: trece, acción: actualizarDatos. Al presionar el botón: Buscar, sin llenar los campos: Usuario y Clave. Fuente el autor Generación de Gráficos con Kamila En la aplicación: catorce, veremos el uso de la API: create_graph_gruff, que nos permite generar gráficas de tipo: barras, torta, lineal, entre otras. Para ello veamos el controlador: catorce.rb =begin Application: catorce.rb View : index.rhtml, vergrafica.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 18 de septiembre del 2008 =end require $kamila_lib+"application" class Catorce < Application @tipo = nil @fondo = nil @fuente = nil @tamanofuente = nil 125 Libro de Kamila 1.0.1 yiyi 2009 @titulo = nil @titulo_axis_x = nil @titulo_axis_y = nil @leyendas = nil @datos = nil @yvalores = nil @xvalores = nil @archivo = nil def initialize() end def index() render("index") end def generarGrafica() # Tipos de Graficas = line, pie, bar, area, sidebar, stackedbar, sidestackedbar @tipo = "bar" @fondo = Array.new # Fondos o temas predeterminados: blue, bluelight, pink, black #@fondo[0] = 'black' #@fondo[1] = '' # Fondos o temas: Personalizados, puede ser en vez de: , :background_colors # por :background_image => $kamila_site+'/public/img/kamila/18_kamila.jpg' @fondo[0] = 'mytheme' @fondo[1] = { :colors => %w(white purple red orange), :marker_color => 'red', :background_colors => %w(white green) } # Puedes instalar mas fuentes true type font (ttf) en directorio: /usr/share/fonts/truetype/ # Copias la carpeta en el directorio anterior y como super usuario, lo recargas con: fc-cache -f -v @fuente = "/usr/share/fonts/truetype/ttf-bitstream-vera/Vera.ttf" # Tamano de las fuentes para: El titulo, Leyenda y Marcas @tamanofuente = Array.new @tamanofuente[0] = 32 # titulo @tamanofuente[1] = 18 # leyenda @tamanofuente[2] = 24 # Marcas # Titulo de la grafica @titulo = "Estadísticas de la Maestría- DCYT" 126 Libro de Kamila 1.0.1 yiyi 2009 # titulos de los ejes X y Y @titulo_axis_x = "Años" @titulo_axis_y = "Aprobados" # Leyendas @leyendas = Array.new @leyendas[0] = "Ing. de Software I" @leyendas[1] = "Ing. de Software II" @leyendas[2] = "Ing. de Software III" @leyendas[3] = "Electiva I" # Datos o serie de datos @datos = Array.new @datos[0] = [1, 2, 3, 4, 4, 3] @datos[1] = [4, 8, 7, 9, 8, 9] @datos[2] = [2, 3, 1, 5, 6, 8] @datos[3] = [9, 9, 10, 8, 7, 9] # Datos eje Y @yvalores = Array.new @yvalores[0] = 0 @yvalores[1] = 1 @yvalores[2] = 2 @yvalores[3] = 3 @yvalores[4] = 4 @yvalores[5] = 5 # Datos eje X @xvalores = Array.new @xvalores[0] = '2003' @xvalores[1] = '2004' @xvalores[2] = '2005' @xvalores[3] = '2006' @xvalores[4] = '2007' @xvalores[5] = '2008' # Se debe crear en la carpeta public la carpeta: estadisticas y como super usuario cambiar # La propiedades 777 con el comando: chmod -R 777 estadisticas/ @archivo = $kamila_home + '/public/estadisticas/grafica01.png' create_graph_gruff(@tipo,@fondo,@fuente,@tamanofuente,@titulo, @titulo_axis_x,@titulo_axis_y,@leyendas,@datos,@yvalores,@xvalores, @archivo) 127 Libro de Kamila 1.0.1 yiyi 2009 render("vergrafica") end end La api: create_graph_gruff, esta basada en la librería: Gruff y genera un archivo o imagen con la gráfica respectiva en el directorio: /var/www/kamila/public/estadisticas. Está carpeta: estadisiticas, se debe crear, como super usuario y darle las propiedades de escritura. Veamos la vista: vergrafica.rhtml <!-Application: catorce.rb View : vergrafica.rhtml models : usuarios.rb Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 19 de septiembre del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Catorce Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> <%=create_javascript_rialto('defaultSkin.css') %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> <%=create_div("header") %> <%=create_heading("h1","logo","Kamila") %><%=create_span("...el mejor framework MVC++") %> <%=close_span() %><%=close_heading("h1") %> <%=create_ul("nav") %> <%=create_li() %><%=create_href($kamila_site+"/catorce","Inicio") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Estadisticas") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Blog") %><%=close_href() %><%=close_li() %> 128 Libro de Kamila 1.0.1 yiyi 2009 <%=close_ul() %> <%=close_div() %> <%=create_div("contentUpdate") %> <%=create_img("g1","estadisticas/grafica01.png","esta disticas","0","400","400") %> <%=close_div() %> <%=close_div() %> <%=create_div("footer") %> <%=create_div("ftlink") %> <%=create_href("#","Inicio") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://egonzale.wordpress.com","Acerca de") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://www.myjavaserver.com/~egonzale","Contacto ") %><%=close_href() %> <%=close_div() %> <%=create_paragraphs("copyright","© 2008. All Rights Reserved.") %> <%=insert_linebreaks(1) %> <%=insert_text("Designed by ") %><%=create_href("http://www.free-css-templates.com/","Free CSS Templates") %><%=close_href() %> <%=insert_text(" Thanks to ") %><%=create_href("http://www.dubaiapartments.biz","Dubai Villas") %><%=close_href() %> <%=close_paragraphs() %> <%=create_div("xhtml") %><%=create_img("img/prosperidad/xhtml.gif"," xhtml valid") %><%=create_img("img/prosperidad/css.gif","css vaild") %><%=close_div() %> <%=close_div() %> <%=close_body() %> <%=close_html() %> Para que la gráfica sea mostrada en la vista, llamamos a la API de Kamila: create_img("g1","estadisticas/grafica01.png","estadistic as","0","400","400") Veamos la vista: vergrafica.rhtml, de la aplicación: catorce, acción: generarGrafica 129 Libro de Kamila 1.0.1 yiyi 2009 Figura 40: Ejecución del controlador: catorce, acción: generarGrafica. Fuente el autor Generación de Reportes con Kamila Asi como en la comunidad de PHP, existe la librería para generear reportes en formato: pdf, llamada: fpdf, ver el sitio: http://www/fpdf.org, del mismo modo, en la comunidad de RUBY, existe dicha librería. El autor de está investigación creo una clase: Mypdf que heredando de la clase: FPDF y basado en el ejemplo cinco (5) del sitio: http://www/fpdf.org, modifico los métodos: BasicTable, ImprovedTable y FancyTable, creo los métodos: HeaderPage y FooterPage y sobrecargo los métodos: Header y Page, para generar reportes tabulares parametrizables. Para mayor información, ver la documentación de la clase: Mypdf en la fase de diseño, descrita en este mismo capítulo. Para ver el uso de la clase: Mypdf y generar reportes tabulares, veamos el ejemplo con el controlador: quince, he aquí su fuente: =begin 130 Libro de Kamila 1.0.1 yiyi 2009 Application: quince.rb View : index.rhtml, verpdf.rhtml models : usuarios.rb Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 23 de septiembre del 2008 Comentario : La clase Mypdf esta basada en el ejemplo 5 del sitio web http://www.fpdf.org/ =end require $kamila_lib+'mypdf' require $kamila_lib+'Array2D' require $kamila_lib+"application" class Quince < Application @orientacion = nil @unidad = nil @formato = nil @header = nil @registro = nil @data = nil @font = nil @image1 = nil @image2 = nil @xy1 = nil @xy2 = nil @xy3 = nil @xy4 = nil @title1 = nil @title2 = nil @title3 = nil @title4 = nil @yfooter = nil @footer = nil @wh = nil @wd = nil @fillcolor = nil @textcolor = nil @drawcolor = nil @fillcolorRestart = nil @textcolorRestart = nil @fontRestart = nil @imprimir = nil def initialize() 131 Libro de Kamila 1.0.1 yiyi 2009 end def index() render("index") end def generarPdf() # Crear el objeto pdf de la clase Mypdf # Orientacion: P = Portrait y L = Landscape # Unidad: pt=punto, mm=milimetros, cm=centimetro, in=pulgada # Un punto es igual a 1/72 de pulgada, es decir cerca de 0.35 mm (siendo una pulgada 2.54 cm). # Formato = A3,A4,A5,Letter o Legal # Por Defecto es: P,mm,Letter, creando el objeto pdf = Mypdf.new @orientacion = 'L' @unidad = 'mm' @formato = 'A4' pdf = Mypdf.new(@orientacion,@unidad,@formato) pdf.AliasNbPages # Titulos de las Columnas @header = ['Usuario', 'Clave', 'Nivel'] # Cargar los datos de la tabla usuarios en @data cada posicion de data es un arreglo existe = loadmodel("usuarios") if existe==true @data = Array.new objetoUsuarios=Usuarios.find(:all) objetoUsuarios.each do |usuario| @registro = Array.new @registro.push(usuario.usuario) @registro.push(usuario.clave) @registro.push(usuario.nivel) @data.push(@registro) end # Definicion del encabezado # Definicion de la Fuente @font = Array.new @font[0] = 'Arial' # Fuente @font[1] = 'B' # B=Negrita o Bold, I=italica, N=Normal @font[2] = 14 # Tamano # Logo al Tope izquierdo del Encabezado, Soporta imagenes: JPG y PNG @image1 = Array.new @image1[0] = $kamila_home+'/public/img/kamila/logo_ucla1.jpg' @image1[1] = 10 # Columna @image1[2] = 5 # Fila 132 Libro de Kamila 1.0.1 yiyi 2009 @image1[3] = 8 # Amplitud @image1[4] = 13 # Altura # Logo al Tope Derecho del Encabezado @image2 = Array.new @image2[0] = $kamila_home+'/public/img/kamila/logo_ucla.jpg' @image2[1] = 180 @image2[2] = 5 @image2[3] = 8 @image2[4] = 13 # Definicion de la Primera Linea del Encabezado @xy1 = Array.new @xy1[0] = 80 # Columna @xy1[1] = 5 # Fila @title1 = Array.new @title1[0] = 40 # Amplitud @title1[1] = 5 # Altura @title1[2] = 'Universidad Centroocidental Lisandro Alvarado' # Texto @title1[3] = 0 # Indica sin los border o lineas seran dibujados alrededor de la celda. 0=Sin Border 1=Con Border. @title1[4] = 0 # Indica la posicion antes de imprimir el texto, 0=A la derecha, 1=Al comienzo de la siguiente linea, 2=Debajo @title1[5] = 'C' # Alineacion del texto: C=Centrado, L=A la izquierda, R=Derecha @xy2 = Array.new @xy2[0] = 80 @xy2[1] = 10 @title2 = Array.new @title2[0] = 40 @title2[1] = 5 @title2[2] = 'Decanato de Ciencias y Tecnologia' @title2[3] = 0 @title2[4] = 0 @title2[5] = 'C' @xy3 = Array.new @xy3[0] = 80 @xy3[1] = 15 @title3 = Array.new @title3[0] = 40 @title3[1] = 5 @title3[2] = 'Coordinacion de Postgrado' @title3[3] = 0 @title3[4] = 0 @title3[5] = 'C' @xy4 = Array.new 133 Libro de Kamila 1.0.1 yiyi 2009 @xy4[0] = 80 @xy4[1] = 20 @title4 = Array.new @title4[0] = 40 @title4[1] = 5 @title4[2] = 'Usuarios del Sistema' @title4[3] = 0 @title4[4] = 0 @title4[5] = 'C' @lines = 20 pdf.HeaderPage(@font,@image1,@image2,@xy1,@title1,@xy2,@title2 ,@xy3,@title3,@xy4,@title4,@lines) # Definicion del Pie de Pagina # Definicio de la Fuente @font = Array.new @font[0] = 'Arial' @font[1] = 'I' @font[2] = 8 @yfooter = -15 # Define a cuantos cms del fina estara el pie de pagina @footer = Array.new @footer[0] = 0 # Columna @footer[1] = 10 # Fila @footer[2] = 'Pagina: ' # Texto @footer[3] = 0 # Indica sin los border o lineas seran dibujados alrededor de la celda. 0=Sin Border 1=Con Border. @footer[4] = 0 # Indica la posicion antes de imprimir el texto, 0=A la derecha, 1=Al comienzo de la siguiente linea, 2=Debajo @footer[5] = 'C' # Alineacion del texto: C=Centrado, L=A la izquierda, R=Derecha pdf.FooterPage(@font,@yfooter,@footer) # Genera una Tabla Basica pdf.AddPage() pdf.BasicTable(@header, @data) # Genera una tabla más avanzada pdf.AddPage() # Define las caracteristicas de la celda del encabezado @wh = Array2D.new(3,5) @wh[0,0] = 40 # Amplitud @wh[0,1] = 7 # Altura @wh[0,2] = 1 # Indica sin los border o lineas seran dibujados alrededor de la celda. 0=Sin Border 1=Con Border. @wh[0,3] = 0 # Indica la posicion antes de imprimir el texto, 0=A la derecha, 1=Al comienzo de la siguiente linea, 2=Debajo 134 Libro de Kamila 1.0.1 yiyi 2009 @wh[0,4] = 'C' # Alineacion del texto: C=Centrado, L=A la izquierda, R=Derecha @wh[1,0] = 35 @wh[1,1] = 7 @wh[1,2] = 1 @wh[1,3] = 0 @wh[1,4] = 'C' @wh[2,0] = 40 @wh[2,1] = 7 @wh[2,2] = 1 @wh[2,3] = 0 @wh[2,4] = 'C' @wd = Array2D.new(3,5) @wd[0,0] = @wh[0,0] @wd[0,1] = 6 @wd[0,2] = 'LR' @wd[0,3] = 0 @wd[0,4] = 'R' @wd[1,0] = @wh[1,0] @wd[1,1] = 6 @wd[1,2] = 'LR' @wd[1,3] = 0 @wd[1,4] = 'R' @wd[2,0] = @wh[2,0] @wd[2,1] = 6 @wd[2,2] = 'LR' @wd[2,3] = 0 @wd[2,4] = 'R' pdf.ImprovedTable(@header, @data, @wh, @wd) # Tabla mas elegante, con definicion de colores y fuente por celda pdf.AddPage() # Color de fondo para el encabezado de las columnas, basado en el formato: RGB @fillcolor = Array.new @fillcolor[0] = 195 #255 R @fillcolor[1] = 234 #0 G @fillcolor[2] = 125 #0 B # Color de la fuente para el encabezado de las columnas @textcolor = 255 #255 # Color de las lineas de la tabla @drawcolor = Array.new @drawcolor[0] = 128 #128 @drawcolor[1] = 243 #0 @drawcolor[2] = 89 #0 135 Libro de Kamila 1.0.1 yiyi 2009 # Grosor de las lineas de la tabla @linewidth=0.3 #0.3 # Definicion de la Fuente para el encabezado de las columnas @font = Array.new @font[0] = 'Arial' @font[1] = 'B' @font[2] = 18 #18 # Restaurar el Color y la fuente @fillcolorRestart = Array.new @fillcolorRestart[0] = 124 # 224 @fillcolorRestart[1] = 135 # 235 @fillcolorRestart[2] = 95 # 255 @textcolorRestart=0 @fontRestart = Array.new @fontRestart[0] = 'Arial' @fontRestart[1] = '' @fontRestart[2] = 12 pdf.FancyTable(@header, @data, @wh, @wd, @fillcolor, @textcolor, @drawcolor, @linewidth, @font, @fillcolorRestart, @textcolorRestart, @fontRestart) # Se debe crear en la carpeta public la carpeta pdf y como super usuario cambiar # La propiedades 777 con el comando: chmod -R 777 pdf/ pdf.Output($kamila_home+'/public/pdf/usuarios.pdf') @imprimir = create_javascript_view_file('200','100','550','450',$kamila_site+'/public/ pdf/usuarios.pdf') else @imprimir = show_Message_extjs("INFO","Error","Modelo no existe","primera") end render("verpdf") end end Veamos ahora la vista: verpdf.rhtml <!-Application: quince.rb View : verpdf.rhtml models : Ninguno. Autor : Edgar Gonzalez kamila : versión 1.0.0 136 Libro de Kamila 1.0.1 Fecha yiyi 2009 : 23 de septiembre del 2008 --> <%=create_html() %> <%=create_head() %> <%=create_title('Quince Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> <%=create_javascript_extjs() %> <%=create_javascript_language_extjs('es','ascii') %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> <%=create_div("header") %> <%=create_heading("h1","logo","Kamila") %><%=create_span("...el mejor framework MVC++") %> <%=close_span() %><%=close_heading("h1") %> <%=create_ul("nav") %> <%=create_li() %><%=create_href($kamila_site+"/quince","Inicio") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Reporte") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Blog") %><%=close_href() %><%=close_li() %> <%=close_ul() %> <%=close_div() %> <%=create_div("contentUpdate") %> <%=@imprimir %> <%=close_div() %> <%=close_div() %> <%=create_div("footer") %> <%=create_div("ftlink") %> <%=create_href("#","Inicio") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://egonzale.wordpress.com","Acerca de") %><%=insert_text(" | ") %><%=close_href() %> <%=create_href("http://www.myjavaserver.com/~egonzale","Contacto ") %><%=close_href() %> <%=close_div() %> <%=create_paragraphs("copyright","© 2008. All Rights Reserved.") %> 137 Libro de Kamila 1.0.1 yiyi 2009 <%=insert_linebreaks(1) %> <%=insert_text("Designed by ") %><%=create_href("http://www.free-css-templates.com/","Free CSS Templates") %><%=close_href() %> <%=insert_text(" Thanks to ") %><%=create_href("http://www.dubaiapartments.biz","Dubai Villas") %><%=close_href() %> <%=close_paragraphs() %> <%=create_div("xhtml") %><%=create_img("img/prosperidad/xhtml.gif"," xhtml valid") %><%=create_img("img/prosperidad/css.gif","css vaild") %><%=close_div() %> <%=close_div() %> <%=close_body() %> <%=close_html() %> La vista muestra el contenido del atributo: @imprimir de la clase: quince, este contiene la API de Kamila: create_javascript_view_file('200','100','550','450',$kamila_site+'/p ublic/pdf/usuarios.pdf'), que genera un javascript, que ejecuta la apertura de una ventana emergente (popup window) con la ruta del documento pdf que mostrará en dicha ventana. El método: Output, ejecutado por un objeto instanciado de la clase Mypdf en el controlador, es heredado de la clase: FPDF y genera un archivo pdf en el directorio: /var/www/kamila/public/pdf. Está carpeta: pdf, se debe crear y como super usuario y darle las propiedades de escritura. Veamos la vista: verpdf.rhtml, de la aplicación: quince, la acción: verpdf 138 Libro de Kamila 1.0.1 yiyi 2009 Figura 41: Ejecución del controlador: quince, acción: verpdf. Fuente el autor 139 Libro de Kamila 1.0.1 yiyi 2009 Validaciones de Kamila basado en MVC++ El programador o desarrollador que use el Framework Kamila podría verse tentado de usar instrucciones como un print en las clases de tipo modelo; como por ejemplo un: print “estoy en la clase usuarios” =begin Application: octava.rb, novena.rb y once.rb View : index.rhtml models : usuarios.rb Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 10 de Agosto del 2008 =end require "active_record" print "estoy en la clase usuarios" class Usuarios < ActiveRecord::Base end El framework Kamila está donde no es permitido programadas en las vistas, instrucciones de este tipo, error: basado en el patrón de diseño MVC++ usar instrucciones que sólo debe ser si el desarrollador llega colocar un tipo de el framework Kamila reporta el siguiente No esta permitido en /var/www/kamila/models/usuarios.rb para usar instrucciones de la vista como (puts,print,etc...) referenciado por MVC++ Como podemos ver en la siguiente figura: Figura 42: Reporte de errores de Kamila basado en MVC++. Fuente el autor 140 Libro de Kamila 1.0.1 yiyi 2009 Como también podría verse tentado de usar instrucciones en las vistas: *.rhtml de cargar un modelo y ejecutar instrucciones de Active Record; por ejemplo un: loadmodel(): <!-Application: doce.rb View : actualizardatos.rhtml models : Ninguno Autor : Edgar Gonzalez kamila : versión 1.0.0 Fecha : 15 de septiembre del 2008 --> <%=existe = loadmodel("usuarios")%> <%=create_html() %> <%=create_head() %> <%=create_title('Doce Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> <%=create_javascript_extjs() %> <%=create_javascript_language_extjs('es','ascii') %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> Reportando el siguiente error: No esta permitido en /var/www/kamila/views/doce/actualizardatos.rhtml para usar instrucciones de active record referenciado por MVC++ o primitivas de HTML por Kamila Otra validación y uno de los objetivos de está investigación, que está basada en etiquetas personalizadas, es mantener el estándar en la programación de las vistas, se refiere en no colocar instrucciones primitivas de: HTML o XHTML, Javascript, entre otras, en las vistas: *.rhtml, por ejemplo si tenemos el siguiente segmento de código: <!-Application: doce.rb View : actualizardatos.rhtml 141 Libro de Kamila 1.0.1 models Autor kamila Fecha yiyi 2009 : Ninguno. : Edgar Gonzalez : versión 1.0.0 : 15 de septiembre del 2008 --> <html> <%=create_head() %> <%=create_title('Doce Aplicación') %> <%=create_meta() %> <%=create_meta('Content-Type','text/html','utf8') %> <%=create_css('prosperidad/reset.css') %> <%=create_css('prosperidad/style.css') %> <%=create_javascript_extjs() %> <%=create_javascript_language_extjs('es','ascii') %> <%=close_head() %> <%=create_body() %> <%=create_div("wrap") %> <%=create_div("header") %> <%=create_heading("h1","logo","Kamila") %><%=create_span("...el mejor framework MVC++") %> <%=close_span() %><%=close_heading("h1") %> <%=create_ul("nav") %> <%=create_li() %><%=create_href($kamila_site+"/doce","Inicio") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Actualizar") %><%=close_href() %><%=close_li() %> <%=create_li() %><%=create_href("#","Blog") %><%=close_href() %><%=close_li() %> <%=close_ul() %> <%=close_div() %> <%=create_div("contentUpdate") %> En vez de colocar la API de Kamila: create_html() se coloca la primitiva de HTML directamente: <html>, Kamila reporta el siguiente error: No esta permitido en /var/www/kamila/views/doce/actualizardatos.rhtml para usar instrucciones de active record referenciado por MVC++ o primitivas de HTML en Kamila 142 Libro de Kamila 1.0.1 yiyi 2009 Como podemos ver en la siguiente figura: Figura 43: Reporte de errores de Kamila basado en MVC++. Fuente el autor 143