Tornus versión 0.0.1: prueba de concepto

Fecha: 26 Junio, 2011 | Autor: | Categoría: tornus | No hay comentarios »

La versión actual (0.0.1) no es más que una prueba de concepto. Se muestra la funcionalidad básica pero no pretende tener ninguna utilidad práctica.

Instalación

En un sistema linux o mac con git, ruby, gem y bundler instalados, debe ser suficiente con:

git clone git://github.com/ovalo-software/tornus.git
cd tornus
bundle
rake db:migrate
rails server

Inicialmente usa Sqlite3 como base de datos.

Funcionamiento

Una vez instalado al cargar http://localhost:3000 obtenemos:

Inicio Tornus

Inicio Tornus

Es una página simple con muy poco que contar. Hasta que pulsamos el botón azul. En ese momento entramos en el modo configuración. Ahora disponemos de otro botón azul que nos permite configurar el título de la página:

Editar datos del sitio

Editar datos del sitio

Y cuando pasamos por encima de un “elemento” veremos el menú que permite modificarlo:

Menú editar elemento

Menú editar elemento

Cada elemento puede editarse, borrarse y moverse. Para crear nuevos elementos debemos elegir entre insertar el mismo antes o después del seleccionado con los iconos de arriba o abajo. En la zona a usar por el elemento se nos pide el tipo del mismo:

Menú insertar elemento

Menú insertar elemento

Como vemos en este momento disponemos de 3 tipos simples de elemento. Veremos más adelante lo fácil que es añadir más tipos. Pero ahora los 3 existentes hacen lo siguiente:

  • Html: Permite escribir HTML en un cuadro de texto.
  • Texto: Lo que se edita en el cuadro de texto se pasa por el helper simple_format.
  • Linea: Un simple “hr”

Con el icono de las flechas podemos mover cualquier elemento entre las 4 zonas que existen actualmente: header, footer, content y sidebar.

Cualquier cambio que realicemos se guarda inmediatemente en la base de datos de configuración.

Descripción del sistema

Lo que pretendemos con esta prueba es tener todas las piezas del rompecabezas, aunque estén incompletas cada una por separado. Nos centramos en la estructura dejando la funcionalidad “fina” para después. Veamos la estructura del sistema:

El modelo

En app/models/tornus tenemos las clases que guardan el contenido de la configuración. Hay dos tipos de clases, las Tcomponent y las Tobject:

  • Tobject: Un objeto cuya configuración se graba y lee por separado.
  • Tcomponent: Componente con propiedades que se usa dentro de un Tobject.

La funcionalidad de ambas está externalizada en app/models/ovalo_config. En su momento será un gem indendiente. Su finalidad es definir una estructura de objetos complejos persistentes en base de datos. En este momento la persistencia se realiza con una simple tabla:

create_table :ovalo_config_store_items do |t|
  t.string :instance_key, :null=>false
  t.string :klass, :null=>false
  t.text :properties
  t.timestamps
end
add_index :ovalo_config_store_items, [:instance_key], :unique=>true
add_index :ovalo_config_store_items, [:klass]

Como hemos dicho esto es así por ahora. Las clases Store contienen el mínimo código posible para hacer el trabajo. Posiblemente una base de datos orientada a keyvalue sea más conveniente.

Un Site es un Active Model con ciertos métodos para persistencia, diferentes de los habituales de ActiveRecord:

  • En lugar de id tienen instance_key que es un String único dentro del sistema.
  • load_config para cargar la configuración existente en la BD.
  • update_properties y save para grabarla.
  • Y los métodos de Active Model: valid?, errors, etc.

La estructura de propiedades se define con el método de clase property. De esta forma la clase Site tiene el siguiente código:

class Site < Tobject

  property(:title,  I18nString)
  property(:header, Inclusion, :is_a=>Zone)
  property(:footer, Inclusion, :is_a=>Zone)

end

Una property se define por su nombre, su tipo y unas opciones específicas para el tipo. Los tipos son clases y actualmente existen:

  • Properties::String: una simple cadena
  • Properties::I18nString: en su momento serán cadenas traducibles
  • Properties::Inclusion: permite incluir un Component cualquiera
  • Properties::InclusionArray: Igual que Inclusion pero un array

El cometido del modelo es por tanto proporcionar una forma eficiente de definir estructuras de configuración. No hay que definir nada más que las propiedades que tiene un objeto y tenemos solucionada su persistencia sin siquiera cambios en la BD (aunque más adelante cambie la misma BD.)

La clase TornusFactory se encarga de proporcionar las instancias preconfiguradas necesarias para esta demo, que son 3: site, site.home y site.sidebar. Esta clase se sustituirá por un sistema más genérico de carga que tendrá en cuenta el asunto de la caché que por ahora ha sido totalmente ignorado.

Los controllers

tornus_controller tiene actualmente el único trabajo de mostrar la página y alternar el estado normal y el de configuración.

Dentro de tconfig tenemos otros dos que se ocupan de manejar la modificación del Site y de los Elements que componen los Zone, son sites_controller y elements_controller. Ambos reciben sus peticiones por llamadas AJAX.

Las views y los helpers

Entre views/layouts/application.html.slim y views/tornus/root.html.slim se forma la página principal. El resto de views se emplea para la modificación de la configuración.

He usado slim porque me parece un buen compromiso entre la concisión de Haml y las posibilidades para ampliaciones que proporciona Temple, cosa que voy a necesitar más adelante.

Aunque la mayoría del código de view actualmente se concentra en los helpers. Ellos proprocionan el html necesario para editar los elementos de la página.

En la vista tiene un papel fundamental public/javascripts/tconfig/activate.js. Contiene todo el código javascript necesario para unir los elementos html de configuración con sus correspondientes acciones AJAX haciendo uso intensivo y exclusivo de unobtrusive javascript.

Lo siguiente

En la versión 0.0.2 se podrán crear páginas y navegar entre ellas. Además ampliaré OvaloConfig y daré una descripción detallada de su funcionamiento.

 



Haga un comentario