I have just started to code a plugin API. Here is my approach:
config/main.inc.php -> assign plugins array and bind API
// plugins
$rcmail_config['plugins'] = array();
$rcmail_config['plugins'][] = 'sign_up';
@include "./program/include/api.inc";
program/include/rcube_html.inc ... insert just before ...
print rcube_charset_convert($output, 'UTF-8', $this->charset);
... this snippet ...
// pass to plugins API
$output = rcmail_api($output);
program/include/api.inc -> API
foreach($rcmail_config['plugins'] as $key => $plugin){
// include customized plugin configuration
if(file_exists("plugins/" . $plugin . "/config.inc")){
@require_once("plugins/" . $plugin . "/config.inc");
}
// include default plugin configuration if there is no customized file
else if(file_exists("plugins/" . $plugin . "/config.inc.dist")){
@require_once("plugins/" . $plugin . "/config.inc.dist");
}
}
function rcmail_api($input=""){
if (($matches = preg_split('/]+)>/is', $input, null, PREG_SPLIT_DELIM_CAPTURE))){
if(count($matches) == 1){
return $input;
}
$output = $matches[0];
$ii = 0;
for($i=0;$i $ii++;
if($ii == 6){
$ii = 0;
}
switch($ii){
case '1':
//ignore
break;
case '2':
//ignore
break;
case '3':
//plugin (name/function)
$temparr = parse_attrib_string($matches[$i]);
$temparr = explode(":",$temparr['name']);
$plugin=$temparr[0];
$function=$temparr[1];
//$output .= do_hook($plugin, $function, $output);
break;
case '4':
//pass default plugin content and trigger plugin functions
$output .= do_hook($plugin, $function, $matches[$i]);
break;
case '5':
//ignore
break;
case '6':
//ignore
break;
}
}
$output .= $matches[$i-1];
return $output;
}
else{
return $input;
}
}
function do_hook($plugin, $function, $input=""){
global $CONFIG;
if(in_array($plugin,$CONFIG['plugins'])){
if(file_exists("plugins/" . $plugin . "/setup.inc")){
@require_once("plugins/" . $plugin . "/setup.inc");
}
if(file_exists("plugins/" . $plugin . "/setup.inc")){
@require_once("plugins/" . $plugin . "/functions.inc");
}
$exec = $plugin . "_" . $function;
if(function_exists($exec)){
$output = $exec($input);
}
}
if(isset($output)){
return $output;
}
else{
return $input;
}
}
?>
index.php -> trigger hook in
not authenticated state
GET request "&_plugin=pluginname,hookfunction"
insert just behind ...
// error steps
if ($_action=='error' && !empty($_GET['_code']))
raise_error(array('code' => hexdec($_GET['_code'])), FALSE, TRUE);
... this snippet
// execute plugins in not authenticated state
$_plugin = explode(",",strip_quotes(get_input_value('_plugin', RCUBE_INPUT_GPC)));
if(!isset($_plugin[2])){
do_hook($_plugin[0], $_plugin[1]);
}
index.php -> trigger hook in
authenticated state
GET request "&_plugin=pluginname,hookfunction,auth"
insert just before ...
// parse main template
$OUTPUT->send($_task);
... this snippet
// execute plugin in authenticated state
if(isset($_plugin[2]) && $_plugin[2] == 'auth'){
do_hook($_plugin[0], $_plugin[1]);
}
Plugins have to sit in "plugins" folder ...
File structure:
/plugins/pluginname/config.inc (contains $rcmail_config['somekey'] = true ...)
/plugins/pluginname/setup.inc (contains the hook functions: function pluginname_hookfunction($input=""){return $input}
/plugins/pluginname/functions.inc (contains helper functions)
Triggering a plugin function from the template:
... content passed as $input to hookfunction
Hope you understand ...
-Roland