Usando AJAX con Typo3

Con el avance de las nuevas tecnologías seguro que habra mucha gente que este buscando integrar esas nuevas tecnologías con los -también famosos- CMS, en este caso hablo de Typo3 y de AJAX, con lo que se pueden conseguir cosas muy interesantes, como por ejemplo: cargar galerías de imágenes, mostrar secciones de páginas en base a ciertas peticiones, etc.

Pues bien, existen unos cuantos plug-ins (extensiones) de Typo3 que permiten utilizar AJAX en el front-end, pero en muchos casos -casi siempre en mi caso- esas extensiones no son capaces de hacer las cosas que se quiere que hagan, en tal caso hay que hacer extensiones propias y dicho eso voy a explicar fácilmente como integrar AJAX en nuestras extensiones.

Lo primero es hacer la extensión y para esto hay otra extensión que crea una extensión base, es decir una colección de archivos que luego podemos extender para que la funcion se comporte como queremos que lo haga. La extensión se llama Kickstarter y asumo que para continuar con estas instrucciónes se tiene un control de dicha extensión (no voy a tocar nada de eso aquí). Aquí hay un tutorial básico de la extensión Kickstarter.

La lógica detrás de poder utilizar AJAX es bastante simple: desde la versión 4.0 de Typo3 se ha definido un nuevo método para poder hacer peticiones y poder limitar la respuesta de Typo3, es decir se puede hacer una petición a una URL determinada y definir que es lo que se carga, evitando sobrecargas en el servidor -y de ancho de banda- al cargar extensiones, modulos, librerías, sistemas de caché, etc, etc. que no se necesitan para el caso de utilizar AJAX. Esta definición se llama eID y para poder utilizarla hay que definirla en la configuración de nuestra extensión.

Entonces, para definir nuestra extensión abrimos el archivo ext_localconf.php -que está en el directorio donde tenemos la extensión que vamos a utilizar-

Y al final del archivo (antes de ?>) agregamos esto:

  1. $TYPO3_CONF_VARS['FE']['eID_include']['tx_mipalabra'] = 'EXT:mi_extension/pi1/procesador_eventos.php';

En donde tx_mipalabra será la clave registrada con la que podamos acceder a nuestro código para peticiones.

Con esto hecho podremos acceder a http://miservidor.com/index.php?eID=tx_mipalabra y Typo3 pasará la petición al archivo que vaya a procesar la petición, en este caso procesador_eventos.php

Lo siguiente que tenemos que hacer es definir los metodos que vayamos a utilizar dentro del procesador_eventos.php y listo, básicamente eso es todo, podemos entonces hacer peticiones a través de AJAX enviando los parametros que queramos, por ejemplo:

  1. xobject = false;
  2. if(window.XMLHttpRequest)
  3.   {
  4.     try { xobject = new XMLHttpRequest(); }
  5.     catch(e) { xobject = false; }
  6.   }
  7. else if(window.ActiveXObject)
  8.   {
  9.     try { xobject = new ActiveXObject("Msxml2.XMLHTTP"); }
  10.     catch(e)
  11.       {
  12.         try { xobject = new ActiveXObject("Microsoft.XMLHTTP"); }
  13.         catch(e) { xobject = false; }
  14.       }
  15.   }
  16.  
  17. if(xobject)
  18.   {
  19.     xobject.onreadystatechange = function() { AJAX_DATA.completeProcess(action); }
  20.  
  21.     xobject.open("POST", "http://miservidor.com/index.php?eID=tx_mipalabra&get=usuario&uid=1000", sync);
  22.     xobject.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  23.     xobject.send(AJAX_DATA.makeDataString(action, params));
  24.   }
  25. else
  26.   alert('Error code: 01');

Aunque el código anterior no está completo (falta el resto del proceso AJAX) es un claro ejemplo de como hacer la petición que habremos de procesar en nuestro archivo para este fin.

