| Important note: When you edit this page, you agree to release your contribution into the public domain. If you don't want this or can't do this because of license restrictions, please don't edit. |
| Languages: |
English |
Updated: 18:18, 15 June 2008 (CDT)
See Discussion
You can view the open source project at http://www.wowroster.net
For corrections and/or suggestions - http://www.wowroster.net
Thanks to:
http://www.wowroster.com
And Everyone involved in the project.
Download the Roster AddOnSDK
AddOns that conform to our Coding Standards and the basic outline described within this document, will be given a "AddOn Framework Standards Compliant" stamp of approval.
The following are required to run the WoWRoster back-end and to be able to run any AddOns
>Roster Requirements<
The AddOn system is designed so that you can mod the roster base without having to change the base code as it could change a lot between versions.
Hopefully with this system we will be closer to having a drop-in module system without having to mod a lot of the base files each time.
We will be constantly refining the system as we go along.
So with each new version of Roster, some AddOns may break (not work in the new WoWRoster)
| Important: |
DO NOT use php short tags in your php files |
Best of all, this is transparent to you!
Here is an example of an AddOn's directory structure
roster/
|_ addons/
|_ addonname/
|_ admin/
| |_ index.php
| |_ other.php
|
|_ char/
| |_ index.php
| |_ other.php
|
|_ guild/
| |_ index.php
| |_ other.php
|
|_ inc/
| |_ conf.php
| |_ functions.php
| |_ install.def.php
| |_ search.inc
| |_ update_hook.php
|
|_ locale/
| |_ deDE.php
| |_ enUS.php
| |_ esES.php
| |_ frFR.php
|
|_ realm/
| |_ index.php
| |_ other.php
|
|_ index.php
|_ somefile.php
|_ style.css
|_ util.php
The admin folder houses files for the Roster CP
Normally you'll never need files here because the Config API can handle most configuration needs
If you do need a custom config interface, this is where you make it
This will normally grab your AddOn's config data from the 'roster_addon_config' table in the database and display the options using the Config API
If you need your own file, you need only to place index.php in addons/addonname/admin/
You can also have the best of both worlds
For example, the Members List and Character Info AddOns use both the Config API and custom files
Files for use in the Character scope
Data for the requested character is passed to the AddOn
If a=c:## is not specified or if this member does not exist, an error message will display
a=c: can be either the member id number, or name@rc-realm text
Accessing other files in the char scope is easy
addons/addonname/addonname/char/file.php is accessed like this:
Files for use in the Guild scope
Data for the requested guild is passed to the AddOn
If a=g: is not specified, the default guild/realm name set in Roster CP will show
If the guild does not exist or if there is no data for this guild, an error message will display
a=g: can be either the guild id number, or name@rc-realm text
Accessing other files in the guild scope is easy
addons/addonname/guild/file.php is accessed like this:
This folder houses special files not meant for direct access by the AddOn Framework
You can also use this folder for library, class, and/or function files
Place any files here that you do not or should not be accessed directly by the AddOn Framework
Where locale translation files go
See below for more info Locale Files
Files for use in the Realm scope
Data for the requested realm is passed to the AddOn
If a=r: is not specified, the default realm name set in Roster CP will show
If the realm does not exist or if there is no data for this realm, an error message will display
a=r: can be text
Accessing other files in the realm scope is easy
addons/addonname/realm/file.php is accessed like this:
Files not in these folders are considered under the util scope
This scope is not restricted if there is no guild or character information and can be accessed before data is in the database
Accessing other files in the util scope is easy
addons/addonname/file.php is accessed like this:
There are a few files that you must have
You can link to any file in the root AddOn folder
The url to access each page is simple
The values explained
This installer requires a similar install file definition as DragonFly CMS, with some important exceptions:
You should create a file called inc/install.def.php with in it a class that is named identical to your AddOn's install directory name, plus Install.
The folder name will be referred to as your AddOn's basename.
| Note: | The downside to entering this info is that when you first submit your addon to the downloads section, you will not know the ID |
$credits = array( array( "name"=> "Name", "info"=> "Some Info"), array( "name"=> "Another Name", "info"=> "More Info"), );
Queries are added to the install using the $installer methods.
These entries can be used to build a config page through Roster's config page API
There are 5 functions for creating, changing, and editing menu entries.
Note the menu button titles should be unique per AddOn.
Using your basename in the key will work fine.
Here is an example of an AddOn install file
This shows most of the methods that can be used in an installer
You can find more examples in the addons/ folder in roster
<?php /** * WoWRoster.net WoWRoster * * LICENSE: Licensed under the Creative Commons * "Attribution-NonCommercial-ShareAlike 2.5" license * * @copyright 2002-2007 WoWRoster.net * @license http://creativecommons.org/licenses/by-nc-sa/2.5 Creative Commons "Attribution-NonCommercial-ShareAlike 2.5" * @version SVN: $Id: install.def.php 897 2007-05-06 00:35:11Z Zanix $ * @link http://www.wowroster.net * @package SomeAddon * @subpackage Installer */ if ( !defined('IN_ROSTER') ) { exit('Detected invalid access to this file!'); } /** * Installer SomeAddon * * @package InstanceKeys * @subpackage Installer */ class SomeAddonInstall { var $active = true; var $icon = 'inv_misc_key_06'; var $version = '2.0.0.0'; var $wrnet_id = 0; var $fullname = 'some_addon'; var $description = 'some_addon_desc'; var $credits = array( array( "name"=> "WoWRoster Dev Team", "info"=> "Original Author") ); /** * Install Function * * @return bool */ function install() { global $installer; // Master and menu entries $installer->add_config("'1','startpage','keys_conf','display','master'"); $installer->add_config("'110','some_addon_conf',NULL,'blockframe','menu'"); $installer->add_config("'1010','colorcmp','#00ff00','color','some_addon_conf'"); $installer->add_config("'1020','colorcur','#ffd700','color','some_addon_conf'"); $installer->add_config("'1030','colorno','#ff0000','color','some_addon_conf'"); $installer->add_menu_button('some_addon','guild','','spell_holy_prayerofspirit'); $installer->add_menu_button('some_addon','guild','log','inv_misc_symbolofkings_01'); $installer->create_table($installer->table('some_table')," `member_id` int(11) unsigned NOT NULL default '0', `row_id` int(11) unsigned NOT NULL default '0', `type` tinyint(3) unsigned NOT NULL default '0', PRIMARY KEY (`member_id`)"); return true; } /** * Upgrade Function * * @param string $oldversion * @return bool */ function upgrade($oldversion) { global $installer; if( version_compare('2.0.0.0', $oldversion,'>') == true ) { // Upgrade versions lower than 2.0.0.0 } if( version_compare('2.0.6.4', $oldversion,'>') == true ) { // Upgrade versions lower than 2.0.6.4 } if( version_compare('3.0.0.0', $oldversion,'>') == true ) { // Upgrade versions lower than 3.0.0.0 } return true; } /** * Un-Install Function * * @return bool */ function uninstall() { global $installer; $installer->remove_all_config(); $installer->drop_table($installer->table('some_table')); $installer->remove_all_menu_button(); return true; } }
Get customizable search results on the Roster search page for your AddOn
AddOn search classes are basically just SQL statements with some added functionality for the Search Framework
The search class can search by using SQL and process the data in a readable format for display
The search framework handles pagination, display, and basic form generation (each AddOn can specify additional form fields for its search)
Each AddOn utilizes a hook file /inc/search.inc.php to include a customized search for that AddOn
Used to set up data needed for your search class
Use this to populate $this->open_table, $this->close_table, and/or $this->options
search( $search , $limit=10 , $page=0 )
The meat and potatoes of your search class
Perform the SQL and process any returned data in this class method
add_result( $resultarray )
Required function for any search hook used to add result data to the search framework
This data is returned to the search framework after your search hook is done processing data
This data must be passed to $this->add_result($item); to show up on the search results page
Here is an example of an AddOn search.inc file
From the "News" AddOn
You can find more examples in other AddOns such as memberslist or news
<?php /** * WoWRoster.net WoWRoster * * LICENSE: Licensed under the Creative Commons * "Attribution-NonCommercial-ShareAlike 2.5" license * * @copyright 2002-2007 WoWRoster.net * @license http://creativecommons.org/licenses/by-nc-sa/2.5 Creative Commons "Attribution-NonCommercial-ShareAlike 2.5" * @version SVN: $Id: search.inc.php 1664 2008-02-14 04:24:52Z Zanix $ * @link http://www.wowroster.net * @package News * @subpackage Search */ if( !defined('IN_ROSTER') ) { exit('Detected invalid access to this file!'); } /** * News Search * * @package News * @subpackage Search */ class newsSearch { var $options; var $result = array(); var $result_count = 0; var $start_search; var $stop_search; var $time_search; var $open_table; var $close_table; var $search_url; var $data = array(); // Addon data function search( $search , $limit=10 , $page=0 ) { global $roster; $first = $page*$limit; $sql = "SELECT `news`.`news_id`, `news`.`author`, `news`.`title`, `news`.`content`, `news`.`html`, " . "DATE_FORMAT( DATE_ADD(`news`.`date`, INTERVAL " . $roster->config['localtimeoffset'] . " HOUR ), '" . $roster->locale->act['timeformat'] . "' ) AS 'date_format', " . "COUNT(`comments`.`comment_id`) comm_count " . "FROM `" . $roster->db->table('news','news') . "` news " . "LEFT JOIN `" . $roster->db->table('comments','news') . "` comments USING (`news_id`) " . "WHERE `news`.`news_id` LIKE '%$search%' " . "OR `news`.`author` LIKE '%$search%' " . "OR `news`.`date` LIKE '%$search%' " . "OR `news`.`title` LIKE '%$search%' " . "OR `news`.`content` LIKE '%$search%' " . "GROUP BY `news`.`news_id` " . ( $limit > 0 ? " LIMIT $first," . $limit : '' ) . ';'; //calculating the search time $this->start_search = format_microtime(); $result = $roster->db->query($sql); $this->stop_search = format_microtime(); $this->time_search = $this->stop_search - $this->start_search; $nrows = $roster->db->num_rows($result); $x = ($limit > $nrows) ? $nrows : ($limit > 0 ? $limit : $nrows); if( $nrows > 0 ) { while( $x > 0 ) { list($news_id, $author, $title, $content, $html, $date, $comments) = $roster->db->fetch($result); $item['author'] = $author; $item['date'] = $date; $item['title'] = $title; $item['url'] = makelink('util-news-comment&id=' . $news_id); if( $html == '1' && $this->data['config']['news_html'] >= 0 ) { $content = $content; } else { $content = htmlentities($content); } $content = nl2br($content); $array = explode(' ',$content,101); if( isset($array[100]) ) { unset($array[100]); $item['more_text'] = true; } else { $item['more_text'] = false; } $item['short_text'] = implode(' ',$array); $item['footer'] = ($comments == 0 ? 'No' : $comments) . ' comment' . ($comments == 1 ? '' : 's'); $this->add_result($item); unset($item); $x--; } } $roster->db->free_result($result); } function add_result( $resultarray ) { $this->result[$this->result_count++] = $resultarray; } }
This is the current functionality of the Roster Config API.
There are two classes of form types:
Items of the page, pageframe, and pagehide class contain option blocks.
Items of the blockframe or blockhide class contain options.
In most cases the config_name is a reference to an entry in your locale file. Each entry you make needs to have a unique config name. The entry in the locale file needs to contain at least the prompt text, but can also contain hover help text by seperating them with a vertical bar '|'.
addons/addonname/admin/config.func.php
These are used in translating any text in your AddOn if you want to support multi-langages.
As you can see in the example below, we have a file for deDE which is the German language, enUS which is the English language, frFR for French, and esES for Spanish.
Roster currently supports deDE, enUS, frFR, and esES, these are taken out of character profiler based on what region of WOW they are using.
The folder structure for locale files is as follows:
roster/
|_ addons/
|_ addonname/
|_ locale/
|_ deDE.php
|_ enUS.php
|_ esES.php
|_ frFR.php
When using locale files, it is absolutely necessary to ALWAYS have enUS.php
The AddOn Framework will default to this file if a locale is not found for a specific locale
Example:
When using these them in your script you can use something similar to this
$header_title = $roster->locale->wordings['locale_key']['some_key'];
or
$header_title = $roster->locale->act['some_key'];
The first example is to get a specific locale value
The second is a reference to the current locale set in Roster
Remember that Roster's locale files are already added, so you only have to add the stuff that is custom to your AddOn.
So if you need to check to make sure we have don't already have a translation, you can open the files in the "localization/" directory to see the default words that you don't have to duplicate.
Duplication may cause errors in the main Roster code, if you duplicate a main Roster locale variable, you will incur the wrath of the WoWRoster.net Dev Team
Example from the MembersList Roster AddOn
addons/memberslist/locale/deDE.php
<?php /** * WoWRoster.net WoWRoster * * LICENSE: Licensed under the Creative Commons * "Attribution-NonCommercial-ShareAlike 2.5" license * * @copyright 2002-2007 WoWRoster.net * @license http://creativecommons.org/licenses/by-nc-sa/2.5 Creative Commons "Attribution-NonCommercial-ShareAlike 2.5" * @version SVN: $Id: deDE.php 1523 2007-12-13 12:24:31Z pleegwat $ * @link http://www.wowroster.net * @package MembersList * @subpackage Locale */ // -[ deDE Localization ]- // Installer names $lang['memberslist'] = 'Mitgliederliste'; $lang['memberslist_desc'] = 'Eine sortier- und filterbare Mitgliederliste'; // Button names $lang['memberslist_Members'] = 'Mitglieder|Zeigt die Gildenmitgliederliste mit Spielernotizen, Zuletzt online, usw... an'; $lang['memberslist_Stats'] = 'Grundwerte|Zeigt die Grundwerte jedes Gildenmitglieds wie Intelligenz, Ausdauer, usw... an'; $lang['memberslist_Honor'] = 'Ehre|Zeigt die PvP-Informationen jedes Gildenmitglieds an'; $lang['memberslist_Log'] = 'Mitglieder Log|Zeigt das upload log für neue und entfernte Mitglieder an'; $lang['memberslist_Realm'] = 'Mitglieder|Zeigt die Mitgliederliste für alle Gilden auf allen Servern an'; $lang['memberslist_RealmGuild'] = 'Gilden|Zeigt eine Liste für alle Gilden auf allen Realms an'; // Interface wordings $lang['memberssortfilter'] = 'Sortierreihenfolge und Filterung'; $lang['memberssort'] = 'Sortierung'; $lang['memberscolshow'] = 'Zeige/Verstecke Spalten'; $lang['membersfilter'] = 'Zeilenfilter'; $lang['openall'] = 'Öffne alle'; $lang['closeall'] = 'Schließe alle'; $lang['ungroupalts'] = 'Twinkgruppen auflösen'; $lang['openalts'] = 'Gruppiere Twinks (Open)'; $lang['closealts'] = 'Gruppiere Twinks (Closed)'; $lang['clientsort'] = 'Clientsortierung'; $lang['serversort'] = 'Serversortierung'; // Column headers $lang['onote'] = 'Offizier Notiz'; $lang['honorpoints'] = 'Ehrenpunkte'; $lang['arenapoints'] = 'Arenapunkte'; $lang['main_name'] = 'Hauptcharaktername'; $lang['alt_type'] = 'Alt type'; $lang['xp_to_go'] = '%1$s XP until level %2$s'; $lang['skill_level'] = 'Skill level'; // Last Online words $lang['online_at_update'] = 'Online bei Update'; $lang['second'] = 'vor %s Sekunde'; $lang['seconds'] = 'vor %s Sekunden'; $lang['minute'] = 'vor %s Minute'; $lang['minutes'] = 'vor %s Minuten'; $lang['hour'] = 'vor %s Stunde'; $lang['hours'] = 'vor %s Stunden'; $lang['day'] = 'vor %s Tag'; $lang['days'] = 'vor %s Tagen'; $lang['week'] = 'vor %s Woche'; $lang['weeks'] = 'vor %s Wochen'; $lang['month'] = 'vor %s Monat'; $lang['months'] = 'vor %s Monaten'; $lang['year'] = 'vor %s Jahr'; $lang['years'] = 'vor %s Jahren'; $lang['armor_tooltip'] = 'Verringert den erlittenen körperlichen Schaden um %1$s%%'; $lang['motd'] = 'MOTD'; $lang['accounts'] = 'Accounts'; // Configuration $lang['memberslist_config'] = 'Gehe zur Mitgliederliste-Konfiguration'; $lang['memberslist_config_page']= 'Mitgliederliste-Konfiguration'; $lang['documentation'] = 'Dokumentation'; $lang['uninstall'] = 'Uninstall'; // Page names $lang['admin']['display'] = 'Anzeige|Konfiguriert die Anzeigeoptionen für die Mitgliederliste.'; $lang['admin']['members'] = 'Mitgliederliste|Konfiguriert die Sichtbarkeit der Mitgliederliste-Spalten.'; $lang['admin']['stats'] = 'Werteliste|Konfiguriert die Sichtbarkeit der Grundwerte-Spalten.'; $lang['admin']['honor'] = 'Ehrenliste|Konfiguriert die Sichtbarkeit der Ehrenliste-Spalten.'; $lang['admin']['log'] = 'Mitglieder Log|Konfiguriert die Sichtbarkeit der Mitglieder Log-Spalten.'; $lang['admin']['build'] = 'Hauptchar/Twink Beziehungen|Konfiguriert wie Hauptchars/Twinks erkannt werden.'; $lang['admin']['ml_wiki'] = 'Dokumentation|Mitgliederliste Dokumentation auf WoWRoster wiki.'; $lang['admin']['updMainAlt'] = 'Aktualisiere Beziehungen|Aktualisiert die Main/Alt Beziehungen der Daten, die bereits in der DB gespeichert sind.'; $lang['admin']['page_size'] = 'Seitengröße|Konfiguriert die Anzahl der Zeilen Pro Seite oder 0 für keinen Seitenumbruch';
CSS style from the MembersList AddOn
addons/memberslist/style.css
/** * WoWRoster.net WoWRoster * * LICENSE: Licensed under the Creative Commons * "Attribution-NonCommercial-ShareAlike 2.5" license * * @copyright 2002-2007 WoWRoster.net * @license http://creativecommons.org/licenses/by-nc-sa/2.5 Creative Commons "Attribution-NonCommercial-ShareAlike 2.5" * @version SVN: $Id: style.css 942 2007-05-20 04:50:02Z Zanix $ * @link http://www.wowroster.net * @package MembersList */ .membersRowColor1 { background-color:#1F1E1D; } .membersRowColor2 { background-color:#2E2D2B; } .membersRowAltColor1 { background-color:#1F1E3D; } .membersRowAltColor2 { background-color:#2E2D4B; }
I assume you know what css is...
Available to AddOns is the template parser which enables making the layout of your AddOn easier and easier to edit.
Roster automatically includes the template parser on initialization.
The templates have {CONTAINERS} for the information from php. This {INFO} is replaced by the output of the php code.
This means you have full control of where these containers are displayed or whether they are at all.
Currently the only AddOn in the Roster core that uses templates is "News".
All examples below are from the "News" AddOn.
Create a folder in roster/templates/default/ with your AddOn's basename
Or create a templates/ folder in your addon folder
This folder will hold all the templates for your AddOn
In your php files, we will be calling the $roster->tpl object to insert data into your template
// Assign template vars $roster->tpl->assign_vars(array( 'L_POSTEDBY' => $roster->locale->act['posted_by'], 'L_EDIT' => $roster->locale->act['edit'], 'L_ADD_NEWS' => $roster->locale->act['add_news'], 'U_ADD_NEWS' => makelink('util-news-add'), 'S_ADD_NEWS' => true, ) );
or
$roster->tpl->assign_var('VAR_NAME','value');
What happens here is that we are making and setting template variables.
Notice how the variables in available to the template are much simpler than the php variables
'L_POSTEDBY' as opposed to $roster->locale->act['posted_by']
This all all fine and good for variables, but what if you want a repeating section?
This is quite easy actually.
Here we will be reading from the database and creating a template block variable
while( $news = $roster->db->fetch($result) ) { $roster->tpl->assign_block_vars('news_row', array( 'TITLE' => $news['title'], 'ID' => $news['news_id'], 'CONTENT' => $news['content'], 'COMMENT_COUNT' => $news['comm_count'], 'AUTHOR' => $news['author'], 'DATE' => $news['date_format'], 'U_BORDER_S' => border('sorange','start',$news['title'],'60%'), 'U_BORDER_E' => border('sorange','end'), 'U_COMMENT' => makelink('util-news-comment&id=' . $news['news_id']), 'U_EDIT' => makelink('util-news-edit&id=' . $news['news_id']), 'L_COMMENT' => ($news['comm_count'] != 1 ? sprintf($roster->locale->act['n_comments'],$news['comm_count']) : sprintf($roster->locale->act['n_comment'],$news['comm_count'])), ) ); }
This is very useful for tables with repeating rows.
Now we want to select the template we want to display.
$roster->tpl->set_filenames(array('body' => $addon['basename'] . '/news.html')); $roster->tpl->display('body');
What happens here is we are assigning a 'handle' to a template file
Then we use that handle to display and output the template
You can assign multiple templates, then display them
$roster->tpl->set_filenames(array( 'newshead' => $addon['basename'] . '/news_head.html', 'body' => $addon['basename'] . '/news.html', 'newsfooter' => $addon['basename'] . '/news_head.html' ) ); $roster->tpl->display('newshead'); $roster->tpl->display('body'); $roster->tpl->display('newsfooter ');
Or in the template file, you can include a template file
<!-- INCLUDE news/news_head.html -->
(This is an html comment that the parser picks up, then includes this template)
Now we are ready to make the template
This example is from the "News" AddOn
roster/templates/default/news/news.html
or
roster/addons/news/templates/news.html
<!-- INCLUDE news/news_head.html -->
<!-- BEGIN news_row -->
{news_row.U_BORDER_S}
{news_row.CONTENT}
<hr />
<div style="text-align:left;">
<span style="float:right;">
<a href="{news_row.U_COMMENT}">{news_row.L_COMMENT}</a> | <a href="{news_row.U_EDIT}">{L_EDIT}</a></span>
{L_POSTEDBY}: {news_row.AUTHOR} - {news_row.DATE}
</div>
{news_row.U_BORDER_E}
<br />
<!-- END news_row -->
<!-- IF S_ADD_NEWS --><!-- INCLUDE news/news_foot.html --><!-- ENDIF -->
See how all the variables are here, but wrapped in braces? { }
These are the variables you assigned in the php file
Notice the 'BEGIN news_row'?
This is the beginning of our repeating section
$roster->tpl->assign_block_vars('news_row', array( 'TITLE' => $news['title'], 'ID' => $news['news_id'],
The variables 'TITLE' and 'ID' are available in this loop by appending the loop name 'news_row' and a period to the variable
<a href="{news_row.U_COMMENT}">{news_row.L_COMMENT}</a> | <a href="{news_row.U_EDIT}">{L_EDIT}</a></span>
We will try to add more about templates, if anyone finds a good resource for phpbb, eqdkp, or DF templates, let us know...
The update hook is a file that ties into the lua upload process
You can specify any additional lua files you may you need
There are a few hook modes that an AddOn can make use of
The following variables are required in the update hook class
function addonUpdate($data) { $this->data = $data; }
The following methods are reserved for update hooks
Descriptions for these methods are above and are not required
These function fairly simmilar
You can add other methods or properties as you wish, but be warned that Roster may implement more update hook methods in future versions
The update class in Roster allows an addon to add more lua files for upload during the update process.
In your addon update hook class, add a member variable called $files.
This is an array of lua files you would like to add to the update process.
Specify the filename, without the .lua extension, in the update hook class constructor.
function addonnameUpdate( $data ) { $this->data = $data; $this->files[] = 'luafilename'; $this->files[] = 'anotherluafilename'; }
The uploaded lua data is available in Update::uploadData
$update->uploadData['luafilename'] $update->uploadData['anotherluafilename']
This is an example update hook file
Look at memberslist and pvplog (example of additional lua file upload and processing) for more complex examples
<?php /** * WoWRoster.net WoWRoster * * LICENSE: Licensed under the Creative Commons * "Attribution-NonCommercial-ShareAlike 2.5" license * * @copyright 2002-2007 WoWRoster.net * @license http://creativecommons.org/licenses/by-nc-sa/2.5 Creative Commons "Attribution-NonCommercial-ShareAlike 2.5" * @version SVN: $Id: update_hook.php 899 2007-05-06 10:16:36Z Zanix $ * @link http://www.wowroster.net * @package AddOnName */ if ( !defined('IN_ROSTER') ) { exit('Detected invalid access to this file!'); } /** * Addon Update class * This MUST be the same name as the addon basename */ class addonUpdate { var $messages = ''; // Update messages var $data = array(); // Addon config data automatically pulled from the addon_config table var $files = array(); /** * Class instantiation * The name of this function MUST be the same name as the class name * * @param array $data | Addon data * @return recipe */ function addonUpdate($data) { $this->data = $data; } /** * Resets addon messages */ function reset_messages() { $this->messages = ''; } function update() { global $roster; $this->messages .= "<span class=\"green\">This is a non CP hook</span><br />\n"; return true; } function guild_pre( $data ) { global $roster; $this->messages .= "<span class=\"green\">This is a guild_pre hook</span><br />\n"; return true; } function guild( $data , $memberid ) { global $roster; $this->messages .= "<span class=\"yellow\">This is a guild hook</span><br />\n"; return true; } function guild_post( $data ) { global $roster; $this->messages .= "<span class=\"red\">This is a guild_post hook</span><br />\n"; return true; } function char_pre( $data ) { global $roster; $this->messages .= "<span class=\"green\">This is a char_pre hook</span><br />\n"; return true; } function char( $data , $memberid ) { global $roster; $this->messages .= "<span class=\"yellow\">This is a char hook</span><br />\n"; return true; } function char_post( $data ) { global $roster; $this->messages .= "<span class=\"red\">This is a char_post hook</span><br />\n"; return true; } }
There are many variables, functions, and classes available for Addons to use
This is a list of variables that are available for your Addons
All variables are available whether during update hooks or in the framework
These are added to index.php for some additional support
If you add these to your addon, you can turn off the header, footer and menu on the page, these are always enabled by default.
$roster->output['show_header'] = false; // Disable the roster header $roster->output['show_menu'] = false; // Disable roster menu $roster->output['show_footer'] = false; // Disable roster footer
$roster->output['show_menu'] accepts a string or an array of button panel names to display
When building an addon, you can build your own button listing that only displays on your addon pages
Pass a string for only one set of buttons, or pass an array for multiple sets of buttons
$roster->output['show_menu'] = array('util' => 1); // Display only the util button panel, default opened $roster->output['show_menu'] = array('util' => 1,'char' => 0); // Display only the util and char button panels: util default opened, char default closed $roster->output['show_menu']['custom'] = 1; // Display the default panels and the custom button panel, default opened
$roster->output['html_head'] = 'string';
Accepts any string needing to be in the html header for your addon, such as javascript inclusion
roster_header.tpl will pick this variable up and place its contents in the header
$roster->output['body_attr'] = 'string';
Accepts any string needing to be in the <body> tag in roster_header.tpl
$roster->output['body_onload'] = 'string';
Accepts any string needing to be in <body onload=""> in roster_header.tpl
Any output needed, just print or echo it
Roster uses php's output buffering to capture all print or echo commands
Then it echos the output where needed
This is a list of functions that are available for your Addons
View Roster:FunctionsOverview for details on available Roster functions
Like those nifty log-in boxes in RosterCP?
Now you can easily add one to your addon!
This checks if the user has admin access
// ----[ Check log-in ]------------------------------------- // Disallow viewing of the page if( !$roster->auth->getAuthorized($required_level) ) { print '<span class="title_text">Some Title</span><br />'. $roster->auth->getLoginForm(); return; //Kicks out of the AddOn and back to the Roster framework } // ----[ End Check log-in ]---------------------------------
Also note that there is a log in box in the menu.
Link = http://[www.someurl.net]/roster/?p=credits (SEO: http://[www.someurl.net]/roster/credits.html)
To get credits on the main credit page, set the $credits array in the AddOn's inc/install.def.php file
var $credits = array( array( "name"=> "Author Name", "info"=> "Extra Info"), );
Replace the following
(Use <br> for line breaks)
You can add multiple arrays inside the main one to add more credits
(Try not to add too many, we don't wanna clutter the credits page now do we?)
/** * Makes a tootip and places it into the tooltip array * * @param string $var * @param string $content */ function setTooltip( $var , $content )
Creates a js variable for use with overlib
Instead of outputting text in the html, you can create a js variable that holds this instead
/** * Easy all in one function to make overlib tooltips * Creates a string for insertion into any html tag that has "onmouseover" and "onmouseout" events * * @param string $tooltip | Tooltip as a string (delimited by "\n" character) * @param string $caption | (optional) Text to set as a true OverLib caption * @param string $caption_color | (optional) Color for the caption * Default is 'ffffff' - white * @param bool $mode| (optional) Options 0=colorize,1=clean,2=pass through * Default 0 (colorize) * @param string $locale | Locale so color parser can work correctly * Only needed when $colorize is true * Default is $roster_conf['roster_lang'] * @param string $extra_parameters | (optional) Extra OverLib parameters you wish to pass * @return unknown */ function makeOverlib( $tooltip , $caption='' , $caption_color='' , $mode=0 , $locale='' , $extra_parameters='' )
Returns this string for use in any html tag that supports onmouseover and onmouseout events
onmouseover="return overlib(overlib_'.$num_of_tips.$caption.$extra_parameters.');" onmouseout="return nd();"
For more info about makeOverlib() and its supporting functions, look at functions.lib.php
Functions to draw message boxes
/** * Draw a message box with the specified border color. * * @param string $message | The message to display inside the box * @param string $title | The box title * @param string $style | The border style * @param string $width | Set a fixed width * @return string $html | The HTML for the messagebox */ function messagebox( $message , $title='Message' , $style='sgray' , $width='' )
/** * Draw a 300x550px scrolling messagebox with the specified border color. * * @param string $message | The message to display inside the box * @param string $title | The box title * @param string $style | The border style * @param string $width | Initial width with unit * @param string $height | Initial height with unit * @return string $html | The HTML for the messagebox */ function scrollbox($message, $title = 'Message', $style = 'sgray', $width = '550px', $height = '300px')
/** * Draw a message box with the specified border color. * * @param string $message | The message to display inside the box * @param string $title | The box title * @param string $style | The border style * @param boolean $open | True if initially open * @param string $width | Initial width with unit * @return string $html | The HTML for the messagebox */ function messageboxtoggle($message, $title = 'Message', $style = 'sgray', $open = false, $width = '550px')
/** * Draw a 300x550px scrolling messagebox with the specified border color. * * @param string $messages | The message to display inside the box * @param string $title | The box title * @param string $style | The border style * @param string $width | Initial width with unit * @param string $height | Initial height with unit * @return string $html | The HTML for the messagebox */ function scrollboxtoggle($message, $title = 'Message', $style = 'sgray', $open = false, $width = '550px', $height = '300px')