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.

Plug-ins para PHP

Para que el se ha encontrado con que quiere poder extender sus aplicaciones de PHP mediante plug-ins, aquí hay una idea muy simple de como se puede hacer.

Supongamos que tenemos un archivo llamado external_dateFormat.php que continue únicamente una función:

<?php
  1. function external_dateFormat($string, $include_time = false, $date_format = 'd/m/Y', $time_format = 'H:i:s')
  2.  {
  3.   if($include_time)
  4.    {
  5.     $format = $date_format.' '.$time_format;
  6.     return date($format, strtotime($string));
  7.    }
  8.   else
  9.    return date($date_format, strtotime($string));
  10.  }
  11. ?>

Básicamente recibe unos parámetros y devuelve una fecha según el formato que reciba o el pre-determinado.

Ahora bien; por otro lado tenemos una clase en donde tenemos algunas funciones y queremos llamar a esta función dateFormat() solo en un momento dato y bajo ciertas circumstancias, como si se tratase de un plug-in por ejemplo.

A continuación la clase:

<?php
  1.  
  2. class isample {
  3.  
  4.   // Aquí guardamos la sobrecarga de variables. Esto se puede omitir, pero si llegamos
  5.   // a tener estructuras de arrays muy complejas PHP se pierde.
  6.   private $_s_g = array();
  7.  
  8.   // Cuando se trata de acceder (almacenar) una variable que no existe se invoca a este
  9.   // método que la guardará en el array anterior.
  10.   // $name es el nombre de la variable que queremos escribir
  11.   // $value el valor que tendrá
  12.   function __set($name, $value)
  13.    {
  14.     $this->_s_g[$name] = $value;
  15.    }
  16.  
  17.   // Cuando se trata de acceder (leer) una variable que no existe se invoca a este
  18.   // método que la obtendrá del array anterior.
  19.   // $name es el nombre de la variable de la cual queremos saber su valor
  20.   function __get($name)
  21.    {
  22.     return $this->_s_g[$name];
  23.    }
  24.  
  25.   // Cuando se trata de acceder a un método que no existe en esta clase se invoca
  26.   // método (mágico) que permite extender la llamada a otra funcíon o, en este caso,
  27.   // cargar nuestro "plug-in" del archivo externo.
  28.   // $name es el nombre del método al que queremos acceder
  29.   // $args son los argumentos que le pasaríamos
  30.   function __call($name, $args)
  31.    {
  32.     // Incluímos (solo una vez) el archivo con nuestra función
  33.     require_once('external_'.$name.'.php');
  34.  
  35.     // A la variable fecha (que no está ligada al objecto) le asignamos el resultado de nuestra función.
  36.     // Llamamos a nuestra función y le pasamos los parámetros recibidos desde la llamada
  37.     $this->fecha = call_user_func_array('external_'.$name, $args);
  38.    }
  39. }
  40.  
  41. $str = '2008-01-12 14:43:21';
  42. $t = new isample(); // Creamos una nueva instacia del objeto
  43.  
  44. // Llamamos al método dateFormat que no existe en este objecto
  45. $t->dateFormat($str, true, 'D d, M / Y');
  46.  
  47. // Mostramos el valor de la variable fecha (que solo existe mágicamente en el objeto)
  48. echo $t->fecha;
  49.  
  50. ?>

Y con este pequeño ejemplo se pueden implementar modelos más complejos de plug-in. Se puede, por ejemplo, utilizar ob_start(); y crear un potente y rápido sistema de cache para las funciones incluidas, pero eso ya es otra historia.

Espero que les sea de ayuda.

Running MAMP

As I posted previously I’m now running MAMP as I wait for a nice PHP 5 package to be available. I did some research about how MAMP handles the htdocs folder, which is the one where you should have you web pages stored, and here are my findings. MAMP is designed to be self-contained, meaning it will not work if the htdocs folder is outside the MAMP folder in your applications, however, I just, accidentally, found a way of doing this and actually keep MAMP working.

If you open the httpd.conf file in /Applications/MAMP/conf/apache and scroll all the way down, you will find the virtual hosts section, in this section add a new virtual host, like this:

NameVirtualHost *
<VirtualHost *>
ServerName localhost
DocumentRoot “/Users/Stefan/Sites”
</VirtualHost>

In the previous example /Users/Stefan/Sites is where I have my pages stored and each time I call http://localhost in my browser MAMP will actually load the pages from there, so I have no need of moving everything into the MAMP’s htdocs folder.

You can add as much virtual hosts as you like and place them wherever you like, and MAMP will load and parse them just fine. You’re actually tricking it into believing the files are stored where they “should”.

Leopard and PHP 5

Another one, it’s pretty nice to have PHP 5 bundled with Leopard, but it’s a very basic version of PHP, I guess the only library compiled into it is MySql, theres not even GD, so you will need to compile PHP on your own including all the libraries you need to get it to run. Honestly I’m to lazy for that right now so I just got MAMP up and running for now, until Marc has a compatible version to distribute.

I’ll keep you posted.

Moving to Leopard

