Crear Módulos

En este apartado vamos a esponer la metodología básica que debes seguir para crear un módulo.

Usar Skeleton para empezar tu módulo

Skeleton es un módulo especial. Su cometido es ofrecer un punto de partida bonito y con comentarios para la creación de tus propios módulos.

Usar ModuleMaker para empezar tu módulo

  1. Descarga el módulo ModuleMaker.
  2. Instálalo de la misma forma que cualquier otro módulo.
  3. Dirígete a Extensiones -> ModuleMaker y sigue los pasos que te indique el ayudante.
  4. Para Unix/Linux, tendrás que cambiar la propiedad del módulo.
  5. Añade la funcionalidad que quieras al módulo.

Acceder al page_id de la página actual o a su alias

$gCms->variables['page_name'] (para obtener el alias de la página)
$gCms->variables['content_id'] (para obtener su id)

Mostrar un mensaje de estado como los que aparecen tras editar una página

Sólo hay que añadir otro parámetro a la función Redirect. Reemplaza esto:

$this->Redirect($id, 'defaultadmin', $returnid);

con algo como esto (sustituye 'templateupdated' con el nombre de la cadena del idioma que quieras mostrar):

$params = array('module_message' => $this->lang('templateupdated'));
$this->Redirect($id, 'defaultadmin', $returnid, $params);
Nota: esto sólo funciona en CMSMS 1.0+

Mostrar un mensaje de estado para una pestaña concreta

En este ejemplo mostraremos un mensaje tras editar la plantilla de la lista de comentarios en el módulo Comments (comentarios).

Primero abrimos el fichero action.updatelisttemplate.php y buscamos esta línea:

$this->Redirect($id, 'defaultadmin');

y la reemplazamos por éstas:

$params = array('tab_message'=> 'list_template_updated', 'active_tab' => 'list_template');
$this->Redirect($id, 'defaultadmin', '', $params);

Ahora necesitamos añadir la cadena de idioma de 'list_template_updated' así que abrimos lang/en_US.php (para el caso del inglés), y añadimos esta línea:

$lang['list_template_updated'] = 'The Comments Display template was successfully updated.';

A continuación abrimos el fichero action.defaultadmin.php y buscamos una línea como ésta:

echo $this->StartTabHeaders();

Necesitamos que la variable $tab almacene el nombre de la pestaña que debe tener el foco, así que añadimos unas líneas y quedaría así:

echo $this->StartTabHeaders();
if (FALSE == empty($params['active_tab']))
{
    $tab = $params['active_tab'];
} else {
    $tab = '';
}

Ahora buscamos una línea como ésta:

echo $this->SetTabHeader('list_template', $this->Lang('list_template'));

Y la cambiamos por algo como esta otra:

echo $this->SetTabHeader('list_template', $this->Lang('list_template'), ('list_template' == $tab));

Esto básicamente dice que si $params['active_tab'] == 'list_template' entoncs activa esta pestaña.

Después bajamos y buscamos esta línea:

echo $this->StartTab('list_template');

Para mostrar el mensaje de estado tenemos que pasarle el parametro $params. Así que la cambiamos por:

echo $this->StartTab('list_template', $params);

Ahora, cuando alguien pulse el botón "Submit" en la pestaña de la plantilla de Comment Display, será devuelto a esa pestaña y se mostrará el mensaje de éxito.

Ejemplo: Comments-display-template-updated.png

Nota: ésto sólo funciona en CMSMS 1.0+

Mostrar mensajes de error al resolver problemas de enlace al wiki

Usa el siguiente código:

echo $this->ShowErrors($this->Lang('error_nofilesuploaded'));
Nota: ésto sólo funciona en CMSMS 1.0+

Habilitar las traducciones desde el Centro de traducciones

Ésto está adaptado de esta página: ¡Nueva herramienta de traducción para los módulos y el núcleo!. Deberas registrarte en el Forge y luego solicitar ser agregado al proyecto de traducciones de español.

Si eres un desarrollador de módulos, y si has internacionalizado tu módulo (es decir, si tiene una carpeta de lenguajes), entonces tu módulo será listado en el Centro de traducciones.

