[Tutorial] Estructura de un plugin - Aprende a crear plug de MyCode
Hola amigos bueno primero que nada YO SOY CREADO DE ESTE TUTORIAL y lo posteo en este foro asi que pido que no se roben mis creditos y no lo posten e...

Hola amigos bueno primero que nada YO SOY CREADO DE ESTE TUTORIAL y lo posteo en este foro asi que pido que no se roben mis creditos y no lo posten en otros foros ya que pues lo creo para ustedes y si se llegase a publicar en otra web yo lo hare donde y cuando quiera ok?

Bueno primero este tutorial lo creo a peticion de varios usuarios que me estan dice y dice por el MSN!!

Bueno voy a explicar la estructura de un plugin sencillo y pequeño!!

bbname.php Creado por nuestro gran amigo Solstise este plugin como sabemos lo que hace remplazar [bbname] en los post por el nombre del foro!!

El plugin es el siguiente!

<?php
$plugins->add_hook("parse_message", "bbname_run");

function bbname_info()
{
	return array(
		"name"			=> "BB Name MyCode",
		"description"	=> "Muestra El nombre del Foro",
		"website"		=> "http://www.xpresionzone.net",
		"author"		=> "Walkman 5.0",
		"authorsite"	=> "http://www.xpresionzone.net",
		"version"		=> "1.0",
		"compatibility" => "14*,16*",
	);
}
function bbname_activate()
{
}

function bbname_deactivate()
{
}
function bbname_run($message)
{
    global $mybb;
    $bbname = ($mybb->settings['bbname'] );
    return str_replace("[bbname]", $bbname, $message);
}
?>

Primero que nada notamos que asta arriba dice esto

<?php
$plugins->add_hook("parse_message", "bbname_run");

donde <?php es que desde ai empieza el archivo y pues ovio es un php y $plugins->add_hook("parse_message", "bbname_run"); quiere decir que en parse_message que es igual alos mensajes o post ejecutara bbname_run el cual encontraremos mas abajo!!

despues viene

function bbname_info()
{
	return array(
		"name"			=> "BB Name MyCode",
		"description"	=> "Muestra El nombre del Foro",
		"website"		=> "http://www.xpresionzone.net",
		"author"		=> "Walkman 5.0",
		"authorsite"	=> "http://www.xpresionzone.net",
		"version"		=> "1.0",
		"compatibility" => "14*,16*",
	);
}

Donde name es el nombre que aparecera en el panel de admin/plugins descripcion es la descripcion del plugin q mostrara website es el link a donde mandara si das click sobre el nombre del plugin author es lo que aparecera despues del Creado por: authorsite es el link a donde mandara si das click sobre el nombre del creador version es lo que aparece entre () y pones ai la version del plugin y compatibility es la compatabilidad en este caso para foros 1.4 y 1.6!!!

despues viene
function bbname_activate()
{
}

function bbname_deactivate()
{
}

estas estan vacias ya que es para crear cosas como templates, agregar tablas a la DB modificar plantillas etc etc entonces como no creara nada e panel de admin/configuracion ni modificara plantillas ni nada pues queda vacio....

despues notaremos esto:
function bbname_run($message)
{
    global $mybb;
    $bbname = ($mybb->settings['bbname'] );
    return str_replace("[bbname]", $bbname, $message);
}

que es lo que explique arriba que es lo que hara el plugin podemos ver que dice que se ejeutara en los post ($message)

abajo vemos el global $mybb; que tomara cualquier dato de las tablas de DB!!

abajo el bbname es un entero por decirlo asi que se esta cerando para tomar o capturar los datos como notaremos $bbname es igual $mybb->settings['bbname'] esto quiere decir nombre del foro si alguien quiere saber como puede saber estos datos pues facil entren a su base de datos despues en mybb_settings y busquen el valor bbname les dejo una imagen para que quede mas claro!!

[Imagen: dzuypw.png]

donde 1: a el nombre de la tabla
2: el nombre del valor a tomar
3: la descripcion del valor (que es lo que va a mostrar)

entonces POR EJEMPLO tomando mi localhost

$bbname = ($mybb->settings['bbname'] );
es igual a esto segun la imagen:
$bbname = "LocalHost - Edson Ordaz";

en su caso tomara el nombre de su foro...

Continuando veremos esto
str_replace("[bbname]", $bbname, $message);