I have spent my last hours on installing the all-new Leopard on my Mac, it actually went pretty fast. I haven’t had much time to check out the entire thing as I’ve been busy setting up my development environment (Apache, PHP, MySQL).

The good thing is that Leopard ships with Apache 2 and PHP 5.2 pre installed, so you only need to make a couple of changes to get Apache and PHP running in no time, I’ll explain how to do that. The bad news is that the current MySQL package file does not fully work on Leopard, well, the engine actually works, it’s the preference pane that does not work yet, so you won’t be able to use that to stop and start you MySQL DB, I’ll post a nice trick to get that running as well.

PunchClock: Beta por venir

Hace unos años, 3 creo, escribí una aplicación en PHP para la empresa de un amigo que necesitaba un sistema eficiente para controlar los tiempos y horarios de trabajo de sus empleados, así como también las horas extras y la distribución de las mismas para cada uno. Luego de mucho buscar y no encontrar nada adecuado en la red, decidí escribir mi propia aplicación desde cero.

Pues bien, esta ha sido un poco la semana de retomar los antiguos proyectos, así que he decido re-escribir íntegramente la aplicación, totalmente desde cero y escribir también un instalador completo, de modo que cualquiera con una experiencia mínima lo pueda instalar y poner a trabajar en pocos minutos. De todos modos habrá que hacer todo desde cero, ya que la versión inicial estuvo escrita en PHP 4 y mucho de ese código está obsoleto y además PHP 4 pronto dejará de existir oficialmente.

En los próximos días haré un pequeño análisis funcional y empezaré a escribir las clases principales de la aplicación. Este es un proyecto con el cual me pondré en los momentos libres así que no puedo prometer nada a muy corto plazo, pero iré actualizando la información del proyecto.

En esta nueva versión incluiré algo de GD para generar datos estadísticos más agradables para el usuario y trataré de utilizar AJAX en la mayor cantidad posible, de todos modos el sistema tendrá que ser compatible con la mayor cantidad de navegadores, especialmente antiguos, así que habrá que tener cuidado con eso.

Me encantaría escribir todo esto en PeA, pero me temo que habrá un par de cosas que no esten del todo funcionales para realizar ciertas funciones, de todos modos lo intentaré también, así de paso escribo un buen ejemplo de como utilizar PeA.

Si alguien está interesado y quiere aportar, entonces sería genial poder empezar con un logotipo oficial para identificar el proyecto.

Proyecto PeA: Programación en castellano

Hoy, nuevamente, después de mucho tiempo he retomado mi proyecto PeA, que básicamente se trata de un lenguaje multi propósito para el web en castellano. Este lenguaje al igual que PHP o cualquier otro puede escribirse directamente en las paginas HTML y el servidor al recibir una petición PeA interpreta el código y devuelve los resultados.

He jugado con ello un poco esta tarde y he logrado volver a compilar la ultima versión en mi MacBook, en realidad el proyecto estuvo desarrollado en Windows, utilizando Visual Studio 6 pero luego se hicieron pequeños ajustes para que se pueda compilar en Linux y con la ayuda de un archivo “make” todo es de otro color. Al estar basando en FreeBSD, el sistema operativo de Mac es basicamente un Unix, así que no hubo mayores problemas con la compilación.

Pues bien, ya está compilado y funcional nuevamente. En los próximos días abriré la página oficial del proyecto www.proyectopea.com y se podrá desde ahí descargar el código completo. A ver si hay alguien que pueda aportar.

Como mencioné antes, este lenguaje se programa es castellano, por ejemplo en lugar de escribir function se escribirá funcion, una clase se llamará clase en lugar de class y muchas más cosas que ya vendrán sobre la marcha. También puedo agregar es que es mucho más rápido que PHP y maneja mejor la memoria y los recursos del sistema y está escrito completamente en C.

C string inverter

Some friend of mine just asked me to write him a simple string inverter in C, meaning a little program which reads a string and outputs the same string in inverted order. For example:

Input: Hello, we are done!
Output: !enod era ew ,olleH

I honestly don’t know the use of it, but any way here is it. (Not tested, but it should work fine)

Read more to see the code or download it zipped.

I just wrote a quick & dirty PHP version as well. Download.

However, the PHP version could be simplified a lot (one line of code):

<?php
    echo strrev("Hello, we are done!");
?>

Here’s the C code:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

struct list
 {
	char item;
	struct list *link;
 };

typedef struct list x;
	x *stack, *temp = NULL;

/* Pushes characters to the stack */
push(char data)
 {
	stack = (x *)malloc(sizeof(x));
	stack->item = data;
	stack->link = temp;
	temp = stack;
 }

/* Pops characters from the stack */
pop()
 {
	x *t;
	while(temp != NULL)
	 {
		printf("%c", temp->item);
		t = temp;
		temp = temp->link;
		free(t);
	 }
	printf(" ");
	temp = NULL;
 }

main()
 {
	int i;
	char string[30];
	clrscr();
	printf("\n Your text: ");
	gets(string);
	i = 0;
	printf("\n Inverted: ");
	while(string[i] != '\0')
	 {
		(isspace(string[i]) != 0) ? pop() : push(string[i]);
		i++;
	 }
	pop();
 }