Vistas

Mejora G-Forge 12: Mejor soporte a weblogs de desarrollo

De MorfeoWiki

Tabla de contenidos

Introducción

GForge dispone de una funcionalidad de diario por cada usuario en el que anotar apuntes simples. Este diario es demasiado básico en cuanto a sus capacidades ya que serían necesarias algunas características que dotaran a GForge de mayor poder de seguimiento y de comunicación entre usuarios.

Por lo tanto, la mejora planteada consiste en añadir una herramienta de gestión de weblogs que aumente la funcionalidad del diario y que permita a cada usuario mayor número de opciones de tratamiento de su blog personal. Además, al tratarse de un entorno colaborativo, es conveniente que otros usuarios puedan comentar los apuntes realizados para poder conseguir una buena realimentación de ideas.

Planificación

  • Prioridad: Alta
  • Responsable: UPM

Requisitos

Antes de proceder a la instalación de la herramienta de gestión de blogs se deben tener instalados los siguientes paquetes:

+ mysql-server
+ mysql-admin
+ libapache2-mod-php4
+ php4-mysql

Además debe estar habilitada la carga del módulo mysql.so en php. Para ello debe modificarse el archivo de configuración php.ini para indicar el directorio donde residen los módulos a cargar (extensiones) y añadir la carga del mismo. Como ejemplo se muestran las modificaciones en el archivo php.ini de la instalación de prueba de GForge:

...
; Directory in which the loadable extensions (modules) reside.
extension_dir = "/usr/lib/php4/20050606"
...
extension=mysql.so
...

Elección y modificaciones de la herramienta de weblogs

Tras un estudio detallado de las herramientas de gestión de weblogs existentes en la actualidad se decidió que la herramienta candidata fuera b2Evolution por su oferta de funcionalidades, su fácil instalación y la gran cantidad de información asociada de la que dispone.

Esta herramienta posee su propia base de datos en MySQL, y el punto de unión entre el blog y GForge es la gestión de usuarios, por lo que son necesarias determinadas modificaciones en el blog para que toda la administración de usuarios se registre en GForge. Estas modificaciones se explican a continuación:

La herramienta de weblogs posee su propio sistema de autenticación, por lo que para la integración es necesario adaptarla para que se realice un login automático cuando se accede desde GForge. Para ello, gracias al fácil mecanismo de aplicación de plugins proporcionado por b2Evolution, se ha implementado un plugin (fichero www/blogs/plugins/_gforge_login.plugin.php) que reconoce el acceso desde GForge y autentica al usuario en el blog automáticamente.

Otra modificación que se debe realizar en el blog involucra al cambio de los datos personales de un usuario. En el blog se ofrece una sección de gestión del perfil de usuario en la que se administran tanto los datos personales, que son comunes en b2Evolution y GForge (login, nombre, apellidos, email y password), como algunos datos adicionales de usuario en el blog. Es necesario que, al acceder a la parte de gestión de datos personales, se administren desde la parte de GForge para que los posibles cambios se registren en ambas bases de datos.

Para ello, se ha modificado la interfaz con el usuario en el blog para que al acceder a su perfil, en lugar de que aparezcan los datos personales, se muestre un link a la administración de dichos datos en GForge.

Se necesita un cambio similar a éste a la hora de la creación y borrado de usuarios, ya que estas tareas deben hacerse desde la administración de GForge para que los cambios se registren correctamente en ambas bases de datos.

Por otro lado, la instalación de la herramienta crea una serie de blogs y usuarios por defecto que no son útiles para GForge. Además, en el caso del administrador de la forja así como al aplicar la mejora sobre una forja ya instalada y con usuarios registrados, sí que es necesario que éstos sean creados por defecto en la herramienta de weblogs, por lo que la instalación que proporciona b2Evolution ha tenido que ser modificada para tratar estas dos situaciones.

El aspecto del blog también ha sido modificado para que se muestre integrado dentro del marco de GForge.

