Deprecated: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in /var/www/mybb-es.com/html/inc/class_language.php on line 201
[Tutorial] Crear un plugin básico para MyBB
Edson Ordaz   5 Mar, 2011, 8:26 pm
#1
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
Cluster   5 Mar, 2011, 9:16 pm
#2
sin duda un tutorial muy completo y va para importantes

:)
Ignnacio Ausente   5 Mar, 2011, 9:24 pm
#3
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.
DarkEternity   7 Mar, 2011, 11:06 am
#4
muchas gracias por el aporte personalmente me gusta mucho este tipo de foro y ayudar en todo lo que se pueda gracias
DARKNESSDH   16 May, 2011, 9:56 pm
#5
Tengo varias preguntas

Que sirve esto
Código PHP:
<?php 
$rows
= $db->fetch_field($query, "rows");

en especial el fetch_field

luego creando las opciones pusiste

Código PHP:
<?php 
$new_config
= array();
y despues
Código PHP:
<?php 
$new_config
[] = array(
Dos veces

para que sirve hacer eso?

ahora en esta parte
Código PHP:
<?php 
foreach($new_config as $array => $content)

que funcion tiene foreach?

porque no simplemente pusiste

Código PHP:
<?php 
$db
->insert_query("settings", $new_config);

el new_config

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


Edson Ordaz   16 May, 2011, 10:02 pm
#6
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!!!
DARKNESSDH   16 May, 2011, 10:06 pm
#7
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
Edson Ordaz   16 May, 2011, 10:09 pm
#8
Si mañana te explico esos 2 y si asi se usaria para uno solo pero sin el []
Tute_14   19 Nov, 2011, 2:53 pm
#9
Lindo, lindo. :3
Después me fijo si lo hago.
sahashi   14 Dec, 2011, 1:26 pm
#10
Gracias por el tuto pero como podria hacer uno para cambiar el codigo una themplate y agregar css?
  
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.