MyShaarli/plugins/demo_plugin/demo_plugin.php
ArthurHoaro 7fde6de121 New init function for plugins, supports errors reporting
All plugins can optionally add an init function named `pluginname_init()` which is called when the plugin is loaded.

This function is aware of the config, and can return initialization errors, which are displayed in the header template.

Note that the previous error system hack no longer work.
2016-10-14 13:22:58 +02:00

368 lines
8 KiB
PHP

<?php
/**
* Demo Plugin.
*
* This plugin try to cover Shaarli's plugin API entirely.
* Can be used by plugin developper to make their own.
*/
/*
* RENDER HEADER, INCLUDES, FOOTER
*
* Those hooks are called at every page rendering.
* You can filter its execution by checking _PAGE_ value
* and check user status with _LOGGEDIN_.
*/
/**
* Initialization function.
* It will be called when the plugin is loaded.
* This function can be used to return a list of initialization errors.
*
* @param $conf ConfigManager instance.
*
* @return array List of errors (optional).
*/
function demo_plugin_init($conf)
{
$conf->get('toto', 'nope');
$errors[] = 'This a demo init error.';
return $errors;
}
/**
* Hook render_header.
* Executed on every page redering.
*
* Template placeholders:
* - buttons_toolbar
* - fields_toolbar
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_header($data)
{
// Only execute when linklist is rendered.
if ($data['_PAGE_'] == Router::$PAGE_LINKLIST) {
// If loggedin
if ($data['_LOGGEDIN_'] === true) {
// Buttons in toolbar
$data['buttons_toolbar'][] = '<li><a href="#">DEMO_buttons_toolbar</a></li>';
}
// Fields in toolbar
$data['fields_toolbar'][] = 'DEMO_fields_toolbar';
}
// Another button always displayed
$data['buttons_toolbar'][] = '<li><a href="#">DEMO</a></li>';
return $data;
}
/**
* Hook render_includes.
* Executed on every page redering.
*
* Template placeholders:
* - css_files
*
* Data:
* - _PAGE_: current page
* - _LOGGEDIN_: true/false
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_includes($data)
{
// List of plugin's CSS files.
// Note that you just need to specify CSS path.
$data['css_files'][] = PluginManager::$PLUGINS_PATH . '/demo_plugin/custom_demo.css';
return $data;
}
/**
* Hook render_footer.
* Executed on every page redering.
*
* Template placeholders:
* - text
* - endofpage
* - js_files
*
* Data:
* - _PAGE_: current page
* - _LOGGEDIN_: true/false
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_footer($data)
{
// footer text
$data['text'][] = 'Shaarli is now enhanced by the awesome demo_plugin.';
// Free elements at the end of the page.
$data['endofpage'][] = '<marquee id="demo_marquee">' .
'DEMO: it\'s 1999 all over again!' .
'</marquee>';
// List of plugin's JS files.
// Note that you just need to specify CSS path.
$data['js_files'][] = PluginManager::$PLUGINS_PATH . '/demo_plugin/demo_plugin.js';
return $data;
}
/*
* SPECIFIC PAGES
*/
/**
* Hook render_linklist.
*
* Template placeholders:
* - action_plugin: next to 'private only' button.
* - plugin_start_zone: page start
* - plugin_end_zone: page end
* - link_plugin: icons below each links.
*
* Data:
* - _LOGGEDIN_: true/false
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_linklist($data)
{
// action_plugin
$data['action_plugin'][] = '<div class="upper_plugin_demo"><a href="?up" title="Uppercase!">←</a></div>';
if (isset($_GET['up'])) {
// Manipulate link data
foreach ($data['links'] as &$value) {
$value['description'] = strtoupper($value['description']);
$value['title'] = strtoupper($value['title']);
}
}
// link_plugin (for each link)
foreach ($data['links'] as &$value) {
$value['link_plugin'][] = ' DEMO \o/';
}
// plugin_start_zone
$data['plugin_start_zone'][] = '<center>BEFORE</center>';
// plugin_start_zone
$data['plugin_end_zone'][] = '<center>AFTER</center>';
return $data;
}
/**
* Hook render_editlink.
*
* Template placeholders:
* - field_plugin: add link fields after tags.
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_editlink($data)
{
// Load HTML into a string
$html = file_get_contents(PluginManager::$PLUGINS_PATH .'/demo_plugin/field.html');
// replace value in HTML if it exists in $data
if (!empty($data['link']['stuff'])) {
$html = sprintf($html, $data['link']['stuff']);
} else {
$html = sprintf($html, '');
}
// field_plugin
$data['edit_link_plugin'][] = $html;
return $data;
}
/**
* Hook render_tools.
*
* Template placeholders:
* - tools_plugin: after other tools.
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_tools($data)
{
// field_plugin
$data['tools_plugin'][] = 'tools_plugin';
return $data;
}
/**
* Hook render_picwall.
*
* Template placeholders:
* - plugin_start_zone: page start.
* - plugin_end_zone: page end.
*
* Data:
* - _LOGGEDIN_: true/false
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_picwall($data)
{
// plugin_start_zone
$data['plugin_start_zone'][] = '<center>BEFORE</center>';
// plugin_end_zone
$data['plugin_end_zone'][] = '<center>AFTER</center>';
return $data;
}
/**
* Hook render_tagcloud.
*
* Template placeholders:
* - plugin_start_zone: page start.
* - plugin_end_zone: page end.
*
* Data:
* - _LOGGEDIN_: true/false
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_tagcloud($data)
{
// plugin_start_zone
$data['plugin_start_zone'][] = '<center>BEFORE</center>';
// plugin_end_zone
$data['plugin_end_zone'][] = '<center>AFTER</center>';
return $data;
}
/**
* Hook render_daily.
*
* Template placeholders:
* - plugin_start_zone: page start.
* - plugin_end_zone: page end.
*
* Data:
* - _LOGGEDIN_: true/false
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_daily($data)
{
// plugin_start_zone
$data['plugin_start_zone'][] = '<center>BEFORE</center>';
// plugin_end_zone
$data['plugin_end_zone'][] = '<center>AFTER</center>';
// Manipulate columns data
foreach ($data['cols'] as &$value) {
foreach ($value as &$value2) {
$value2['formatedDescription'] .= ' ಠ_ಠ';
}
}
// Add plugin content at the end of each link
foreach ($data['cols'] as &$value) {
foreach ($value as &$value2) {
$value2['link_plugin'][] = 'DEMO';
}
}
return $data;
}
/*
* DATA SAVING HOOK.
*/
/**
* Hook savelink.
*
* Triggered when a link is save (new or edit).
* All new links now contain a 'stuff' value.
*
* @param array $data contains the new link data.
*
* @return array altered $data.
*/
function hook_demo_plugin_save_link($data)
{
// Save stuff added in editlink field
if (!empty($_POST['lf_stuff'])) {
$data['stuff'] = escape($_POST['lf_stuff']);
}
return $data;
}
/**
* Hook delete_link.
*
* Triggered when a link is deleted.
*
* @param array $data contains the link to be deleted.
*
* @return array altered data.
*/
function hook_demo_plugin_delete_link($data)
{
if (strpos($data['url'], 'youtube.com') !== false) {
exit('You can not delete a YouTube link. Don\'t ask.');
}
}
/**
* Execute render_feed hook.
* Called with ATOM and RSS feed.
*
* Special data keys:
* - _PAGE_: current page
* - _LOGGEDIN_: true/false
*
* @param array $data data passed to plugin
*
* @return array altered $data.
*/
function hook_demo_plugin_render_feed($data)
{
foreach ($data['links'] as &$link) {
if ($data['_PAGE_'] == Router::$PAGE_FEED_ATOM) {
$link['description'] .= ' - ATOM Feed' ;
}
elseif ($data['_PAGE_'] == Router::$PAGE_FEED_RSS) {
$link['description'] .= ' - RSS Feed';
}
}
return $data;
}