Desde que Facebook empezó a tener éxito, los clones de redes sociales no pararon de aparecer, sobre todo webs de contactos como zoosk, badoo, linked in, …o las miles de redes más, cada una con su propósito, sin embargo las necesidades del público son tan dispares que empezaron a salir generadores online de redes sociales, no contentos con esto, ya que a nadie le interesa tener alojada una red social en las máquinas de alguien que no conoce, aparecieron generadores de redes sociales pero esta vez ,instalables en un servidor propio…una de esas opciones, de la más extendida ,es elgg…
Con elgg podemos simular un facebook, y digo simular porque no trae soporte para clústers, ni gestor de aplicaciones con APi externa, ni chat integrado, pero sí trae las herramientas para programar todas estas cosas, empezando por el muro, existe un componente llamado riverdash que lo implementa, en mi caso he estado extendiendo la funcionalidad de este plugin para un cliente y tengo que decir que el código de elgg aún tiene que madurar ,sin embargo entraña un potencial muy grande que puede aprovecharse tanto para construir una buena red social como para una aplicación de un grupo más reducido de personas que necesiten compartir información.
Podemos consultar la Wiki de Elgg aquí y descargarnos la última versión aquí.
Para añadir funcionalidades a esta red social personal se utiliza el directorio «mod» donde creamos un nuevo subdirectorio con el nombre de nuestro módulo, llamémoslo «saludo», dentro, si creamos un fichero llamado «start.php» elgg cargará nuestro módulo, en dicho fichero se especifican las inicializaciones a realizar; lo primero después de esto es crear un subdirectorio dentro de «saludo» para las vistas, llamado «views»…aquí empieza a complicarse, tenemos varios tipos de vistas, lo normal es xhtml así que por defecto se llama al subdirectorio dentro de views , «default», ahora, si es un widget (zona flotante que se puede colocar en cualquier lugar de las plantillas de la web) pues irá dentro del subdirectorio de default, «widgets», y vamos a llamar al nuevo fichero «vista.php», luego la ruta completa es
/mod/saludo/views/default/widgets/vista.php , y el código para esta vista es:
[source language=»php»]
[/source]
para que podamos gestionar el widget desde la administración iremos a /mod/saludo/start.php y lo dejaremos así:
[source language=»php»]
function iniciar_saludo() {
add_widget_type(‘saludo’, ‘Mod de Saludo’, ‘Simplemente saluda’);
}
register_elgg_event_handler(‘init’,’system’,’iniciar_saludo’);
[/source]
De forma que elgg ya sabe qué es lo que tiene que hacer con nuestro nuevo módulo…
Para complicarlo un poco más y pasarle datos a nuestro módulo usaremos una vista de elgg, creando un fichero llamado hola.php donde estaba vista.php, con el siguiente contenido:
[source language=»php»]
Tu saludo:
‘params[mensaje]’,
‘value’ => $vars[‘entity’]->mensaje,
‘class’ => ‘hola-input-text’ ) );
?>
[/source]
así, especificamos a elgg que queremos mostrar un tipo de vista basada en un input text con el nombre «mensaje» y el valor es el que tenga la propia entidad (al principio ninguno) en su atributo mensaje, la class es CSS…
Ahora, para que la vista.php muestre el saludo enviado, necesitamos cambiarla para que quede así:
[source language=»php»]
[/source]
Para más información acerca de las vistas pinchar aquí.
La gestión de idiomas se lleva por medio de un array de valores en /mod/saludo/languages/es.php, el índice o clave de una palabra o frase a almacenar contiene el prefijo del módulo, en nuestro caso «saludo:____» , donde ___ es el resto de la llave, por ejemplo, para inicio ->
[source language=»php»]
$espanol = array ( «saludo:inicio» => «Inicio»);
$english = array(«saludo:inicio» => «Home»);
add_traslation(«es», $espanol);
add_traslation(«en», $english);
//Para utilizar las claves:
echo elgg_echo(«saludo:inicio»);
[/source]
En este vídeo se puede comprobar como se ha modificado elgg para añadir un motor tipo «muro» de facebook, se ha añadido la funcionalidad de mostrar comentarios, eventos, «me gusta» y «no me gusta», enviar a redes sociales, etc.
Los encargos que he realizado están asociados a la creación de herramientas (plugins) y modificaciones del núcleo para importar y exportar contenido entre redes sociales y elgg. Desde Blogger hasta Facebook pasando por WordPress, las «tools» que he diseñado específicamente importan y exportan entradas del river-dashboard, también conocido como el famoso muro en facebook, pero adaptado para elgg.
Crear un plugin como extensión de otro para elgg:
1.- crear directorio en /mod/nombre_plugin
2.- crear /mod/nombre_plugin/manifest.xml
[sourcecode language=»xml»]
3.- crear /mod/nombre_plugin/start.php
donde al menos registraremos una función para la carga del plugin y otra función para manejar los eventos, opcionalmente añadiremos acciones también (funciones,claro).
register_elgg_event_handler('init','system','nombre_plugin_init'); register_elgg_event_handler('pagesetup','system','nombre_plugin_pagesetup');
En el caso en que queramos permitir el uso de preferencias por usuario del plugin, usaremos en start.php -función nombre_plugin_init()-, el siguiente código:
register_plugin_hook('usersettings:save','user','nombre_plugin_user_settings_save');
La función para guardar estas preferencias debe ser algo como:
function nombre_plugin_user_settings_save(){ //sólo usuario registrado y propietario de la cuenta a editar opciones gatekeeper(); $user = page_owner_entity(); if (!$user) { $user = $_SESSION['user']; } $user->nombre_input = get_input('nombre_input','valor_por_defecto'); }
Evidentemente tenemos que añadir las vistas como página
en la función nombre_plugin_pagesetup:
//Añadir los campos de configuración de usuario extend_elgg_settings_page( 'nombre_plugin/settings/usersettings', 'usersettings/user' );
y claro, necesitamos crear el fichero que referenciamos, en
/mod/nombre_plugin/views/default/settings/usersettings.php
donde colocaremos los (html) que necesitemos. Para obtener los valores en dicha vista de los propios inputs, usaremos
$user = page_owner_entity();
y los valores están dentro de esta clase: $user->nombre_input…
Como truquito que me gusta utilizar, para crear una lista de valores con un select, usar las funciones implode para guardar el dato y split para el dato leído e interpretarlo.
Si queremos que el plugin tenga opciones para el administrador creamos el directorio
/mod/nombre_plugin/views/settings/nombre_plugin/
y dentro colocamos el fichero edit.php. Aquí lo único que tenemos que hacer es escribir por pantalla los campos input que queramos como opciones de administración del plugin, el motor de Elgg nos guardará solito los valores al pulsar en en el botón submit «save», para obtener el valor del input tenemos que llamar a la función get_plugin_setting(‘nombre_input’,’nombre_plugin’) que nos devuelve el valor.
Tened en cuenta que Elgg usa muchos automatismos, por ejemplo sólo con crear un fichero con el mismo nombre del plugin dentro del directorio settings de mod, ya tenéis hecho un gestor de opciones para vuestra contribución, son cosas como estas las que la comunidad agradece tanto, si echáis un vistazo a los foros veréis de lo que hablo, un saludo
Buen articulo, es muy complicado encontrar buena documentación para comenzar a crear una plantilla de elgg desde cero.. si contaras con mas informacion o links se agradecería.. saludos
Pues tengo que seguir trabajando con elgg, te tengo en cuenta para ir ampliando el post con nueva info.
Un saludo.
Gracias, realmente útil, pero me sumo al pedido de más información :)
ok, alguna parte en especial?
Buen articulo, buena puesta en contexto pero me sumo a los dos anteriores… que se hace en el start.php?, como es el flujo de una aplicacion elgg?, como se construyen las vistas? que tipo de vistas hay? como hacer la vista de un objeto? como se manejan las paginas? realmente son un montón de preguntas que si hicieras un tutorial que incluyera por lo menos lo básico para que un desarrollador php puede empezar a desarrollar plugins, seriamos muchisimos los agradecidos. buen dia gracias por el articulo
Realmente no creo que hiciera falta ,pero bueno, aquí está el manual.
start.php como su nombre indica es el arranque, carga la configuración del sistema de aplicaciones (lo típico: bases de datos, scripts de inicio para especificar cabeceras, fecha, codificación,etc) y define y carga las librerías que se utilizan por el núcleo del framework, que son las típicas también: acceso, administración, caché, calendario, notificaciones, servicios web, metadatos, etc., en fin, todo lo necesario por el motor para realizar sus múltiples funciones.
Como ya sabéis un script PHP es lineal, es decir se procesa línea a línea (a no ser que uses pipes,subprocesos o hebras,etc), luego start primero lanza el evento de arrancar el sistema, después el de lanzar los plugins (funciones boot en todos), una vez cargado todo lanza init y el evento para comunicar que el sistema está preparado para comenzar la ejecución de la siguiente capa, donde entra el usuario con el núcleo de sus plugins.
Las vistas se construyen entonces mediante estos plugins usando plantillas, puedes consultar el sistema de vistas en el manual:
http://docs.elgg.org/wiki/Engine/Views
pero básicamente, tu escribes tu plugin en mods, y las plantillas estarán en views…usan el motor de plantillas Smarty si mal no recuerdo.
En esa página tienes un ejemplo de cómo se haría!
suerte