Por favor, no envíes ningún otro lenguaje salvo el idioma natural de tu módulo (el del lenguaje natural listado en la categoría de Forge). Por ejemplo, el lenguaje natural de TagRep es el inglés (aunque el autor habla alemán). Por lo tanto, sólo debe tener en_US.php en el repositorio de módulos.

El fichero de tu idioma (como en_US.php) debe estar directamente en la carpeta /lang. Desde allí obtendrás todos los ficheros de traducción, que a su vez estarán en la carpeta /lang/ext (todos ellos, y no con una carpeta por idioma como hasta ahora).

Tendrás que añadir que añadir un comando al proyecto SVN de tu módulo para que coja todos los idiomas cuando se actualiza por SVN. Recuerda que habrá gente que trabaje con la versión SVN de tu módulo y no con la versión liberada para su descarga.

El comando que debes incluir en el SVN de tu módulo es (cambiando ModuleName por el nombre de tu módulo, claro):

para usuarios de Unix:

svn propedit svn:externals modules/ModuleName/lang

En ese fichero añade:

ext http://svn.cmsmadesimple.org/svn/translatecenter/modules/ModuleName/lang/ext

para usuarios de Windows con TortoiseSVN:

Ve a la versión de trabajo de tu módulo. Allí, haz click derecho y elige Propiedades. Encontrarás una pesañas llamada Subversion (con el icono de tortoise). Ahí puedes elegir las propiedades. Selecciona svn:externals del menú desplegable y escribe en la casilla de edición:

lang/ext http://svn.cmsmadesimple.org/svn/translatecenter/modules/ModuleName/lang/ext

pulsa Set y no te olvides de volver a hacer un commit de todo el módulo, o al menos de la carpeta lang..

Ahora ejecuta los siguientes comandos

svn cleanup lang
svn update
svn commit lang
svn update lang

Solo necesitas hacer esto una vez, por favor, hazlo lo antes posible.

Si eres un desarrollador de módulos pero también hiciste una traducción, por favor únete al proyecto del lenguaje correspondiente. Esto te permitirá tener los permisos apropiados para introducir las traducciones en el Centro de traducción.

Si tu lenguaje no existe en Forge, crea un proyecto e infórmanos para que te añadoamos en la configuración del Centro de traducción.

Por último, si eres un desarrollador de módulos sin internacionalizar (es decir, el lenguaje está en el código), entonces tu módulo no está en la herramiento de traducción. Te rogamos nos informes si añades internacionalización a tu módulo, para que podamos añadirte a la herramienta de traducción.

Cómo hacer que tu módulo use URLs limpias

En este ejemplo (desarrollado por Elijah Lofgren), vamos a hacer que el módulo Album use URLs bonitas.

Actualmente Album utiliza este tipo de URL para las fotos:

index.php?mact=Album,cntnt01,default,0&cntnt01albumid=1&cntnt01pictureid=2&cntnt01returnid=55

y URL como esta para acceder a los álbumes:

index.php?mact=Album,cntnt01,default,0&cntnt01albumid=1&cntnt01returnid=54

Como puedes ver tenemos los parámetros "albumid", "pictureid", y "returnid". Tenemos que registrar esos parámetros en CMSMS para que podamos usar URLs limpias.

Los parámetros se registran en la función SetParameters de tu módulo. Por ejemplo, en el fichero Album.module.php tenemos que cambiar la función SetParameters() function de ésto:

function SetParameters()
{
	$this->CreateParameter('albums', '', $this->lang('help_albums'));
}

a ésto:

function SetParameters()
{
	$this->CreateParameter('albums', '', $this->lang('help_albums'));
	// For viewing a picture
	$this->RegisterRoute('/album\/(?P<albumid>[0-9]+)\/(?P<pictureid>[0-9]+)\/(?P<returnid>[0-9]+)$/', 
array('action'=>'default'));
	// For viewing an album
	$this->RegisterRoute('/album\/(?P<albumid>[0-9]+)\/(?P<returnid>[0-9]+)$/',
 array('action'=>'default'));
	// For viewing a thumbnail page
	$this->RegisterRoute('/album\/(?P<albumid>[0-9]+)\/page(?P<page>[0-9]+)\/(?P<returnid>[0-9]+)$/',
 array('action'=>'default'));
}

