Actualización:  [Tutorial] Crear un plugin básico para MyBB
El objetivo de este tutorial es mostrarte, en simple pasos, como se crea un plugin para MyBB. Este plugin es bastante simple, ya que no utiliza todas...

El objetivo de este tutorial es mostrarte, en simple pasos, como se crea un plugin para MyBB. Este plugin es bastante simple, ya que no utiliza todas las funciones básicas del sistema.
Solamente sirve de ejemplo para que puedas encontrar el camino correcto en esto.
La mejor manera de aprender a desarrollar un plugin es saber como funcionan otros. Personalmente te recomiendo investigar y modificar el plugin hello.php (que ya viene incluido en MyBB), aunque cualquier plugin simple servirá.

También.... hay que tener algo bien en claro: Qué es un plugin?

Definición de Plugin escribió:Los plugins son básicamente funciones en PHP que son ejecutadas en ciertos puntos a lo largo de la ejecución de MyBB.
Estos "ciertos puntos" -llamados hooks- estan ubicados sobre la mayor parte de archivos de MyBB (Ver lista completa).

Un plugin normalmente realiza dos cosas:
  • Enlaza funciones a determinados hooks
  • Edita los templates del theme para editar el "Look & Feel" del diseño.

Que son los templates? escribió:Los templates son pequeñas porciones de código HTML pero que pueden incluir variables (PHP). Puedes ver todos los templates existentes en:
Panel de Administración -> Plantillas y Estilos -> Plantillas -> Templates Predeterminados
*Extraido de la wiki de MyBB.



Los requisitos para poder desarrollar un plugin son:
  • Conocimientos medios de PHP y HTML.
  • Un editor de texto (Que no sea el bloc de notas. El Notepad++ sirve).
  • Ganas y mucha paciencia.

La función de nuestro futuro plugin será mostrar un mensaje a los invitados incitando a que se registren.
Como no se me ocurre ningún nombre decente, este plugin se llamará "registrate_loco".



=== Primer paso: Información del Plugin ===

Creamos un archivo llamado "registrate_loco.php" en la carpeta inc/plugins de MyBB con el siguente contenido:
Código PHP:
<?php

