Zeile 8 | Zeile 8 |
---|
* */
|
* */
|
// Disallow direct access to this file for security reasons if(!defined("IN_MYBB"))
| // Make sure we can't access this file directly from the browser. if(!defined('IN_MYBB'))
|
{
|
{
|
die("Direct initialization of this file is not allowed.<br /><br />Please make sure IN_MYBB is defined.");
| die('This file cannot be accessed directly.'); }
// cache templates - this is important when it comes to performance // THIS_SCRIPT is defined by some of the MyBB scripts, including index.php if(defined('THIS_SCRIPT')) { global $templatelist;
if(isset($templatelist)) { $templatelist .= ','; }
if(THIS_SCRIPT== 'index.php') { $templatelist .= 'hello_index, hello_message'; } elseif(THIS_SCRIPT== 'showthread.php') { $templatelist .= 'hello_post, hello_message'; } }
if(defined('IN_ADMINCP')) { // Add our hello_settings() function to the setting management module to load language strings. $plugins->add_hook('admin_config_settings_manage', 'hello_settings'); $plugins->add_hook('admin_config_settings_change', 'hello_settings'); $plugins->add_hook('admin_config_settings_start', 'hello_settings'); // We could hook at 'admin_config_settings_begin' only for simplicity sake. } else { // Add our hello_index() function to the index_start hook so when that hook is run our function is executed $plugins->add_hook('index_start', 'hello_index');
// Add our hello_post() function to the postbit hook so it gets executed on every post $plugins->add_hook('postbit', 'hello_post');
// Add our hello_new() function to the misc_start hook so our misc.php?action=hello inserts a new message into the created DB table. $plugins->add_hook('misc_start', 'hello_new');
|
}
|
}
|
$plugins->add_hook("pre_output_page", "hello_world"); $plugins->add_hook("postbit", "hello_world_postbit");
| |
function hello_info() {
|
function hello_info() {
|
| global $lang; $lang->load('hello');
|
/** * Array of information about the plugin. * name: The name of the plugin
| /** * Array of information about the plugin. * name: The name of the plugin
|
Zeile 27 | Zeile 68 |
---|
* author: The name of the author of the plugin * authorsite: The URL to the website of the author (Optional) * version: The version number of the plugin
|
* author: The name of the author of the plugin * authorsite: The URL to the website of the author (Optional) * version: The version number of the plugin
|
* guid: Unique ID issued by the MyBB Mods site for version checking * compatibility: A CSV list of MyBB versions supported. Ex, "121,123", "12*". Wildcards supported.
| * compatibility: A CSV list of MyBB versions supported. Ex, '121,123', '12*'. Wildcards supported. * codename: An unique code name to be used by updated from the official MyBB Mods community.
|
*/ return array(
|
*/ return array(
|
"name" => "Hello World!", "description" => "A sample plugin that prints hello world and prepends the content of each post to 'Hello world!'", "website" => "http://www.mybb.com", "author" => "MyBB Group", "authorsite" => "http://www.mybb.com", "version" => "1.0", "guid" => "", "compatibility" => "*"
| 'name' => 'Hello World!', 'description' => $lang->hello_desc, 'website' => 'https://mybb.com', 'author' => 'MyBB Group', 'authorsite' => 'https://mybb.com', 'version' => '2.0', 'compatibility' => '18*', 'codename' => 'hello'
|
); }
|
); }
|
/** * ADDITIONAL PLUGIN INSTALL/UNINSTALL ROUTINES *
| /* * _activate(): * Called whenever a plugin is activated via the Admin CP. This should essentially make a plugin * 'visible' by adding templates/template changes, language changes etc. */ function hello_activate() { global $db, $lang; $lang->load('hello');
// Add a new template (hello_index) to our global templates (sid = -1) $templatearray = array( 'index' => '<br /> <table border="0" cellspacing="{$theme[\'borderwidth\']}" cellpadding="{$theme[\'tablespace\']}" class="tborder"> <thead> <tr> <td class="thead"> <strong>{$lang->hello}</strong> </td> </tr> </thead> <tbody> <tr> <td class="tcat"> <form method="POST" action="misc.php"> <input type="hidden" name="my_post_key" value="{$mybb->post_code}" /> <input type="hidden" name="action" value="hello" /> {$lang->hello_add_message}: <input type="text" name="message" class="textbox" /> <input type="submit" name="submit" class="button" value="{$lang->hello_add}" /> </form> </td> </tr> <tr> <td class="trow1"> {$messages} </td> </tr> </tbody> </table> <br />', 'post' => '<br /><br /><strong>{$lang->hello}:</strong><br />{$messages}', 'message' => '<br /> - {$message}' );
$group = array( 'prefix' => $db->escape_string('hello'), 'title' => $db->escape_string('Hello World!') );
// Update or create template group: $query = $db->simple_select('templategroups', 'prefix', "prefix='{$group['prefix']}'");
if($db->fetch_field($query, 'prefix')) { $db->update_query('templategroups', $group, "prefix='{$group['prefix']}'"); } else { $db->insert_query('templategroups', $group); }
// Query already existing templates. $query = $db->simple_select('templates', 'tid,title,template', "sid=-2 AND (title='{$group['prefix']}' OR title LIKE '{$group['prefix']}=_%' ESCAPE '=')");
$templates = $duplicates = array();
while($row = $db->fetch_array($query)) { $title = $row['title']; $row['tid'] = (int)$row['tid'];
if(isset($templates[$title])) { // PluginLibrary had a bug that caused duplicated templates. $duplicates[] = $row['tid']; $templates[$title]['template'] = false; // force update later } else { $templates[$title] = $row; } }
// Delete duplicated master templates, if they exist. if($duplicates) { $db->delete_query('templates', 'tid IN ('.implode(",", $duplicates).')'); }
// Update or create templates. foreach($templatearray as $name => $code) { if(strlen($name)) { $name = "hello_{$name}"; } else { $name = "hello"; }
$template = array( 'title' => $db->escape_string($name), 'template' => $db->escape_string($code), 'version' => 1, 'sid' => -2, 'dateline' => TIME_NOW );
// Update if(isset($templates[$name])) { if($templates[$name]['template'] !== $code) { // Update version for custom templates if present $db->update_query('templates', array('version' => 0), "title='{$template['title']}'");
// Update master template $db->update_query('templates', $template, "tid={$templates[$name]['tid']}"); } } // Create else { $db->insert_query('templates', $template); }
// Remove this template from the earlier queried list. unset($templates[$name]); }
// Remove no longer used templates. foreach($templates as $name => $row) { $db->delete_query('templates', "title='{$db->escape_string($name)}'"); }
// Settings group array details $group = array( 'name' => 'hello', 'title' => $db->escape_string($lang->setting_group_hello), 'description' => $db->escape_string($lang->setting_group_hello_desc), 'isdefault' => 0 );
// Check if the group already exists. $query = $db->simple_select('settinggroups', 'gid', "name='hello'");
if($gid = (int)$db->fetch_field($query, 'gid')) { // We already have a group. Update title and description. $db->update_query('settinggroups', $group, "gid='{$gid}'"); } else { // We don't have a group. Create one with proper disporder. $query = $db->simple_select('settinggroups', 'MAX(disporder) AS disporder'); $disporder = (int)$db->fetch_field($query, 'disporder');
$group['disporder'] = ++$disporder;
$gid = (int)$db->insert_query('settinggroups', $group); }
// Deprecate all the old entries. $db->update_query('settings', array('description' => 'HELLODELETEMARKER'), "gid='{$gid}'");
// add settings $settings = array( 'display1' => array( 'optionscode' => 'yesno', 'value' => 1 ), 'display2' => array( 'optionscode' => 'yesno', 'value' => 1 ));
$disporder = 0;
// Create and/or update settings. foreach($settings as $key => $setting) { // Prefix all keys with group name. $key = "hello_{$key}";
$lang_var_title = "setting_{$key}"; $lang_var_description = "setting_{$key}_desc";
$setting['title'] = $lang->{$lang_var_title}; $setting['description'] = $lang->{$lang_var_description};
// Filter valid entries. $setting = array_intersect_key($setting, array( 'title' => 0, 'description' => 0, 'optionscode' => 0, 'value' => 0, ));
// Escape input values. $setting = array_map(array($db, 'escape_string'), $setting);
// Add missing default values. ++$disporder;
$setting = array_merge( array('description' => '', 'optionscode' => 'yesno', 'value' => 0, 'disporder' => $disporder), $setting);
$setting['name'] = $db->escape_string($key); $setting['gid'] = $gid;
// Check if the setting already exists. $query = $db->simple_select('settings', 'sid', "gid='{$gid}' AND name='{$setting['name']}'");
if($sid = $db->fetch_field($query, 'sid')) { // It exists, update it, but keep value intact. unset($setting['value']); $db->update_query('settings', $setting, "sid='{$sid}'"); } else { // It doesn't exist, create it. $db->insert_query('settings', $setting); // Maybe use $db->insert_query_multiple somehow } }
// Delete deprecated entries. $db->delete_query('settings', "gid='{$gid}' AND description='HELLODELETEMARKER'");
// This is required so it updates the settings.php file as well and not only the database - they must be synchronized! rebuild_settings();
// Include this file because it is where find_replace_templatesets is defined require_once MYBB_ROOT.'inc/adminfunctions_templates.php';
// Edit the index template and add our variable to above {$forums} find_replace_templatesets('index', '#'.preg_quote('{$forums}').'#', "{\$hello}\n{\$forums}"); }
/* * _deactivate(): * Called whenever a plugin is deactivated. This should essentially 'hide' the plugin from view * by removing templates/template changes etc. It should not, however, remove any information * such as tables, fields etc - that should be handled by an _uninstall routine. When a plugin is * uninstalled, this routine will also be called before _uninstall() if the plugin is active. */ function hello_deactivate() { require_once MYBB_ROOT.'inc/adminfunctions_templates.php';
// remove template edits find_replace_templatesets('index', '#'.preg_quote('{$hello}').'#', ''); }
/*
|
* _install():
|
* _install():
|
* Called whenever a plugin is installed by clicking the "Install" button in the plugin manager.
| * Called whenever a plugin is installed by clicking the 'Install' button in the plugin manager.
|
* If no install routine exists, the install button is not shown and it assumed any work will be * performed in the _activate() routine.
|
* If no install routine exists, the install button is not shown and it assumed any work will be * performed in the _activate() routine.
|
* * function hello_install() * { * } *
| */ function hello_install() { global $db;
// Create our table collation $collation = $db->build_create_table_collation();
// Create table if it doesn't exist already if(!$db->table_exists('hello_messages')) { switch($db->type) { case "pgsql": $db->write_query("CREATE TABLE ".TABLE_PREFIX."hello_messages ( mid serial, message varchar(100) NOT NULL default '', PRIMARY KEY (mid) );"); break; case "sqlite": $db->write_query("CREATE TABLE ".TABLE_PREFIX."hello_messages ( mid INTEGER PRIMARY KEY, message varchar(100) NOT NULL default '' );"); break; default: $db->write_query("CREATE TABLE ".TABLE_PREFIX."hello_messages ( mid int unsigned NOT NULL auto_increment, message varchar(100) NOT NULL default '', PRIMARY KEY (mid) ) ENGINE=MyISAM{$collation};"); break; } } }
/*
|
* _is_installed(): * Called on the plugin management page to establish if a plugin is already installed or not. * This should return TRUE if the plugin is installed (by checking tables, fields etc) or FALSE * if the plugin is not installed.
|
* _is_installed(): * Called on the plugin management page to establish if a plugin is already installed or not. * This should return TRUE if the plugin is installed (by checking tables, fields etc) or FALSE * if the plugin is not installed.
|
* * function hello_is_installed() * { * global $db; * if($db->table_exists("hello_world")) * { * return true; * } * return false; * } *
| */ function hello_is_installed() { global $db;
// If the table exists then it means the plugin is installed because we only drop it on uninstallation return $db->table_exists('hello_messages'); }
/*
|
* _uninstall(): * Called whenever a plugin is to be uninstalled. This should remove ALL traces of the plugin * from the installation (tables etc). If it does not exist, uninstall button is not shown.
|
* _uninstall(): * Called whenever a plugin is to be uninstalled. This should remove ALL traces of the plugin * from the installation (tables etc). If it does not exist, uninstall button is not shown.
|
* * function hello_uninstall() * { * } * * _activate(): * Called whenever a plugin is activated via the Admin CP. This should essentially make a plugin * "visible" by adding templates/template changes, language changes etc. * * function hello_activate() * { * } * * _deactivate(): * Called whenever a plugin is deactivated. This should essentially "hide" the plugin from view * by removing templates/template changes etc. It should not, however, remove any information * such as tables, fields etc - that should be handled by an _uninstall routine. When a plugin is * uninstalled, this routine will also be called before _uninstall() if the plugin is active. * * function hello_deactivate() * { * } */
function hello_world($page)
| */ function hello_uninstall()
|
{
|
{
|
$page = str_replace("<div id=\"content\">", "<div id=\"content\"><p>Hello World!<br />This is a sample MyBB Plugin (which can be disabled!) that displays this message on all pages.</p>", $page); return $page;
| global $db, $mybb;
if($mybb->request_method != 'post') { global $page, $lang; $lang->load('hello');
$page->output_confirm_action('index.php?module=config-plugins&action=deactivate&uninstall=1&plugin=hello', $lang->hello_uninstall_message, $lang->hello_uninstall); }
// Delete template groups. $db->delete_query('templategroups', "prefix='hello'");
// Delete templates belonging to template groups. $db->delete_query('templates', "title='hello' OR title LIKE 'hello_%'");
// Delete settings group $db->delete_query('settinggroups', "name='hello'");
// Remove the settings $db->delete_query('settings', "name IN ('hello_display1','hello_display2')");
// This is required so it updates the settings.php file as well and not only the database - they must be synchronized! rebuild_settings();
// Drop tables if desired if(!isset($mybb->input['no'])) { $db->drop_table('hello_messages'); } }
/* * Loads the settings language strings. */ function hello_settings() { global $lang;
// Load our language file $lang->load('hello'); }
/* * Displays the list of messages on index and a form to submit new messages - depending on the setting of course. */ function hello_index() { global $mybb;
// Only run this function is the setting is set to yes if($mybb->settings['hello_display1'] == 0) { return; }
global $db, $lang, $templates, $hello, $theme;
// Load our language file $lang->load('hello');
// Retreive all messages from the database $messages = ''; $query = $db->simple_select('hello_messages', 'message', '', array('order_by' => 'mid', 'order_dir' => 'DESC')); while($message = $db->fetch_field($query, 'message')) { // htmlspecialchars_uni is similar to PHP's htmlspecialchars but allows unicode $message = htmlspecialchars_uni($message); $messages .= eval($templates->render('hello_message')); }
// If no messages were found, display that notice. if(empty($messages)) { $message = $lang->hello_empty; $messages = eval($templates->render('hello_message')); }
// Set $hello as our template and use eval() to do it so we can have our variables parsed #eval('$hello = "'.$templates->get('hello_index').'";'); $hello = eval($templates->render('hello_index')); }
/* * Displays the list of messages under every post - depending on the setting. * @param $post Array containing information about the current post. Note: must be received by reference otherwise our changes are not preserved. */ function hello_post(&$post) { global $settings;
// Only run this function is the setting is set to yes if($settings['hello_display2'] == 0) { return; }
global $lang, $templates;
// Load our language file if(!isset($lang->hello)) { $lang->load('hello'); }
static $messages;
// Only retreive messages from the database if they were not retreived already if(!isset($messages)) { global $db;
// Retreive all messages from the database $messages = ''; $query = $db->simple_select('hello_messages', 'message', '', array('order_by' => 'mid', 'order_dir' => 'DESC')); while($message = $db->fetch_field($query, 'message')) { // htmlspecialchars_uni is similar to PHP's htmlspecialchars but allows unicode $message = htmlspecialchars_uni($message); $messages .= eval($templates->render('hello_message')); }
// If no messages were found, display that notice. if(empty($messages)) { $message = $lang->hello_empty; $messages = eval($templates->render('hello_message')); } }
// Alter the current post's message $post['message'] .= eval($templates->render('hello_post'));
|
}
|
}
|
function hello_world_postbit(&$post)
| /* * This is where new messages get submitted. */ function hello_new()
|
{
|
{
|
$post['message'] = "<strong>Hello world!</strong><br /><br />{$post['message']}";
| global $mybb;
// If we're not running the 'hello' action as specified in our form, get out of there. if($mybb->get_input('action') != 'hello') { return; }
// Only accept POST if($mybb->request_method != 'post') { error_no_permission(); }
global $lang;
// Correct post key? This is important to prevent CSRF verify_post_check($mybb->get_input('my_post_key'));
// Load our language file $lang->load('hello');
$message = trim($mybb->get_input('message'));
// Message cannot be empty if(!$message || my_strlen($message) > 100) { error($lang->hello_message_empty); }
global $db;
// Escape input data $message = $db->escape_string($message);
// Insert into database $db->insert_query('hello_messages', array('message' => $message));
// Redirect to index.php with a message redirect('index.php', $lang->hello_done);
|
}
| }
|