Eso es todo, ya hemos preparado nuestra extensión y nuestra instalación de Typo3 para que pueda manejar AJAX, esto es bastante útil a la hora de tener por ejemplo un calendario de eventos sin tener que recargar la página cada vez al seleccionar una fecha determinada.

Lollipop: DB admin

Lollipop es una herramienta muy fácil de utilizar, siendo a la vez muy potente y rápida. Básicamente es un gestor de contenidos genérico que se puede montar sobre cualquier base de datos MySQL y administrarla de un modo más fácil e intuitivo que PHPMyAdmin y que además permite gestionar imágenes (JPG, PNG y GIF) así como tambien todo tipo de archivos (DOC, PDF, MOV, AVI, etc.).

Lollipop permite la personalización de todo a traves de un solo CSS, con lo que se le puede dar la apariencia que cada uno quiera y además se puede intergrar facilmente en entornos de trabajo ya existentes.

Lollipop se instala en menos de 5 minutos y permite la creación de usuarios para la gestión de los contenidos, guardando siempre un log detallado de todas las acciones que los usuarios realicen, desde iniciar su sesión hasta cerrarla.

Desde aquí puedes descargar la última versión estable

Y aquí una versión de prueba.
La versión de prueba ha sido suspendida.

Requiere:

  • PHP 5 con GD
  • Apache con mod_rewrite habilitado
  • MySQL 5+
  • Un navegador que soporte JS (AJAX)

Extraer el contenido del archivo
Configurar los datos de acceso a la base de datos en el archivo /includes/db_access.inc.php
Leer el archivo install.txt

Nota: Lollipop tiene que instalarse sobre un dominio propio o estar en un sub-dominio para su correcto funcionamiento, por ejemplo http://midominio.com/lollipop no funcionará.

Lollipop está públicado bajo licencia GNU/GPL y nadie puede ser hecho responsable de cualquier daño producido por el uso y/o mal uso de dicha aplicación.

Cortar texto con JS

Hay veces en las que se quiere cortar un texto sin cortar por la mitad de una palabra, por ejemplo cuando usamos AJAX y queremos mostrar solo un par de líneas de la entrada de una noticia. Hay dos maneras de hacer esto: la primera (y quizá la más simple, pero no la mejor) es hacerlo en el servidor antes de que este devuelva los resultados al AJAX, pero en este caso nos podemos encontrar con que luego necesitamos el texto completo y eso implicaría una nueva llamada y con ello consumo de recursos.

Entonces nos queda la segunda opción: cortarlo según lo necesitemos en el script antes de mostrarlo. Para ello he escrito esta pequeña función que hace justamente eso. Recorta una cadena determinada a un largo determinado, sin cortar palabras por la mitad y con eso el texto queda un poco más presentable.

  1. function trimText(string, largo)
  2.  {
  3.    largo = largo-3;
  4.    var newst = string.split(" ");
  5.    var contador = 0;
  6.    var finalstr = '';
  7.  
  8.    for(var lar=0; lar<newst.length; ++lar) {
  9.     if(contador >= largo)
  10.       break;
  11.     else
  12.      {
  13.       contador += newst[lar].length;
  14.       finalstr += newst[lar]+' ';
  15.       if(finalstr.length-1 > largo)
  16.        {
  17.         finalstr = finalstr.substr(0, finalstr.indexOf(newst[lar], 0));
  18.         break;
  19.        }
  20.      }
  21.    }
  22.   return (finalstr != string) ?
  23.          finalstr.substr(0, finalstr.length-1)+'…' :
  24.          finalstr;
  25.  }

Y para llamarla:

  1. var texto = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Pellentesque sit amet nibh non metus bibendum sagittis. Suspendisse ante ligula, varius eu, ultrices sit amet, scelerisque vel, orci.'
  2. var texto_cortado = trimText(texto, 50);

Listo, un mejor texto recortado.