if(!defined("IN_MYBB"))
{
    die(
"Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
}

function 
registrate_loco_info()
{
    return array(
                
"name" => "Registrate loco",
                
"description" => "Muestra un mensaje a los usuarios no identificados invitando a que se registren o se identifiquen.",
                
"website" => "",
                
"author" => "Santiago Dimattia",
                
"authorsite" => "http://www.teleportz.com.ar",
                
"version" => "1.0",
                
"guid" => "",
                
"compatibility" => "16*"
            
);
}

?>

Como pueden ver, lo primero que hace el archivo es comprobar si la constante IN_MYBB existe. Si no existe, paramos la ejecución del archivo mostrando un lindo mensaje (Ya que esto significa que se intenta acceder al archivo directamente o desde una aplicación externa. Cuestiones de seguridad).

Luego creamos una funcion con el nombre "registrate_loco_info". Recordar que esta función debe contener el nombre del archivo php agregando un "_info" al final.

Esta función le da a MyBB todos los datos del plugin, las cuales son:
  • name: El nombre del plugin.
  • description: Una descripción del plugin.
  • website: El sitio oficial del plugin (Generalmente es la dirección del plugin en la sección de mods de MyBB, aunque puede ser otra o inexistente, como en este plugin).
  • author: El nombre del autor.
  • authorsite: El sitio web del autor.
  • version: La version del plugin. Ejemplos: 0.5, 0.5.9, 1.0 o 2.6.1.
  • guid: Un ID unico para el plugin que MyBB utiliza para comprobar si existen nuevas versiones disponibles (Este ID te lo genera la sección de Mods de MyBB cuando añades el plugin).
  • compatibility: Lista de versiones de MyBB compatibles con este plugin, separadas por coma. Soporta asteriscos. Ejemplos: 14*, 16*, 14*,16*.

Una buena práctica de desarrollo es agregar el nombre del plugin delante de TODAS las funciones, para así evitar errores de compatibilidad con otros plugins que usen la misma función.



=== Primer paso: Segunda parte (?) ===

Ademas de la función de información, también se encuentran las siguientes:
  • registrate_loco_install: Ejecutada al instalar el plugin desde el panel de administración. Ideal para realizar cambios en la base de datos.
  • registrate_loco_is_installed: Ejecutada cuando se accede a la administración de plugins. Debe devolver TRUE si el plugin se encuentra instalado o FALSE si no lo está (Generalmente esto se averigua consultando a la base de datos por si existe una tabla o un campo en especial).
  • registrate_loco_uninstall: Ejecutada al desinstalar el plugin desde el panel de administración.
  • registrate_loco_activate: Ejecutada al activar el plugin desde el panel de administración. Ideal para realizar cambios en los templates, en la traducción, etc.
  • registrate_loco_deactivate: Ejecutada al desactivar el plugin desde el panel de administración.

Nota:
  • Recordar que estas funciones, al igual que la de información, debe contener el nombre del archivo PHP seguido de la acción correspondiente.
  • La rutina de instalación no es obligatoria. Si no deseas usarla, simplemente no crees las siguientes funciones: xxx_install, xxx_is_installed, xxx_uninstall.




=== Segundo paso: Rutina de activación ===

Debido a que este plugin es muy básico, solamente usara las funciones que se ejecutan al activar y desactivar el plugin.

Lo que haremos en la activación es lo siguiente:
  • Crear un nuevo set de configuraciones para el plugin
  • Crear dos nuevas configuraciones: Una para activar/desactivar el plugin y otra para modificar el texto que se mostrará.
  • Actualizar el template "header" agregando una variable extra, la cual contendrá el aviso.

Empezemos. Creamos el grupo de opciones:
Código PHP:
<?php

function registrate_loco_activate()
{
    
// Creamos el grupo de opciones
    
$query $db->simple_select("settinggroups""COUNT(*) as rows");
    
$rows $db->fetch_field($query"rows");

    
$new_groupconfig = array(
        
'name' => 'registrate_logo'
        
'title' => 'Registrate loco',
        
'description' => 'Opciones para cambiar el texto del aviso o activar y desactivar el plugin.',
        
'disporder' => $rows+1,
        
'isdefault' => 0
    
);

    return 
true;
}

?>
Y luego las dos opciones correspondientes:
Código PHP:
<?php

function registrate_loco_activate()
{
    
// Creamos las opciones
    
$new_config = array();
        
    
$new_config[] = array(
        
'name' => 'registrate_loco_active',
        
'title' => 'Activar plugin',
        
'description' => 'Selecciona si deseas activar el plugin.',
        
'optionscode' => 'yesno',
        
'value' => '1',
        
'disporder' => 10,
        
'gid' => $group['gid']
    );

    
$new_config[] = array(
        
'name' => 'registrate_loco_texto',
        
'title' => 'Texto del aviso',
        
'description' => 'Cambia el texto del aviso',
        
'optionscode' => 'textarea',
        
'value' => '<a href="member.php?action=register">Registate</a> ahora para poder participar del concurso de una vaca y poder postear en los foros! (Si! Una vaca!)',
        
'disporder' => 10,
        
'gid' => $group['gid']
    );
    
    foreach(
$new_config as $array => $content)
    {
        
$db->insert_query("settings"$content);
    }
    
    return 
TRUE;
}

?>



=== Segundo paso, segunda parte: Rutina de activación - Modificando el template ===

Ahora debemos actualizar el template para añadir la variable que contendrá el aviso.

Para modificar los templates deberemos incluir el archivo inc/adminfunctions_templates.php y utilizar una función llamada find_replace_templatesets.

Dicha función acepta 3 parámetros:
  • El nombre del template a modificar.
  • Expresion regular (Lo que será reemplazado).
  • El contenido por lo que se le debe reemplazar.

Realizamos el cambio:
Código PHP:
<?php

function registrate_loco_activate()
{
    
// Editamos el template "header"
    
require MYBB_ROOT."/inc/adminfunctions_templates.php";
    
find_replace_templatesets('header''#{\$unreadreports}#''{$unreadreports}<!-- RegistrateLoco -->{$alerta_para_invitados}<!-- /RegistrateLoco -->');
    
    return 
TRUE;
}

?>

Bien! Ya terminamos esta parte. La función completa quedaría así.

Código PHP:
<?php

function registrate_loco_activate()
{
    
// Creamos el grupo de opciones
    
$query $db->simple_select("settinggroups""COUNT(*) as rows");
    
$rows $db->fetch_field($query"rows");

    
$new_groupconfig = array(
        
'name' => 'registrate_logo'
        
'title' => 'Registrate loco',
        
'description' => 'Opciones para cambiar el texto del aviso o activar y desactivar el plugin.',
        
'disporder' => $rows+1,
        
'isdefault' => 0
    
);

    
// Creamos las opciones
    
$new_config = array();
        
    
$new_config[] = array(
        
'name' => 'registrate_loco_active',
        
'title' => 'Activar plugin',
        
'description' => 'Selecciona si deseas activar el plugin.',
        
'optionscode' => 'yesno',
        
'value' => '1',
        
'disporder' => 10,
        
'gid' => $group['gid']
    );

    
$new_config[] = array(
        
'name' => 'registrate_loco_texto',
        
'title' => 'Texto del aviso',
        
'description' => 'Cambia el texto del aviso',
        
'optionscode' => 'textarea',
        
'value' => '<a href="member.php?action=register">Registate</a> ahora para poder participar del concurso de una vaca y poder postear en los foros! (Si! Una vaca!)',
        
'disporder' => 10,
        
'gid' => $group['gid']
    );
    
    foreach(
$new_config as $array => $content)
    {
        
$db->insert_query("settings"$content);
    }

    
// Editamos el template "header"
    
require MYBB_ROOT."/inc/adminfunctions_templates.php";
    
find_replace_templatesets('header''#{\$unreadreports}#''{$unreadreports}<!-- RegistrateLoco -->{$alerta_para_invitados}<!-- /RegistrateLoco -->');
    
    return 
TRUE;
}

?>

Notese que agregué 2 cositas:
Código:
// Para poder acceder a la base de datos:
global $db;

Devuelvo true (medio inútil... si)
return TRUE;



=== Tercer paso: Rutina de desactivación ===

Con un poco de ingeniería inversa, deshacemos los cambios realizados en la activación:

Código PHP:
<?php

function registrate_loco_deactivate()
{
    global 
$db;
    
    
// Borrar el grupo de opciones
    
$query $db->simple_select("settinggroups""gid""name = \"registrate_loco\"");
    
$rows $db->fetch_field($query"gid");

    
$db->delete_query("settinggroups""gid = {$rows}");
    
    
// Borrar las opciones
    
$db->delete_query("settings""gid = {$rows}");

    
rebuild_settings();
    
    
// Editar el template header
    
require MYBB_ROOT."/inc/adminfunctions_templates.php";
    
find_replace_templatesets('header''#' preg_quote('<!-- RegistrateLoco -->{$alerta_para_invitados}<!-- /RegistrateLoco -->') . '#''');
    
    return 
TRUE;
}

?>



=== Cuarto paso: Definir el mensaje para los invitados ===

Ahora solo nos queda definir la variable $alerta_para_invitados (La cual se encuentra en el template) para que muestre nuestro aviso.

Para realizar esto crearemos una función y la enlazaremos al hook "global_start". Este hook, como su nombre lo indica, se ejecuta justo antes de cargar el archivo global.php.

Dentro de esta función lo que haremos primero será comprobar si el usuario se encuentra identificado o no.
Si se encuentra identificado, no haremos nada, simplemente definiremos la variable como "nada".
En cambio, si se encuentra sin identificar, definiremos la variable con el contenido de la opción que creamos anteriormente.
Código PHP:
<?php

// Enlazamos la función al hook. Esta funcion acepta varios parámetros, pero solo estos dos son requeridos:
// 1) El nombre del hook
// 2) El nombre de la función
$plugins->add_hook('global_start''registrate_loco_mostrar_aviso');

function 
registrate_loco_mostrar_aviso()
{
    global 
$mybb$alerta_para_invitados;
    
    
// Si el plugin se encuentra desactivado, no hacemos nada.
    
if($mybb->settings['registrate_loco_active'] == '0')
    {
        return 
FALSE;
    }
    
    
// Comprobamos si el usuario esta logueado
    
if($mybb->user['uid'] != 0)
    {
        
// Si el uid del usuario es indistinto a cero, el usuario se encuentra identificado
        
$alerta_para_invitados '';
    }
    else
    {
        
// Si el uid es igual a 0, el usuario no se encuentra identificado
        
$alerta_para_invitados $mybb->settings['registrate_loco_texto'];
    }
}

?>

Y con esto terminamos el plugin!
Juntando todos los pedazos de código que hemos hecho, el archivo registrate_loco.php quedaría de esta manera:
Código PHP:
<?php

if(!defined("IN_MYBB"))
{
    die(
"Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
}

$plugins->add_hook('global_start''registrate_loco_mostrar_aviso');

function 
registrate_loco_info()
{
    return array(
                
"name" => "Registrate loco",
                
"description" => "Muestra un mensaje a los usuarios no identificados invitando a que se registren o se identifiquen.",
                
"website" => "",
                
"author" => "Santiago Dimattia",
                
"authorsite" => "http://www.teleportz.com.ar",
                
"version" => "1.0",
                
"guid" => "",
                
"compatibility" => "16*"
            
);
}

function 
registrate_loco_activate()
{
    global 
$db;
    
    
// Crear el grupo de opciones
    
$query $db->simple_select("settinggroups""COUNT(*) as rows");
    
$rows $db->fetch_field($query"rows");

    
$new_groupconfig = array(
        
'name' => 'registrate_logo'
        
'title' => 'Registrate loco',
        
'description' => 'Opciones para cambiar el texto del aviso o activar y desactivar el plugin.',
        
'disporder' => $rows+1,
        
'isdefault' => 0
    
);
    
    
$group['gid'] = $db->insert_query("settinggroups"$new_groupconfig);
    
    
// Crear las opciones
    
$new_config = array();
        
    
$new_config[] = array(
        
'name' => 'registrate_loco_active',
        
'title' => 'Activar plugin',
        
'description' => 'Selecciona si deseas activar el plugin.',
        
'optionscode' => 'yesno',
        
'value' => '1',
        
'disporder' => 10,
        
'gid' => $group['gid']
    );

    
$new_config[] = array(
        
'name' => 'registrate_loco_texto',
        
'title' => 'Texto del aviso',
        
'description' => 'Cambia el texto del aviso',
        
'optionscode' => 'textarea',
        
'value' => '<a href="member.php?action=register">Registate</a> ahora para poder participar del concurso de una vaca y poder postear en los foros! (Si! Una vaca!)',
        
'disporder' => 10,
        
'gid' => $group['gid']
    );
    
    foreach(
$new_config as $array => $content)
    {
        
$db->insert_query("settings"$content);
    }
    
    
rebuild_settings();
    
    
// Editar el template header
    
require MYBB_ROOT."/inc/adminfunctions_templates.php";
    
find_replace_templatesets('header''#{\$unreadreports}#''{$unreadreports}<!-- RegistrateLoco -->{$alerta_para_invitados}<!-- /RegistrateLoco -->');
    
    return 
TRUE;
}

function 
registrate_loco_deactivate()
{
    global 
$db;
    
    
// Borrar el grupo de opciones
    
$query $db->simple_select("settinggroups""gid""name = \"registrate_loco\"");
    
$rows $db->fetch_field($query"gid");

    
$db->delete_query("settinggroups""gid = {$rows}");
    
    
// Borrar las opciones
    
$db->delete_query("settings""gid = {$rows}");

    
rebuild_settings();
    
    
// Editar el template header
    
require MYBB_ROOT."/inc/adminfunctions_templates.php";
    
find_replace_templatesets('header''#{\$unreadreports}#''{$unreadreports}<!-- RegistrateLoco -->{$alerta_para_invitados}<!-- /RegistrateLoco -->');
    
    return 
TRUE;
}

function 
registrate_loco_mostrar_aviso()
{
    global 
$mybb$alerta_para_invitados;
    
    
// Si el plugin se encuentra desactivado, no hacemos nada.
    
if($mybb->settings['registrate_loco_active'] == '0')
    {
        return 
FALSE;
    }
    
    
// Comprobamos si el usuario esta logueado
    
if($mybb->user['uid'] != 0)
    {
        
// Si el uid del usuario es indistinto a cero, el usuario se encuentra identificado
        
$alerta_para_invitados '';
    }
    else
    {
        
// Si el uid es igual a 0, el usuario no se encuentra identificado
        
$alerta_para_invitados $mybb->settings['registrate_loco_texto'];
    }
}

?>

Creditos: Santiago - MyBBHispano
Excelente tutorial, gracias por traerlo!
Que raro que Santiago no lo hubiera publicado ya. xD
Supongo que lo olvido, por eso revise que no estuviera publicado.
Última modificación: 2 Mar, 2011, 8:21 am por Balda.
Este es el tutorial de santiago que tantos han buscado haha.
Vaya, hace tanto tiempo lo he leído y me sigue pareciendo muy bueno ^^
yo no tenia ningun conocimiento de PHP cuando empeze a crear plugins!
Hiciste lo de muchos; aprender haciendo. Big Grin
(2 Mar, 2011, 5:48 pm)Edson Ordaz escribió: yo no tenia ningun conocimiento de PHP cuando empeze a crear plugins!

attaboy!

Si tengo que enseñar a programar en PHP además de explicar como se crea un plugin, se hace muy largo el asunto.
Hay miles de tutoriales para programar en PHP, de todos los niveles y para todos los gustos.
Tutoriales para crear plugins en MyBB no hay.
Santiago, creo que el se refiere a esto:
Santiago escribió:Los requisitos para poder desarrollar un plugin son:
Conocimientos medios de PHP y HTML.
Un editor de texto (Que no sea el bloc de notas. El Notepad++ sirve).
Ganas y mucha paciencia.

Osea, a que no es/no fue un requisito para el.
(2 Mar, 2011, 9:43 pm)Exponsore escribió: Santiago, creo que el se refiere a esto:
Santiago escribió:Los requisitos para poder desarrollar un plugin son:
Conocimientos medios de PHP y HTML.
Un editor de texto (Que no sea el bloc de notas. El Notepad++ sirve).
Ganas y mucha paciencia.

Osea, a que no es/no fue un requisito para el.

Exacto... exacto.
No digo que PHP sea un requisito para aprender (aunque en mi post se podria haber malentendido...), pero si es un requisito para seguir este tutorial.
Este tut esta hecho para programadores que quieran hacer plugins... no es para todo público.

Para todos los que quieran aprender, sepan otro lang de programacion o no: aprendan PHP primero.
  • Van a entender completamente el tutorial
  • El resultado no va a ser un codigo desastroso <<<---- lo mas importante
Yo igual que Edson Wink
Yo aprendí cagándola y mirando el error.log jaja