Finalmente se ha creado el fichero www/blogs/posts_utils.php, con la función show posts latest, encargada de mostrar los últimos 10 posts creados para que se muestren en la página principal de GForge.

Modificaciones en GForge

Para realizar esta mejora ha sido necesario modificar y crear algunos ficheros de GForge, ya que se debía reemplazar el antiguo diario personal e integrar la nueva herramienta de weblogs. A continuación se exponen las actualizaciones realizadas (los fragmentos de texto a buscar pueden no coincidir exactamente con los originales debido a los caracteres en blanco):

  • Clase common/include/UserSynchronizer.class. Para el tratamiento de usuarios se ha creado la clase UserSynchronizer, encargada de sincronizar los cambios y las creaciones de usuarios de la base de datos de GForge con la de b2Evolution. Esta clase trata con la clase User.class de GForge y con BlogUser.class del blog. Cada vez que es necesario un cambio de datos o creación de un usuario, se llama a UserSynchronizer para que realice la operación sobre ambas clases usuario y por lo tanto, sobre ambas bases de datos. De esta forma las bases de datos se independizan para evitar posibles inconsistencias.
  • www/include/pre.php. Modificar este archivo para incluir la clase UserSynchronizer.

Buscar:

//user functions like get_name, logged_in, etc
require_once('common/include/User.class');

y añadir a continuación:

//user functions to synchronize the User data edition in every GForge databases
require_once('common/include/UserSynchronizer.class');
  • www/account/register.php, encargado de la creación de un nuevo usuario para tratar con la clase UserSynchronizer.

Buscar:

$new_user = new User(); 
$register = $new_user->create($unix_name,$firstname,$lastname,$password1,$password2,
                       $email,$mail_site,$mail_va,$language_id,$timezone,$jabber_address,
                       $jabber_only,$theme_id,' ',$address,$address2,$phone,$fax,$title,$ccode);

y reemplazarlo por:

require_once('www/blogs/inc/_gforge.inc.php'); 
$sync_user = new UserSynchronizer(); 
$register = $sync_user->create($unix_name,$firstname,$lastname,$password1,$password2,
                        $email,$mail_site,$mail_va,$language_id,$timezone,$jabber_address,
                        $jabber_only,$theme_id,' ',$address,$address2,$phone,$fax,$title,$ccode);

Buscar:

$feedback = $new_user->getErrorMessage();

y añadir en la línea anterior:

$new_user = $sync_user->getGforgeUser;

para solicitar al UserSynchronizer el usuario actual.

  • www/account/index.php, encargado de permitir a un usuario modificar sus datos personales

Buscar:

$u =& user_get_object(user_getid()); 
if (!$u || !is_object($u)) {
    exit_error('Error','Could Not Get User');
} elseif ($u->isError()) {
    exit_error('Error',$u->getErrorMessage());
}

Y reemplazarlo por:

require_once('www/blogs/inc/_gforge.inc.php'); 
$usync = new UserSynchronizer(user_getid()); 
$u =& $usync->getGforgeUser();

para tratar con la clase UserSynchronizer

Buscar:

!$u->update($firstname, $lastname, $language, $timezone, $mail_site, $mail_va,
     $use_ratings,$jabber_address,$jabber_only,$theme_id,$address,$address2,
     $phone,$fax,$title,$ccode)

Y reemplazarlo por:

!$usync->update($firstname, $lastname, $language, $timezone,$mail_site, $mail_va, $use_ratings,
         $jabber_address,$jabber_only,$theme_id,$address,$address2,$phone,$fax,$title,$ccode)

para actualizar el usuario actual

  • www/account/change_pw.php, encargado de tratar que un usuario modifique su password.

Buscar:

$u =& user_get_object(user_id); 
if (!$u || !is_object($u)) {
   exit_error('Error','Could Not Get User');
} elseif ($u->isError()) {
   exit_error('Error',$u->getErrorMessage());
}

