[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:
<?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:
<?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:

<?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:
<?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í.

<?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:

// 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:

<?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.

<?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:

<?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
Archivos Adjuntos

sin duda un tutorial muy completo y va para importantes
:)
Completo, gracias edson me pondré a ver php y después seguiré esto.
Yo ya iba a subirlo a importantes pero solstice se adelanto xD.
muchas gracias por el aporte personalmente me gusta mucho este tipo de foro y ayudar en todo lo que se pueda gracias
Tengo varias preguntas

Que sirve esto
   $rows = $db->fetch_field($query, "rows");

en especial el fetch_field

luego creando las opciones pusiste

  $new_config = array();
y despues
 $new_config[] = array(
Dos veces

para que sirve hacer eso?

ahora en esta parte
 foreach($new_config as $array => $content)

que funcion tiene foreach?

porque no simplemente pusiste

  $db->insert_query("settings", $new_config);

el new_config

Bueno esos son los puntos que a simple vista no entendi..


Fetch_field es un comando que crea MyBB dsde el db_mysql mañana te lo explico bien como funviona exactamente xq ando en el cel...

Los new config son como arreglos y digamos que todo se gusrada en ese el primerones array(); xq llevara varios datos no solo uno.
Y el foreach es como para imprimir todos osea hace que se instalentodos mas o menos sirve como el while!!!
aaaa ^^"!

osea el $new_config = array(); se utiliza cuando hay mas de dos grupos por asi decirlo?

y cuando solo hay uno se utilizaria solo el

$new_config[] = array(
aca todo
)

el foreach y el Fetch_field no entendi muy bien mañana me explicas
Si mañana te explico esos 2 y si asi se usaria para uno solo pero sin el []
Lindo, lindo. :3
Después me fijo si lo hago.
Gracias por el tuto pero como podria hacer uno para cambiar el codigo una themplate y agregar css?
Colaboradores
Tute_14 sahashi Ignnacio DARKNESSDH DarkEternity Cluster
This forum uses Lukasz Tkacz MyBB addons.