Un poco de información sobre la expresión regular (regex) de arriba:

(20:32:13) elijahlofgren: sé algo de expresiones regulares pero, ¿para qué vale el "?P"?
(20:32:48) Ted: ¿conoces la selección de resultados? Con eso básicamente se le da un nombre al resultado en lugar de buscarlo mediante un índice.
(20:33:20) Ted: Así que, cuando encuentro mis resultados, puedo pasar eso como parámetros que estaban en la cadena larga.
(20:33:39) elijahlofgren: Ted: ah, ok. (cree que lo entiende).
(20:34:36) Ted: De manera que, tendré $matches['albumid'] en lugar de $matches[1] en mis resultados para esos [0-9]+

Esta es la información para la función RegisterRoute:

/**
 * Register a route to use for pretty url parsing
 *
 * @param string Route to register
 * @param array Defaults for parameters that might not be included in the url
 */
function RegisterRoute($routeregex, $defaults = array())

A continuación necesitamos usar URLs limpias en los enlaces que genera Album.

Las URLs se muestran generar la función CreateLink. Su prototipo es:

CreateLink($id, $action, $returnid='', $contents='', $params=array(), $warn_message='', $onlyhref=false, 
$inline=false, $addttext='', $targetcontentonly=false, $prettyurl='') 

Este es un ejemplo de la función que genera la URL que permite ver un album:

$albums[$i]->link = $this->CreateLink($id, 'default', $returnid, '', 
array('albumid'=>$albums[$i]->id), '', true);

Necesitamos añadirle el parámetro $prettyurl para que sea:

$albums[$i]->link = $this->CreateLink($id, 'default', $returnid, '', 
array('albumid'=>$albums[$i]->id), '', true, false, '', false, 'album/'.$albums[$i]->id.'/'.$returnid);

Así la URL para ver un Album será:

/album/1/54/

En lugar de:

/index.php?mact=Album,cntnt01,default,0&cntnt01albumid=1&cntnt01returnid=54

Mucho más bonita Emoticon wink.png.

También necesitamos añadir URLs bonitas al resto de llamadas a CreateLink:

Buscamos:

$allpictures[$i]->link = $this->CreateLink($id, 'default', $returnid, '', 
array('albumid'=>$albumid,'pictureid'=>$allpictures[$i]->id), '', true);

Y lo cambiamos por:

$allpictures[$i]->link = $this->CreateLink($id, 'default', $returnid, '', 
array('albumid'=>$albumid,'pictureid'=>$allpictures[$i]->id), '', true, '', '', '', 
'album/'.$albumid.'/'.$allpictures[$i]->id.'/'.$returnid);

Así la URL para ver una imagen es:

/album/1/2/54/

En lugar de:

/index.php?mact=Album,cntnt01,default,0&cntnt01albumid=1&cntnt01pictureid=2&cntnt01returnid=54

Hay una última URL que necesitamos cambiar, la que muestra la página de miniaturas:

Buscamos:

$link['page'][$i] = $this->CreateLink($id, 'default', $returnid, '', array('albumid'=>$albumid,'page'=>$i), '', true);

Y lo cambiamos por:

$link['page'][$i] = $this->CreateLink($id, 'default', $returnid, '', array('albumid'=>$albumid,'page'=>$i), '', true, 
'', '', '', 'album/'.$albumid.'/page'.$i.'/'.$returnid);

La URL para ver una oágina de miniaturas será:

/album/1/page2/54/

En lugar de:

/index.php?mact=Album,cntnt01,default,0&cntnt01albumid=1&cntnt01page=2&cntnt01returnid=54


Espero que a través de este ejemplo puedas deducir cómo hacer que tu módulo use URLs bonitas.

Si tienes preguntas o problemas, por favor dilo en el Modules/Add-Ons foro.



This page in: English - Deutsch - Español - Français - Italiano - Lietuvių - Nederlands - Norsk - Polski - Česky - Русский - Svenska - Tiếng Việt - عربي - 日本語 简体中文

User Handbook/Developers Guide/Creating Modules/es

From CMSMS

A2 Hosting