Mejora G-Forge 2: Integración de un Wiki general en la instalación de Gforge
De MorfeoWiki
Tabla de contenidos |
Introducción
Un wiki es una forma de sitio web en donde se acepta que usuarios creen, editen, borren o modifiquen el contenido de una página web, de una forma interactiva, fácil y rápida. Dichas facilidades hacen de un Wiki una herramienta efectiva para la escritura colaborativa.
En esta mejora se ha conseguido adaptar un Wiki a la estructura de Gforge. Para ello no ha sido necesario modificar ninguna parte del código de Gforge ya que la integración se realiza a traves de un plugin. Esto es una ventaja ya que la integración es muy sencilla además de la portabilidad.
Instalación
Requisitos
- PHP 4
- MySQL -> Los paquetes necesarios de mysql que requiere el mediawiki son:
+ mysql-server + libapache2-mod-php4 + apache2-mpm-prefork + php4-gd + php4-imagick + php4-mysql
Pasos a seguir
1. Copiar la carpeta /include en el directorio /usr/lib/gforge/plugins/mediawiki. Crear las carpetas necesarias.
2. Copiar la carpeta /mediawiki en el directorio /usr/share/gforge/www/plugins. Crear las carpetas necesarias.
3. Ejecutar el fichero db/add-plugin.sql en la base de datos de gforge.
Una vez hecho esto, para instalar el Wiki en la forja hay que acceder a él. El administrador debe acceder a un proyecto, por ejemplo Site admin. En la pestaña de admin del mismo acceder a Editar Información Pública. En la lista de funcionalidades del proyecto aparece Use MediaWiki Plugin. Lo seleccionamos y aparecerá una nueva pestaña en el proyecto que nos lleva al Wiki. Accedemos a ella y seguimos las instrucciones para instalar el Wiki.
Estructura
El plugin MediaWiki consiste en la instalación de un único Wiki para toda la forja. Esto es así debido a que sería necesario crear un plugin por cada proyecto para que existiera un Wiki entero por proyecto.
Al acceder al Wiki, internamente se accede al directorio en el que se encuentra y una vez ahí ya se accede a la base de datos para comprobar si la página accedida existe o no. Por lo tanto seria necesario crear un directorio diferente por cada Wiki que se quisiera instalar, además de utilizar nuevas bases de datos por cada uno.
Para adaptar el MediaWiki a Gforge ha sido necesario modificar gran parte de sus archivos aunque la estructura básica de funcionamiento sigue tal cual. La versión utilizada de MediaWiki para el plugin es la 1.6.8. Esta elección es debida a que la versión actual de Gforge utiliza php4 y ésta es la versión más reciente que lo utiliza; las nuevas versiones utilizan php5. Más información sobre MediaWiki en [1].
El plugin está formado por tres carpetas:
db
Aqui se encuentra el archivo add-plugin.sql que ejecutado en la base de datos de Gforge inserta la información del plugin. El código es:
INSERT INTO plugins (plugin_name,plugin_desc) VALUES ('mediawiki','MediaWiki Gforge Plugin');
include
En esta carpeta se encuentran los archivos necesarios para anclar el Wiki a la lista de funcionalidades y llamarlo como y cuando sea oportuno. Los archivos son mediawiki-init.php y MediaWikiPlugin.class y su código:
mediawiki-init.php:
<?php
require_once ('MediaWikiPlugin.class') ;
$MediaWikiPluginObject = new MediaWikiPlugin ;
register_plugin ($MediaWikiPluginObject) ;
?>
MediaWikiPlugin.class:
<?php
class MediaWikiPlugin extends Plugin {
function MediaWikiPlugin () {
$this->Plugin() ;
$this->name = "mediawiki" ;
$this->text = "MediaWiki" ; // To show in the tabs, use...
$this->hooks[] = "groupmenu";
$this->hooks[] = "groupisactivecheckbox" ; // The "use ..." checkbox in editgroupinfo
$this->hooks[] = "groupisactivecheckboxpost" ; //
$this->hooks[] = "project_admin_plugins"; // to show up in the admin page fro group
}
function CallHook ($hookname, $params) {
global $use_wikiplugin,$G_SESSION,$HTML;
$group_id=$params['group'];
if($hookname == "groupmenu") {
$project = &group_get_object($group_id);
if (!$project || !is_object($project))
return;
if ($project->isError())
return;
if (!$project->isProject())
return;
if ( $project->usesPlugin ( $this->name ) ) {
$params['TITLES'][]=$this->text;
if (isset($_COOKIE['wikidbUserID'])) {
if (!session_loggedin())
$params['DIRS'][]='/plugins/mediawiki/index.php?
id=' . $group_id .'&title=Especial:Userlogout&returnto='
.$project->getPublicName();
else{
$u =& user_get_object(user_getid());
$uname = $u->getUnixName();
$lan = $u->getLanguage();
if ($lan == 1)
$lannam = 'en';
else if ($lan == 4)
$lannam = 'es';
else
$lannam = 'en';
if (isset($_COOKIE['wikidbUserName']) && $uname !=
strtolower($_COOKIE['wikidbUserName']))
$params['DIRS'][]='/plugins/mediawiki/index.php?id=' . $group_id
.'&title=Especial:Userlogout&returnto='$project->getPublicName().'&uselang='.$lannam;
else
$params['DIRS'][]='/plugins/mediawiki/index.php?id=' . $group_id
.'&title='.$project->getPublicName().'&uselang='.$lannam;
}
}
else{
if (!session_loggedin())
$params['DIRS'][]='/plugins/mediawiki/index.php?id=' .
$group_id.'&title='.$project->getPublicName();
else{
$u =& user_get_object(user_getid());
$lan = $u->getLanguage();
if ($lan == '1')
$lannam = 'en';
else if ($lan == '4')
$lannam = 'es';
else
$lannam = 'en';
$params['DIRS'][]='/plugins/mediawiki/index.php?id=' . $group_id
.'&title='.$project->getPublicName().'&uselang='.$lannam;
}
}
} else {
$this->hooks["groupmenu"] = "";
//$params['TITLES'][]=$this->text." [Off]";
//$params['DIRS'][]='/plugins/mediawiki/index.php?off=true';
}
(($params['toptab'] == $this->name) ? $params['selected']=(count($params['TITLES'])-1) : );
} elseif ($hookname == "groupisactivecheckbox") {
//Check if the group is active
$group = &group_get_object($group_id);
echo "<tr>";
echo "<td>";
echo ' <input type="CHECKBOX" name="use_mediawikiplugin" value="1" ';
// CHECKED OR UNCHECKED?
if ( $group->usesPlugin ( $this->name ) ) {
echo "CHECKED";
}
echo ">
";
echo "</td>";
echo "<td>";
echo "Use ".$this->text." Plugin";
echo "</td>";
echo "</tr>";
} elseif ($hookname == "groupisactivecheckboxpost") {
$group = &group_get_object($group_id);
$use_mediawikiplugin = getStringFromRequest('use_mediawikiplugin');
if ( $use_mediawikiplugin == 1 ) {
$group->setPluginUse ( $this->name );
} else {
$group->setPluginUse ( $this->name, false );
}
} elseif ($hookname == "project_admin_plugins") {
global $Language;
$group_id = $params['group_id'];
$group = &group_get_object($group_id);
if ( $group->usesPlugin ( $this->name ) ) {
echo '<a href="/plugins/mediawiki/index.php?MediaWikiAdministration&id=' . $group->getID() .
'&type=g">' . $Language->getText('project_admin','wiki') . '</a>
';
}
}
}
}
?>
mediawiki
En esta carpeta se encuentra el esqueleto del Wiki.
Mejoras
A continuación se enumeran unas posibles mejoras o por lo menos alternativas en el plugin creado:
- La posibilidad de incluir nuevos idiomas. Esto se hace posible incluyendo un nuevo plugin. Para ello se incluye el mismo plugin pero renombrando la carpeta /mediawiki por /mediawiki-en por ejemplo. Además renombrar en la carpeta /includes los archivos mediawiki-init.php y mediawikiplugin.class por mediwikien-init.php y mediawikienplugin.class respectivamente. Ahora modificar el nuevo mediwikien-init.php cambiando los nombres del require once por el de la clase que acabamos de renombrar y la llamada new también. En el archivo que modifica la base de datos, cambiar donde pone mediawiki por mediawiki-en. Por último en el archivo mediawikienplugin.class cambiar cualquier ocurrencia de la palabra mediawiki por mediawikien.Con esto tenemos un nuevo plugin independiente del anterior en el cual podremos instalar otro nuevo Wiki con el idioma que deseemos. El idioma del Wiki se elige al instalarlo. El mayor inconveniente reside en que al ser un Wiki nuevo, también tiene una nueva base de datos de usuarios, por lo que resulta un pequeño problema a la hora de identificarse ya que habría que hacerlo más de una vez.Notar que cada usuario puede elegir el idioma con el que ver el Wiki (salvo los contenidos) en la página de preferencias.
- El administrador podría ser el que decidiera si un usuario externo a la forja o incluso a un proyecto al que no pertenece pudiera editarlo. Por el momento no se puede editar más que los proyectos a los que pertenece un usuario.
- Una alternativa que se ha estudiado es la de introducir un Wiki por proyecto. Para que pueda ser posible, el administrador se debe de encargar de copiar un plugin por cada proyecto que lo requiera de tal manera que debería renombrarlos de la misma forma que se realizaría si incluyéramos un nuevo lenguaje.
- Es posible que algunos navegadores no obtengan un rendimiento óptimo de la visibilidad del sitio. Esto es debido a que el Wiki emplea una hoja de estilos con valores de posición absoluta y no todos los navegadores lo muestran de la misma manera. Se podría mejorar la hoja de estilos para que el sitio fuera accesible.
Planificación
- Prioridad: Alta
- Responsable: UPM
Resultados
Se ha conseguido integrar un Wiki editable por los usuarios de la forja y accesible para cualquier proyecto.
Temas pendientes
- Generar documento de instalación (con instalación en forja ya funcionando)
- Generar documento de mejoras futuras
- Estudiar la posibilidad de multilenguaje
- Control de acceso a las páginas de proyecto
- Estudiar si se tiene 1 wiki por proyecto o 1 wiki por forja
