Creando sitios complejos con ActionApps
Usando el Modulo de sitio
Modulo de sitio
Si usted ha utilizado las Aplicaciones de Acción para incluir contenidos dinámicos en las páginas de su sitio web es muy posible que le interese la idea de lograr integrar la herramienta para lograr administrar todo el contenido de su sitio. La mayoría de sitios web están constituidos por un número considerable de páginas (archivos) que se vinculan entre si. El Modulo de Sitio le permite administrar todo el contenido de su sitio sin necesidad de realizar inclusiones dinámicas en cada una de las páginas, facilitando las labores de actualización de contenidos y reduciendo la carga administrativa.
Hasta este momento, el mejor enfoque para construir o administrar un sitio web de complejidad mediana/grande con ActionApps es usando el Modulo de Sitio. Este modulo es de gran ayuda pues le permite integrar varias vistas y canales en una misma pagina.
Vamos a usar el sitio de Econnect como ejemplo, para demostrar los principios básicos.
El Modulo de Sitio es parte de la interface de administración de AA, igual que otros módulos. Puede accederlo desde la caja de selección 'cambiar a', si ud. tiene permiso. El modulo de sitio le permite describir la estructura del sitio como una arborescencia. Los sitios basados en el modulo no necesitan archivos especiales (como shtml). El sitio completo puede ser manejado usando la interface de administración de AA, con excepción del 'script principal de control', descrito después La manera de describir la estructura del sitio sera expuesta en este texto, mas adelante.
Idea - Estado y sesiones
La consideración principal durante la planificación del Modulo de sitio fue despempeño. Los sitios complejos solían tener muchos visitantes al día Para un mejor desempeño es mejor tener las paginas en cache. Sin embargo, con el enfoque previo al modulo de sitio, cada usuario obtiene su propia identificación de sesión, que es única para cada usuario y nos ayuda a almacenar el status, donde el usuario esta dentro del sitio (por ejemplo en que lugar del page scroller esta). Esta bien pero es muy difícil cachear esa información
Debido a eso se desarrollo el modulo de sitio sin variables de sesión para cada usuario.
Usamos en cambio una "cadena de estado". Allí almacenamos el estatus, en que lugar del sitio esta el usuario.
A esta variable de estado la llamamos apc (por 'Cache de apuntador de la aplicación' o 'Application Pointer Cache' :-). Tiene un comportamiento especial en AA y es agregada automáticamente a todas las ligas generadas por AA y de esa manera podemos saber donde estuvo el usuario en la transición anterior.
Por ejemplo: si Ud. obtiene la liga http://ecn.cz/index.stm?apc=zzvx1--&..., este usuario estuvo en la pagina "news-alerts-all_categories-all_regions-page1" del sitio. Como esta eso codificado en la cadena alfanumérica "apc" es otro tema, y mas bien depende de Ud. y sera descrito mas adelante.
La cadena de estado apc
Como se puede ver (apc=zzvx1--), la cadena de estado de Econnect consiste en 7 variables de estado - cada caracter el la cadena es una variable en nuestro caso, pero no es una regla (de hecho la quinta variable de estado p, pagina, podria tener una logitud mayor a uno). Todas variables de estado están definidas en el script principal de control del sitio - /module/site/sites/site_xxx.php3 (o alternativamente es invocado, por razones de seguridad, mediante http://). En este script se define no solo en numero de variables de estado y la expresión regular que permite extraer los valores de la cadena de estado apc, sino también la manera en que cambiamos esa cadena de estado. Por ejemplo, si el código de <site>site_xxx.php3</site> obtiene el siguiente parámetro en el url:
http://ecn.cz/index.stm?apc=zzvx1--&p=3
la variable de estado se cambia a apc=zzvx3--, lo que significa que esta en la misma pagina web, pero en la pagina numero 3.
Describamos a continuación las variables usadas en el sitio de Econnect, pero tengamos en mente que las variables usadas en su sitio pueden ser diferentes, si desea.
|
Posición en la cadena de estado |
Nombre de la variable de estado |
Posibles estados de la variable |
Descripción |
|
1 |
w (web) |
z,e,n |
Clasificación principal de las paginas Las paginas de Econect estas divididas en tres clases: z - zpravodajstvi (noticias) e - econnect n - nno (Noticias relacionadas con ONGs) |
|
2 |
s (subweb) |
z,m,k,t,a,s (for w=z) 1,2,3,4,5,6,7,8,9 (for w=e) N,F,P,I,J,V (for w=n) |
Cada web (w) esta dividida en subwebs, por ejemplo la web z (noticias) contiene: z - noticias k - comentarios t - boletines de prensa ... |
|
3 |
f (filtro) |
Cualquier letra |
El uso primario de esta variable es para seleccionar la categoría de los items visibles (ambiente, derechos humanos, cultura, ...), pero cada pagina podría usar esta variable para su propio propósito (tipo de apoyo, empleo, etc...) |
|
4 |
r (región) |
Cualquier letra |
Igual que f - se usa para filtrar por región |
|
5 |
p (pagina) |
Cualquier numero |
Almacena el numero de pagina, donde este el usuario (acorde con el page-scroller). Puede ser mas de un caracter en nuestro caso. |
|
6 |
t (tipo) |
Cualquier letra |
Tipo especial de salida, como 'solo texto', 'para impresión', ... |
|
7 |
x (item) |
Cualquier numero |
identificación del item a desplegar (como 12345) - como se puede ver, puede tener una longitud variable. |
Ud. puede usar cualquier numero de variables de estado en su sitio y combinarlas en la cadena de estado llamada 'apc'. Lo único que hay que tener en cuenta es que la cadena de estado 'apc' debe ser divisible en variables de estado. En el ejemplo de Econnect usamos la siguiente expresión regular para obtener las variables de estado a partir de la "cadena de estado apc".
{w} {s} {f} {r} {p} {t} {x}
ereg( "^([a-zA-Z0-9_])([a-zA-Z0-9_])([a-zA-Z0-9_-])([a-zA-Z_]+)([-]|[0-9]+)([a-zA-Z_-])([0-9]*)", $apc, $vars ))
Script principal de control El script principal de control es el único archivo que Ud. necesitara editar en el proceso de creación del sitio. El archivo contiene un script (probablemente en PHP) y su propósito es convertir la "cadena de estado APC" en variables de estado, y posiblemente cambiar el estado de las variables en base a los parámetros que se obtienen en la URL.
El script se invoca antes que cualquier pagina del sitio se despliegue. Aquí está un ejemplo sensillo pero funcional del script. Los comentarios están adentro.
Si la variable $apc no esta definida, probablemente estamos accediendo la pagina principal (ej. http://ecn.cz).
if( !$apc ) $apc = 'zzvx--'; # inicializamos la 'cadena de estado' si aun no existe
# en su valor inicial
Separamos la cadena de estado $apc en variables de estado (por ahora con prefijo 'o')
if( ereg( "^([a-zA-Z0-9_])([a-zA-Z0-9_])([a-zA-Z0-9_-])([a-zA-Z_]+)([-]|[0-9]+)([a-zA-Z_-])([0-9]*)", $apc, $vars ))
list($ostate,$ow,$os,$of,$or,$op,$ot,$ox) = $vars;
else # si la cadena $apc tiene un formato erróneo,
# inicializamos las variables de estado
list($ow,$os,$of,$or,$op,$ot) = array( 'z', 'z', 'v', 'x', '-', '-');
Ahora tenemos que programar las reacciones a solicitudes especiales en url.
Por ejemplo, si estamos en el sitio y hacemos clic en una liga que contiene
w=z (como por ejemplo http://ecn.cz/index.stm?apc=zzvx1--&w=z), cambiamos el estado a la sección 'noticias'
if( isset($w) ) { # w corresponde a WEB
switch($w) {
case 'z':
list($ow,$os,$of,$or,$op,$ot,$ox)=array('z','z','v','x','-','-',); break;
case 'n':
list($ow,$os,$of,$or,$op,$ot,$ox)=array('n','N','1','-','-','-',); break;
case 'e':
list($ow,$os,$of,$or,$op,$ot,$ox)=array('e','1','1','-','-','-','73161');
break;
}
}
Lo mismo con la variable de estado s, pero el cambio es dentro de la misma WEB (la variable {w} permanece sin cambios)
if( isset($s) ) { # s corresponde a SUBWEB
$os=$s;
$ox=; # $ow queda igual – cambiamos subweb, no web
$op='1';
if( $old_w != 'z' ) # el formato de noticias queda igual
$old_f=;
}
Regla de reescritura para cada solicitud posible en url.
if( isset($f) ) {$of=$f; $ox=; $op='1';} # f corresponde a FILTRO
if( isset($r) ) {$or=$r; $ox=; $op='1';} # r corresponde a REGION
if( isset($p) ) {$op=$p; $ox=;} # pagina
if( isset($t) ) {$ot=$t; $ox=;} # cambia a modo especial
if( isset($x) ) {$ox=$x;} # id del item id a desplegar
if( isset($scrl) ) { # page scroller
$pagevar = "scr_".$scrl."_Go";
$op = $$pagevar;
$ox=;
}
Finalmente, grabamos el estado final de las variables de estado en el arreglo $apc_state. La clave 'state' de usa para almacenar la nueva cadena de estado apc. Otras claves en el arreglo son variables, las cuales usamos en la administración del modulo de sitio (en el próximo capitulo). No solo deben haber variables de estado, sino también cualquier otra variable que Ud. desee usar.
$apc_state = array ('state' => "$ow$os$of$or$op$ot$ox",
'w' => $ow,
's' => $os,
'f' => $of,
'r' => $or,
't' => $ot,
'p' => $op,
'x' => $ox,
# helper variables used in site module – you can define as many such
# variables as you want
'archive' => (($op>10)? 'archive' : ),
);
Usted puede encontrar ejemplos de estos archiso en el directorio /modules/site/sites/ de su instalación de ActionApps.
Administración del sitio
Todo el código HTML que define la diagramación de las páginas es administrado desde el módulo de sitio. La idea es dividir su página web en secciones/pedazos y estructurarlos en un árbol llamado el sitetree. Usted puede encontrar el sitetree de su sitio en la sección izquierda de la interface de administración del módulo. En el momento en el que se despliega una página las AA comienzan por imprimir la primera sección/pedazo de HTML y luego continúa hacia abajo e imprime la rama correcra del árbol, basándosse en las variables de estado que usted defina. Cada una de las secciones/pedazos pueden contener HTML y, como se explicará más adelante, pueden incluir vistas y canales.
Existen dos tipos de secciones/pedazos HTML: los 'nodos' y sus 'opciones'.
a) nodos
Un nodo tiene código HTML que simplemente se imprime. Las AA imprimen los contenidos de un nodo y continuan con la evaluación del siguiente (hacía abajo). De otro lado, los 'nodos' pueden ser la raíz de nuevas ramas de HTML. Un 'nodo' se convierte en la raíz de una ramificación cuando se le asigna una 'variable de desición'. Por ejemplo, si usted le asigna la variable 'w' al nodo 'inicio', usted puede crear ramificaciones ('opciones') de esa sección/pedazo y la evaluación continuará en la ramificación donde 'w' satisfaga las condiciones necesarias.
b) opciones
Cada 'opción' pertenecerá a un 'nodo' en el que se ha definido una 'variable de desición'. Para cada 'opción' se debe definit una condición basada en la 'variable de desición'. Las AA imprimen solamente la PRIMERA 'opción' que satisfaga la condición. Tan pronto como se cumple una condición, se imprime el código que contiene esa 'opción' y se continua con la evaluación del siguiente 'nodo' del sitetree.
Dentro de las condiciones usted puede usar expresiones regulares. También puede incluir más de una 'variable de desición' en las condiciones de cada 'opción'. Tenga en cuenta que si utiliza mas de una condición, éstas son evaluadas con el operador lógico Y.
Incorporación de diseños de vistas al código HTML
Dentro de los 'nodos' y 'opciones' usted puede utilizar el HTML y, adicionalmente, incoprporar diseños de vistas de cualquiera de los canales existentes En el módulo de sitio no se pueden utilizar los diseños de 'Listado' y 'Texto completo' del canal, solamente pueden utilizarse diseños de 'vistas'. Si usted quiere mostrar la información de uno de sus canales al interior de un 'nodo' o una de sus 'opciones' debe utilizar la siguiente sintáxis: {view.php3?vid=353}
Esto incluirá el resultado de la vista nñumero 353 dentro del código del 'nodo' u 'opción' que se despliega. Aunque {view.php3...} es sólamente la sintáxis de inclusión (no tiene nada que ver con el archivo view.php3), usted puede usar todos los parámetros que acepta view.php3. Por ejmplo, el siguiente código es utilizado para desplegar el texto completo del item 'x' con el diseño de la vista 217:
{view.php3?vid=217&cmd[217]=x-217-{x}}
Como puede darse cuenta en el ejemplo, la sintáxis permite usar {x} para ser sustituido por el contenido de la variable x (x pertenece a la variable de estado definida en el arreglo $apc_state al interior del 'main control file').
Uso de la sintáxis en el módulo de sitio
|
Sintáxis |
Descripción |
|
{<variable>} |
Imprime el contenido de la variable. Por ejemplo: {w} |
|
{view.php3?vid=<vid>&<parámetros de la vista>} |
Imprime el contenido de la vista número <vid>. En esta sintáxis se usan los <parámetros de la vista> exactamente igual que con el script view.php3. Por ejemplo: {view.php3?vid=122&cmd[122]=c-1-{f}}) |
|
{switch(var1,var2,..)val1,val2,..:<texto 1>:val1,val2,..:<texto 2>} |
Imprime <texto 1> o <texto 2> o ... con base en las condiciones val1 y val2 para las variables var1, var2, ... Solamente se imprime la primera condición que se cumple. Las condiciones pueden incluir expresiones regulares. Por ejmplo: |
|
{# cualquier texto} |
Comentarios - no se imprimen |
Está sintáxis puede anidarse en tantos niveles como se requiera.