Y reemplazarlo por:

require_once('www/blogs/inc/_gforge.inc.php'); 
$usync = new UserSynchronizer(user_id);
$u =& $usync->getGforgeUser();

para tratar con la clase UserSynchronizer

Buscar:

if (!$u->setPasswd($passwd)) {

Y reemplazarlo por:

if (!$usync->setPasswd($passwd)) {

para actualizar la password del usuario

  • www/account/change_email.php, encargado de tratar que un usuario modifique su email.

Buscar:

$u =& user_get_object(user_id);
if (!$u || !is_object($u)) {
   exit_error('Error','Could Not Get User');
} elseif ($u->isError()) {
   exit_error('Error',$u->getErrorMessage());
}

Y reemplazarlo por:

require_once('www/blogs/inc/_gforge.inc.php');
$usync = new UserSynchronizer(user_getid());
$u =& $usync->getGforgeUser();

para tratar con la clase UserSynchronizer

Buscar:

if (!$u->setNewEmailAndHash($newemail, $confirm_hash)) {

Y reemplazarlo por:

if (!$usync->setNewEmailAndHash($newemail, $confirm_hash)) {

para actualizar el email del usuario

  • www/account/logout.php, encargado de eliminar la sesión del usuario actual.

Buscar:

session_logout();

Y añadir a continuación:

//delete the session of the user in the blog
require_once ('www/blogs/conf/_config.php');
require_once $inc_path.'_main.inc.php';
if ($Session->has_User()){
   logout();
}

para que se elimine la sesión en el blog cuando un usuario sale de GForge.

  • www/admin/useredit.php, encargado de tratar la modificación por parte del administrador de los datos de otros usuarios.

Buscar:

$u =& user_get_object(user_id);
if (!$u || !is_object($u)) {
   exit_error('Error','Could Not Get User');
} elseif ($u->isError()) {
   exit_error('Error',$u->getErrorMessage());
}

Y reemplazarlo por:

require_once('www/blogs/inc/_gforge.inc.php');
$usync = new UserSynchronizer(user_id);
$u =& $usync->getGforgeUser();

para tratar con la clase UserSynchronizer

Buscar:

!$u->delete(true)

Y reemplazarlo por:

!$usync->delete(true)

Buscar:

if (!$u->setEmail($email) || !$u->setShell($shell)|| !$u->setStatus($status)) {

Y reemplazarlo por:

if (!$usync->setEmail($email) || !$usync->setShell($shell) || !$usync->setStatus($status)) {

Buscar:

$u->setUnixStatus

Y reemplazarlo por:

$usync->setUnixStatus

para actualizar los datos del usuario

  • www/admin/userlist.php, encargado de tratar la modificación por parte del administrador de los datos de otros usuarios.

Buscar:

$u =& user_get_object(user_id); 
if (!$u || !is_object($u)) {
   exit_error('Error','Could Not Get User');
} elseif ($u->isError()) {
  exit_error('Error',$u->getErrorMessage());
}

Y reemplazarlo por:

require_once('www/blogs/inc/_gforge.inc.php');
usync = new UserSynchronizer(user_id);
$u =& $usync->getGforgeUser();

para tratar con la clase UserSynchronizer

Buscar:

!$u->delete(true)

Y reemplazarlo por:

!$usync->delete(true)

para actualizar el estado del usuario

  • www/include/user_home.php, encargado de mostrar la página que un usuario puede ver de otro usuario.

Buscar:

$res=db_query("SELECT count(*) from user_diary "."WHERE user_id='". $user_id ."' AND is_public=1");
 echo $Language->getText('user_home','diary_notes_entries').' '.db_result($res,0,0).' 
 <p> 
   <a href="/developer/diary.php?diary_user='. $user_id .'">'. 
   $Language->get('user_home','diary_notes_view').'</a>
 <?p>
 <p>
   <a href="/developer/monitor.php?diary_user='. $user_id '">'. 
   html_image("ic/check.png",'15','13',array(),0) . 
   $Language->getText('user_home','diary_notes_monitor').'</a>
 </p>';

Y reemplazarlo por:

//now, a GForge user has only one blog, it’s named by the user name
 echo $Language->getText('user_home','diary_notes_entries').' 
 <p> 
   <a href="/blogs/index.php/'. $user->getUnixName() .'">'. 
   Language->getText('user_home','diary_notes_view').'</a>
 </p>';

para incluir un enlace al weblog personal y eliminar el enlace a la antigua bitácora.

  • www/include/html.php, encargado de ofrecer funcionalidades de HTML, para modificar el enlace a la bitácora por el enlace al blog

Buscar:

/my/diary.php

Y reemplazarlo por:

/blogs/admin.php
  • www/include/Layout.class, encargado, entre otras cosas, de mostrar la cabecera de cada página, para que cuando un usuario se dirija al área de administración de su blog, dicha área se encuentre bajo la pestaña "Mi página".

Buscar:

elseif (strstr($GLOBALS['REQUEST_URI'],'/my/') || strstr($GLOBALS['REQUEST_URI'],'/account/') ||
        strstr($GLOBALS['REQUEST_URI'],'/themes/') ) {

Y reemplazarlo por:

elseif (strstr($GLOBALS['REQUEST_URI'],'/my/') ||strstr($GLOBALS['REQUEST_URI'],'/account/') ||
        strstr($GLOBALS['REQUEST_URI'],'/themes/') ||               
        strstr($GLOBALS['REQUEST_URI'],'/blogs/admin') ) {
  • Para incluir un marco en la página principal de GForge en el que se puedan ver los últimos post creados se ha de modificar los siguientes ficheros:
    • www/index.php:
Buscar:
require_once('www/news/news_utils.php');
Y añadir a continuación:
require_once('www/blogs/posts_utils.php');
  • /etc/gforge/custom/index_std.php:
Buscar:
echo $HTML->boxBottom();
y añadir a continuación:
//latest posts
echo $HTML->boxTop($Language->getText('group','long_posts'));
posts_show_latest();
echo $HTML->boxBottom();
Para llamar a la función que ha sido implementada en el blog para que muestre los 10 últimos posts creados.
  • www/include/languages/Spanish.tab y www/include/languages/Base.tab, para adaptar los términos relativos al diario a términos relativos al weblog y presentar correctamente los términos del marco de la página principal.

Instalación

Una vez modificados los ficheros indicados, para finalizar la correcta instalación de la herramienta de weblogs, es necesario incluir la carpeta blogs del paquete de instalación de la mejora en el directorio www de GForge. Se debe crear una base de datos en MySQL y acceder desde el navegador a http://dominio-gforge/blogs/install/index.php, donde se configurará la base de datos para finalizar la instalación.

Resultados

El resultado de esta mejora es la incorporación de un weblog personal por usuario totalmente integrado en el entorno de GForge.

Un usuario autenticado en GForge puede acceder a su blog mediante el link Weblog que aparece en la pestaña Mi página. Este acceso permite administrar el blog personalmediante un interfaz de pestañas con el que es posible crear categorías, introducir nuevos posts, gestionar los posts ya creados, moderar comentarios y gestionar los datos personales.

Para leer el blog personal de otro usuario es necesario acceder al link Ver Weblog. Aquí se ofrece una interfaz distinta a la de administraci´on en la que poder leer los posts publicados por el autor y realizar comentarios a los mismos.

Además se ha estudiado una forma de acceso cómodo a este blog desde dispositivos móviles basada en llamadas XML-RPC al API Metaweblog, que implementa b2Evolution, y en la plataforma MyMobileWeb. Siguiendo por esta línea se podría conseguir un acceso en movilidad bastante completo.