que quiere decir que en los post (como mencione en un principio) remplazara en TODOS los post el [bbname] por $bbname que es igual al nombre de su foro y funcionara en los mensajes!!

tomando esto como valor pueden modificarlo y hacer su propio mycode con un plugin pero no se roben creditos si toman como base un plugin creado deb credito tambien Wink

Bueno y pues es todo como dije pueden tomar este plugin de mi amigo solstise como base para crear sus propios mycodes con plugs si tienen dudas o errores al crear su propio plugin no duden en postearlo!!

Saludos!!
Archivos Adjuntos

Impresionante!!! man el tuto esta pensado jussto como hice el plugin Big Grin me impresiona tu habilidad ^^



Smile aclaro esta parte que no la mencionaste:
$plugins->add_hook("parse_message", "bbname_run");

todas las funciones especificadas en el plugin (en cualquiera no solo en los mycodes es que el primer nombre especificado en el hook principal (en los mycodes solo se agrega un solo hook asi que se sabe que por ende es el principal) osea bbname seria el nombre de todo el plugin incluso del archivo (esa parte no la recalco mucho porque no estoy seguro si es necesario llamar el archivo igual pero yo asi lo ago) _run es solo una extension del nombre en todo caso la funcion seria

function bbname_run($message)

En caso de que se use el sistema de instalacion (agregar bases a la BD, plantillas, etc como lo menciona Edson)

es indispensable cambiar el nombre antes de sus extensiones para que funcione
osea lo especificado
function bbname_activate()

xD perdon si me meto a explicar en un tema que no es mio pero no lo resisti xD


Saludos
:)
(31 Oct, 2010, 9:12 pm)Solstice escribió: perdon si me meto a explicar en un tema que no es mio pero no lo resisti xD
Saludos

Ey bro el tema es de todos y em da gusto que le entres!!!

(31 Oct, 2010, 9:12 pm)Solstice escribió: (esa parte no la recalco mucho porque no estoy seguro si es necesario llamar el archivo igual pero yo asi lo ago) _run es solo una extension del nombre

Respecto a eso puede ser lo que sea por ejemplo puedes poner un valor diferente como por ejemplo Solstise ya que en si lo que se esta declarando en la primera parte es:
$plugins->add_hook("parse_message", "bbname_run"); 

Decimos que solo lo llamara para ejecutarlo eso es como un int main en c++ pero hay que cuidar lo que se pone ya si ponemos por ejemplo hay mybb y en otro plugin X en el hook tambien se pone mybb se complican las cosas ya que toma los valores del primer plugin y mandaria error al activar el plugin!!!

Tengo entendido que si se hacen ya que anteriormente hacia lo hacian por... mm no lo se jaja solo asi lo hacian supongo que yo que pues el por el nombre del php y la extencion run de ejecutar y/o arrancar entonces como muchos aprendimos de solo ver plugins, analizarlos ver la db etc etc asi aprendimos pero no es necesario el nombre del plug jeje!!
exacto! solo aclaraba la parte de que se le aplica la extension deseada al plugin y a todas las subextensiones xD y en cuanto a eso supongo que es verdad eso es mas bien con el fin de evitar toda interferencia con algun otro plugin

Saludos

PD: la magia de adornar el install del plugin esta en esta area
function bbname_info()
{
	return array(
		"name"			=> "BB Name MyCode",
		"description"	=> "Muestra El nombre del Foro",
		"website"		=> "http://www.xpresionzone.net",
		"author"		=> "Walkman 5.0",
		"authorsite"	=> "http://www.xpresionzone.net",
		"version"		=> "1.0",
		"compatibility" => "14*,16*",
	);
}

pueden usar CSS y HTML (creo que si modifican un poco el ACP pueden hasta usar BBCode pero es irse algo lejos y es inecesario)
:)
O bien hay otra forma de crear un mycode desde un plug pero esta es otra forma aunque tengo que decir jamas e visto un plug asi si alguien a visto uno favor de decirme je!!

Bueno este codigo pues yo lo saq de la DB para hacerlo y pues noe s nada dificil asi que pues me doy los creditos!!

La otra forma (a manera de Edson jaja) para crear un mycode desde un plug es creando directamente el code desde panel de administracion para ello ya no necesitamos el hook solo el activate y desactivate!!!

entonces el code q les mostrare es para crear un mycode desde el plug para que al poner el los mensajes [hr=color] pone una linea dependiendo el color dceado!!

<?php

function MyCode_info()
{
    return array(
        "name"				=> "Agrega MyCode HR",
        "description"		=> "Agrega un mycode para poner linea de color horizontal asi [hr=blue]",
        "website"			=> "http://www.elfmakers.co.cc",
        "author"			=> "Edson Ordaz",
        "authorsite"		=> "mailto:nicedo_eeos@hotmail.com",
        "version"			=> "1.0",
		"compatibility" 	=> "14*,16*",
    );
}

function MyCode_activate()
{
	global $db, $mybb;
    $MyCode = array(
		"cid" => "NULL",
		"title" => "HR",
		"description" => "Agrega un linea horizontal",
		"regex" => "\[hr=(.*?)\]",
		"replacement" => "<hr style=\"height: 1px; color: $1; background-color: $1\" />",
		"active" => "1",
	);
	$db->insert_query("mycode", $MyCode);
	$cid = $db->insert_id();
}

function MyCode_deactivate()
{
	global $db;
	$db->query("DELETE FROM ".TABLE_PREFIX."mycode WHERE title='HR'");
}
?>

Esta demas que les explique el info

pero bueno me brinco a
function MyCode_activate()
{
	global $db, $mybb;
    $MyCode = array(
		"cid" => "NULL",
		"title" => "HR",
		"description" => "Agrega un linea horizontal",
		"regex" => "\[hr=(.*?)\]",
		"replacement" => "<hr style=\"height: 1px; color: $1; background-color: $1\" />",
		"active" => "1",
	);
	$db->insert_query("mycode", $MyCode);
	$cid = $db->insert_id();
}

aqui decimos que al activar el plugin creara el $MyCode donce cid es igual a NULL pero abajo vemos $cid = $db->insert_id(); eso quiere decir que cid seria igual al ID que continua del ultimo que se ve en la DB title es el titulo del mycode description la descripcion del mycode regex es igual a expresion regular hay notamos que esta el codigo &#92 eso es igual a \ pero si ponemos directamente \ no lo lee el plugin ya que eso es para saltar comillas!
remplacement es igual alo que remplazara del mensaje podemos ver esto
"replacement" => "<hr style=\"height: 1px; color: $1; background-color: $1\" />",

si leemos detenidamente este codigo <hr style=\"height: 1px; color: $1; background-color: $1\" /> notaremos que tiene unos \ dems explico porque!!

ese codigo esta entre comillas las diagonales (\) sirve para poner una commilla y el plugin la lea como parte de codigo aun y no como fin de un codigo en este caso si no podriamos los \ en las comillas de style el plugin no se activa y manda error al querer activarlo!!
y por ultimo active es si se activara este es un valor tomado como una booleana donde 1 es TRUE y 0 es FALSE!!

entonces veremos que esto es igual a $MyCode entonces abajo dice

$db->insert_query("mycode", $MyCode);

donde dice que en la base de datos insertara ala tabla de mycode insertara $MyCode que es todo lo de arriba!!

ahora
function MyCode_deactivate()
{
	global $db;
	$db->query("DELETE FROM ".TABLE_PREFIX."mycode WHERE title='HR'");
}

el codigo es mas corto esto es para ELIMINAR lo que agregamos ala DB en esa linea decimos que eliminaremos
$db->query("DELETE FROM ".TABLE_PREFIX."mycode WHERE title='HR'"); lo que esta en la tabla mycode
$db->query("DELETE FROM ".TABLE_PREFIX."mycode WHERE title='HR'");
con el titulo HR
$db->query("DELETE FROM ".TABLE_PREFIX."mycode WHERE title='HR'");

REPITO no e visto algo asi esto realmente funciona tambien pero esto lo saq yo con mis conocimientos espero almenos agradescan la explicacion que nos estamos tomando solstise y yo xD!

Saludos!
pues basicamente la segunda opcion es como para crear codes sencillos sin hacer calls a la BD supongo osea solo estas haciendo un replace no?
:)
En realidad me me puse a ver detenidamente la DB para crear mi plugin de contar los comentarios hechos y recibidos por cada usuario y me di cuenta que puedo crear un mycode e insertarlo ala db es mas sencillo que la primera solo que la segunda la que yo hice pues es mejor hacer de plano el mycode Wink

Saludos!
Pues ami me sale un error y es en la linea del replacement aqui dejo el code para ver si tiene error:

<div><div><input name="spoiler" type="image" src="http://i42.tinypic.com/nmkz6w.jpg" onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.src = 'http://i40.tinypic.com/2m6347t.png'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.src = 'http://i42.tinypic.com/nmkz6w.jpg'; }">
</div>
<div style="margin: 0px; padding:0px;">
<div style="display: none;">
$1
</div>
</div>
</div>
Los errores los tienes en las comillas comoa rriba explique necesitas poner un \ antes de cada comilla para que la comilla la lea como un codigo mas y no como fin y/o principio del codigo!!!
(1 Nov, 2010, 11:15 am)Edson Ordaz escribió: Los errores los tienes en las comillas comoa rriba explique necesitas poner un \ antes de cada comilla para que la comilla la lea como un codigo mas y no como fin y/o principio del codigo!!!

Todavia me sale aqui dejo mi plugin completo:

<?php
/**
 * MyBB 1.6
 * Copyright 2010 MyBB Group, All Rights Reserved
 *
 * Website: http://mybb.com
 * License: http://mybb.com/about/license
 *
 * $Id: hostimagenes.php 5016 2010-06-12 00:24:02Z RyanGordon $
 */
 
// Disallow direct access to this file for security reasons
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("parse_message", "spoilerimg_run");
function spoilerimg_info()
{
    return array(
        'name'        => 'Spoiler img',
        'description' => 'Un spoiler donde podras poner imagenes muy grandes',
        'website'     => 'www.zero-strike.es',
        'version'     => '1.0',
        'author'      => 'Lorataco',
        'authorsite'  => 'http://zero-strike.es/',
        'guid'        => '16*'
        
    );
}
function spoilerimg_activate(){
}

      global $db, $mybb;
      $spoilerimg = array(
		"sid"			=> "NULL",
		"name"			=> "spoilerimg",
		"title"			=> "Hide",
		"description"	=> "pon aqui la imagen que quieras para el boton hide",
		"optionscode"	=> "text",
		"value"			=> 'http://i40.tinypic.com/2m6347t.png',
		"disporder"		=> '1',
		"gid"			=> intval($gid),
	);
	
	$spoilerimg2 = array(
		"sid"			=> "NULL",
		"name"			=> "spoilerimg2",
		"title"			=> "Show",
		"description"	=> "pon aqui la imagen que quieras para el boton show",
		"optionscode"	=> "text",
		"value"			=> 'http://i42.tinypic.com/nmkz6w.jpg',
		"disporder"		=> '1',
		"gid"			=> intval($gid),
	);

     $db->insert_query("settings", $spoilerimg);
     $db->insert_query("settings", $spoilerimg2);

     include MYBB_ROOT."/inc/adminfunctions_templates.php";
     $db->insert_query("settinggroups", $spoilerimg);
	 $gid = $db->insert_id();
function spoilerimg_deactivate(){
}
   global $db;
	
	$db->query("DELETE FROM ".TABLE_PREFIX."settinggroups WHERE name='spoilerimg'");
	$db->query("DELETE FROM ".TABLE_PREFIX."settings WHERE name='spoilerimg2'");
	require MYBB_ROOT.'/inc/adminfunctions_templates.php';

function spoilerimg_run($message)
{
       $aviso = "<div><div><input name=\ "spoiler" type="image" src="http://i42.tinypic.com/nmkz6w.jpg" onClick="if (this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display != '') { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = ''; this.innerText = ''; this.src = 'http://i40.tinypic.com/2m6347t.png'; } else { this.parentNode.parentNode.getElementsByTagName('div')[1].getElementsByTagName('div')[0].style.display = 'none'; this.innerText = ''; this.src = 'http://i42.tinypic.com/nmkz6w.jpg'; }">
</div>
<div style="margin: 0px; padding:0px;">
<div style="display: none;">
$1
</div>
</div>
</div>" /;
    $patron = "\[spoilerimg\](.*?)\[/spoilerimg\]";
    $message = preg_replace($patron, $aviso, $message);
}
?>

Colaboradores
Straton Omar G. Cluster
This forum uses Lukasz Tkacz MyBB addons.