]> git.mxchange.org Git - friendica.git/blobdiff - doc/Addons.md
Remove the queue from the core
[friendica.git] / doc / Addons.md
index ec413c6ac89a6df88ba6114e0fabdcf0062f06f7..c87345f874c3539470a5907e6dc890b31e3b5770 100644 (file)
@@ -32,7 +32,7 @@ It will be displayed in the admin panel and should include some further informat
 
 Register your addon hooks during installation.
 
-    Addon::registerHook($hookname, $file, $function);
+    \Friendica\Core\Hook::register($hookname, $file, $function);
 
 $hookname is a string and corresponds to a known Friendica PHP hook.
 
@@ -67,47 +67,67 @@ $b can be called anything you like.
 This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter.
 Remember to declare it with `&` if you wish to alter it.
 
-## JavaScript addon hooks
+## Global stylesheets
 
-### PHP part
+If your addon requires adding a stylesheet on all pages of Friendica, add the following hook:
 
-Make sure your JavaScript addon file (addon/*addon_name*/*addon_name*.js) is listed in the document response.
+```php
+function <addon>_install()
+{
+       \Friendica\Core\Hook::register('head', __FILE__, '<addon>_head');
+       ...
+}
 
-In your addon install function, add:
 
-```php
-Addon::registerHook('template_vars', __FILE__, '<addon_name>_template_vars');
+function <addon>_head(App $a)
+{
+       $a->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css');
+}
 ```
 
-In your addon uninstall function, add:
+`__DIR__` is the folder path of your addon.
 
-```php
-Addon::unregisterHook('template_vars', __FILE__, '<addon_name>_template_vars');
-```
+## JavaScript
+
+### Global scripts
+
+If your addon requires adding a script on all pages of Friendica, add the following hook:
 
-Then, add your addon name to the *addon_hooks* template variable array:
 
 ```php
-function <addon_name>_template_vars($a, &$arr)
+function <addon>_install()
+{
+       \Friendica\Core\Hook::register('footer', __FILE__, '<addon>_footer');
+       ...
+}
+
+function <addon>_footer(App $a)
 {
-       if (!array_key_exists('addon_hooks', $arr['vars']))
-       {
-               $arr['vars']['addon_hooks'] = array();
-       }
-       $arr['vars']['addon_hooks'][] = "<addon_name>";
+       $a->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js');
 }
 ```
 
-### JavaScript part
+`__DIR__` is the folder path of your addon.
+
+### JavaScript hooks
 
-Register your addon hooks in file `addon/*addon_name*/*addon_name*.js`.
+The main Friendica script provides hooks via events dispatched on the `document` property.
+In your Javascript file included as described above, add your event listener like this:
 
 ```js
 document.addEventListener(name, callback);
 ```
 
-*name* is the name of the hook and corresponds to a known Friendica JavaScript hook.
-*callback* is a JavaScript function to execute.
+- *name* is the name of the hook and corresponds to a known Friendica JavaScript hook.
+- *callback* is a JavaScript anonymous function to execute.
+
+More info about Javascript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
+
+#### Current JavaScript hooks
+
+##### postprocess_liveupdate
+Called at the end of the live update process (XmlHttpRequest) and on a post preview.
+No additional data is provided.
 
 ## Modules
 
@@ -140,11 +160,11 @@ In your code, like in the function addon_name_content(), load the template file
 ```php
 # load template file. first argument is the template name,
 # second is the addon path relative to friendica top folder
-$tpl = get_markup_template('mytemplate.tpl', 'addon/addon_name/');
+$tpl = Renderer::getMarkupTemplate('mytemplate.tpl', 'addon/addon_name/');
 
 # apply template. first argument is the loaded template,
 # second an array of 'name' => 'values' to pass to template
-$output = replace_macros($tpl, array(
+$output = Renderer::replaceMacros($tpl, array(
        'title' => 'My beautiful addon',
 ));
 ```
@@ -252,6 +272,11 @@ Called after conversion of bbcode to HTML.
 Called after tag conversion of HTML to bbcode (e.g. remote message posting)
 `$b` is a string converted text
 
+### head
+Called when building the `<head>` sections.
+Stylesheets should be registered using this hook.
+`$b` is an HTML string of the `<head>` tag.
+
 ### page_header
 Called after building the page navigation section.
 `$b` is a string HTML of nav region.
@@ -286,6 +311,11 @@ No hook data.
 Called after HTML content functions have completed.
 `$b` is (string) HTML of content div.
 
+### footer
+Called after HTML content functions have completed.
+Deferred Javascript files should be registered using this hook.
+`$b` is (string) HTML of footer div/element.
+
 ### avatar_lookup
 Called when looking up the avatar. `$b` is an array:
 
@@ -381,318 +411,338 @@ Hook data:
     visitor => array with the contact record of the visitor
     url => the query string
 
-## Current JavaScript hooks
+### jot_networks
+Called when displaying the post permission screen.
+Hook data is a list of form fields that need to be displayed along the ACL.
+Form field array structure is:
+
+- **type**: `checkbox` or `select`.
+- **field**: Standard field data structure to be used by `field_checkbox.tpl` and `field_select.tpl`.
+
+For `checkbox`, **field** is:
+  - [0] (String): Form field name; Mandatory. 
+  - [1]: (String): Form field label; Optional, default is none.
+  - [2]: (Boolean): Whether the checkbox should be checked by default; Optional, default is false.
+  - [3]: (String): Additional help text; Optional, default is none.
+  - [4]: (String): Additional HTML attributes; Optional, default is none.
+
+For `select`, **field** is:
+  - [0] (String): Form field name; Mandatory.
+  - [1] (String): Form field label; Optional, default is none.
+  - [2] (Boolean): Default value to be selected by default; Optional, default is none.
+  - [3] (String): Additional help text; Optional, default is none.
+  - [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory. 
+
 
-### postprocess_liveupdate
-Called at the end of the live update process (XmlHttpRequest)
 
 ## Complete list of hook callbacks
 
-Here is a complete list of all hook callbacks with file locations (as of 01-Apr-2018). Please see the source for details of any hooks not documented above.
+Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above.
 
 ### index.php
 
-    Addon::callHooks('init_1');
-    Addon::callHooks('app_menu', $arr);
-    Addon::callHooks('page_content_top', $a->page['content']);
-    Addon::callHooks($a->module.'_mod_init', $placeholder);
-    Addon::callHooks($a->module.'_mod_init', $placeholder);
-    Addon::callHooks($a->module.'_mod_post', $_POST);
-    Addon::callHooks($a->module.'_mod_afterpost', $placeholder);
-    Addon::callHooks($a->module.'_mod_content', $arr);
-    Addon::callHooks($a->module.'_mod_aftercontent', $arr);
-    Addon::callHooks('page_end', $a->page['content']);
+    Hook::callAll('init_1');
+    Hook::callAll('app_menu', $arr);
+    Hook::callAll('page_content_top', $a->page['content']);
+    Hook::callAll($a->module.'_mod_init', $placeholder);
+    Hook::callAll($a->module.'_mod_init', $placeholder);
+    Hook::callAll($a->module.'_mod_post', $_POST);
+    Hook::callAll($a->module.'_mod_afterpost', $placeholder);
+    Hook::callAll($a->module.'_mod_content', $arr);
+    Hook::callAll($a->module.'_mod_aftercontent', $arr);
+    Hook::callAll('page_end', $a->page['content']);
 
 ### include/api.php
 
-    Addon::callHooks('logged_in', $a->user);
-    Addon::callHooks('authenticate', $addon_auth);
-    Addon::callHooks('logged_in', $a->user);
+    Hook::callAll('logged_in', $a->user);
+    Hook::callAll('authenticate', $addon_auth);
+    Hook::callAll('logged_in', $a->user);
 
 ### include/enotify.php
 
-    Addon::callHooks('enotify', $h);
-    Addon::callHooks('enotify_store', $datarray);
-    Addon::callHooks('enotify_mail', $datarray);
-    Addon::callHooks('check_item_notification', $notification_data);
+    Hook::callAll('enotify', $h);
+    Hook::callAll('enotify_store', $datarray);
+    Hook::callAll('enotify_mail', $datarray);
+    Hook::callAll('check_item_notification', $notification_data);
 
 ### include/conversation.php
 
-    Addon::callHooks('conversation_start', $cb);
-    Addon::callHooks('render_location', $locate);
-    Addon::callHooks('display_item', $arr);
-    Addon::callHooks('display_item', $arr);
-    Addon::callHooks('item_photo_menu', $args);
-    Addon::callHooks('jot_tool', $jotplugins);
-
-### include/security.php
-
-    Addon::callHooks('logged_in', $a->user);
+    Hook::callAll('conversation_start', $cb);
+    Hook::callAll('render_location', $locate);
+    Hook::callAll('display_item', $arr);
+    Hook::callAll('display_item', $arr);
+    Hook::callAll('item_photo_menu', $args);
+    Hook::callAll('jot_tool', $jotplugins);
 
 ### include/text.php
 
-    Addon::callHooks('contact_block_end', $arr);
-    Addon::callHooks('poke_verbs', $arr);
-    Addon::callHooks('put_item_in_cache', $hook_data);
-    Addon::callHooks('prepare_body_init', $item);
-    Addon::callHooks('prepare_body_content_filter', $hook_data);
-    Addon::callHooks('prepare_body', $hook_data);
-    Addon::callHooks('prepare_body_final', $hook_data);
+    Hook::callAll('contact_block_end', $arr);
+    Hook::callAll('poke_verbs', $arr);
+    Hook::callAll('put_item_in_cache', $hook_data);
+    Hook::callAll('prepare_body_init', $item);
+    Hook::callAll('prepare_body_content_filter', $hook_data);
+    Hook::callAll('prepare_body', $hook_data);
+    Hook::callAll('prepare_body_final', $hook_data);
 
 ### include/items.php
 
-    Addon::callHooks('page_info_data', $data);
+    Hook::callAll('page_info_data', $data);
 
 ### mod/directory.php
 
-    Addon::callHooks('directory_item', $arr);
+    Hook::callAll('directory_item', $arr);
 
 ### mod/xrd.php
 
-    Addon::callHooks('personal_xrd', $arr);
+    Hook::callAll('personal_xrd', $arr);
 
 ### mod/ping.php
 
-    Addon::callHooks('network_ping', $arr);
+    Hook::callAll('network_ping', $arr);
 
 ### mod/parse_url.php
 
-    Addon::callHooks("parse_link", $arr);
+    Hook::callAll("parse_link", $arr);
 
 ### mod/manage.php
 
-    Addon::callHooks('home_init', $ret);
+    Hook::callAll('home_init', $ret);
 
 ### mod/acl.php
 
-    Addon::callHooks('acl_lookup_end', $results);
+    Hook::callAll('acl_lookup_end', $results);
 
 ### mod/network.php
 
-    Addon::callHooks('network_content_init', $arr);
-    Addon::callHooks('network_tabs', $arr);
+    Hook::callAll('network_content_init', $arr);
+    Hook::callAll('network_tabs', $arr);
 
 ### mod/friendica.php
 
-    Addon::callHooks('about_hook', $o);
+    Hook::callAll('about_hook', $o);
 
 ### mod/subthread.php
 
-    Addon::callHooks('post_local_end', $arr);
+    Hook::callAll('post_local_end', $arr);
 
 ### mod/profiles.php
 
-    Addon::callHooks('profile_post', $_POST);
-    Addon::callHooks('profile_edit', $arr);
+    Hook::callAll('profile_post', $_POST);
+    Hook::callAll('profile_edit', $arr);
 
 ### mod/settings.php
 
-    Addon::callHooks('addon_settings_post', $_POST);
-    Addon::callHooks('connector_settings_post', $_POST);
-    Addon::callHooks('display_settings_post', $_POST);
-    Addon::callHooks('settings_post', $_POST);
-    Addon::callHooks('addon_settings', $settings_addons);
-    Addon::callHooks('connector_settings', $settings_connectors);
-    Addon::callHooks('display_settings', $o);
-    Addon::callHooks('settings_form', $o);
+    Hook::callAll('addon_settings_post', $_POST);
+    Hook::callAll('connector_settings_post', $_POST);
+    Hook::callAll('display_settings_post', $_POST);
+    Hook::callAll('settings_post', $_POST);
+    Hook::callAll('addon_settings', $settings_addons);
+    Hook::callAll('connector_settings', $settings_connectors);
+    Hook::callAll('display_settings', $o);
+    Hook::callAll('settings_form', $o);
 
 ### mod/photos.php
 
-    Addon::callHooks('photo_post_init', $_POST);
-    Addon::callHooks('photo_post_file', $ret);
-    Addon::callHooks('photo_post_end', $foo);
-    Addon::callHooks('photo_post_end', $foo);
-    Addon::callHooks('photo_post_end', $foo);
-    Addon::callHooks('photo_post_end', $foo);
-    Addon::callHooks('photo_post_end', intval($item_id));
-    Addon::callHooks('photo_upload_form', $ret);
+    Hook::callAll('photo_post_init', $_POST);
+    Hook::callAll('photo_post_file', $ret);
+    Hook::callAll('photo_post_end', $foo);
+    Hook::callAll('photo_post_end', $foo);
+    Hook::callAll('photo_post_end', $foo);
+    Hook::callAll('photo_post_end', $foo);
+    Hook::callAll('photo_post_end', intval($item_id));
+    Hook::callAll('photo_upload_form', $ret);
 
 ### mod/profile.php
 
-    Addon::callHooks('profile_advanced', $o);
+    Hook::callAll('profile_advanced', $o);
 
 ### mod/home.php
 
-    Addon::callHooks('home_init', $ret);
-    Addon::callHooks("home_content", $content);
+    Hook::callAll('home_init', $ret);
+    Hook::callAll("home_content", $content);
 
 ### mod/poke.php
 
-    Addon::callHooks('post_local_end', $arr);
+    Hook::callAll('post_local_end', $arr);
 
 ### mod/contacts.php
 
-    Addon::callHooks('contact_edit_post', $_POST);
-    Addon::callHooks('contact_edit', $arr);
+    Hook::callAll('contact_edit_post', $_POST);
+    Hook::callAll('contact_edit', $arr);
 
 ### mod/tagger.php
 
-    Addon::callHooks('post_local_end', $arr);
+    Hook::callAll('post_local_end', $arr);
 
 ### mod/lockview.php
 
-    Addon::callHooks('lockview_content', $item);
+    Hook::callAll('lockview_content', $item);
 
 ### mod/uexport.php
 
-    Addon::callHooks('uexport_options', $options);
+    Hook::callAll('uexport_options', $options);
 
 ### mod/register.php
 
-    Addon::callHooks('register_post', $arr);
-    Addon::callHooks('register_form', $arr);
+    Hook::callAll('register_post', $arr);
+    Hook::callAll('register_form', $arr);
 
 ### mod/item.php
 
-    Addon::callHooks('post_local_start', $_REQUEST);
-    Addon::callHooks('post_local', $datarray);
-    Addon::callHooks('post_local_end', $datarray);
+    Hook::callAll('post_local_start', $_REQUEST);
+    Hook::callAll('post_local', $datarray);
+    Hook::callAll('post_local_end', $datarray);
 
 ### mod/editpost.php
 
-    Addon::callHooks('jot_tool', $jotplugins);
+    Hook::callAll('jot_tool', $jotplugins);
 
 ### src/Network/FKOAuth1.php
 
-    Addon::callHooks('logged_in', $a->user);
+    Hook::callAll('logged_in', $a->user);
 
 ### src/Render/FriendicaSmartyEngine.php
 
-    Addon::callHooks("template_vars", $arr);
+    Hook::callAll("template_vars", $arr);
 
 ### src/App.php
 
-    Addon::callHooks('load_config');
+    Hook::callAll('load_config');
+    Hook::callAll('head');
+    Hook::callAll('footer');
 
 ### src/Model/Item.php
 
-    Addon::callHooks('post_local', $item);
-    Addon::callHooks('post_remote', $item);
-    Addon::callHooks('post_local_end', $posted_item);
-    Addon::callHooks('post_remote_end', $posted_item);
-    Addon::callHooks('tagged', $arr);
-    Addon::callHooks('post_local_end', $new_item);
+    Hook::callAll('post_local', $item);
+    Hook::callAll('post_remote', $item);
+    Hook::callAll('post_local_end', $posted_item);
+    Hook::callAll('post_remote_end', $posted_item);
+    Hook::callAll('tagged', $arr);
+    Hook::callAll('post_local_end', $new_item);
 
 ### src/Model/Contact.php
 
-    Addon::callHooks('contact_photo_menu', $args);
-    Addon::callHooks('follow', $arr);
+    Hook::callAll('contact_photo_menu', $args);
+    Hook::callAll('follow', $arr);
 
 ### src/Model/Profile.php
 
-    Addon::callHooks('profile_sidebar_enter', $profile);
-    Addon::callHooks('profile_sidebar', $arr);
-    Addon::callHooks('profile_tabs', $arr);
-    Addon::callHooks('zrl_init', $arr);
-    Addon::callHooks('magic_auth_success', $arr);
+    Hook::callAll('profile_sidebar_enter', $profile);
+    Hook::callAll('profile_sidebar', $arr);
+    Hook::callAll('profile_tabs', $arr);
+    Hook::callAll('zrl_init', $arr);
+    Hook::callAll('magic_auth_success', $arr);
 
 ### src/Model/Event.php
 
-    Addon::callHooks('event_updated', $event['id']);
-    Addon::callHooks("event_created", $event['id']);
+    Hook::callAll('event_updated', $event['id']);
+    Hook::callAll("event_created", $event['id']);
 
 ### src/Model/User.php
 
-    Addon::callHooks('register_account', $uid);
-    Addon::callHooks('remove_user', $user);
+    Hook::callAll('register_account', $uid);
+    Hook::callAll('remove_user', $user);
 
 ### src/Content/Text/BBCode.php
 
-    Addon::callHooks('bbcode', $text);
-    Addon::callHooks('bb2diaspora', $text);
+    Hook::callAll('bbcode', $text);
+    Hook::callAll('bb2diaspora', $text);
 
 ### src/Content/Text/HTML.php
 
-    Addon::callHooks('html2bbcode', $message);
+    Hook::callAll('html2bbcode', $message);
 
 ### src/Content/Smilies.php
 
-    Addon::callHooks('smilie', $params);
+    Hook::callAll('smilie', $params);
 
 ### src/Content/Feature.php
 
-    Addon::callHooks('isEnabled', $arr);
-    Addon::callHooks('get', $arr);
+    Hook::callAll('isEnabled', $arr);
+    Hook::callAll('get', $arr);
 
 ### src/Content/ContactSelector.php
 
-    Addon::callHooks('network_to_name', $nets);
-    Addon::callHooks('gender_selector', $select);
-    Addon::callHooks('sexpref_selector', $select);
-    Addon::callHooks('marital_selector', $select);
+    Hook::callAll('network_to_name', $nets);
+    Hook::callAll('gender_selector', $select);
+    Hook::callAll('sexpref_selector', $select);
+    Hook::callAll('marital_selector', $select);
 
 ### src/Content/OEmbed.php
 
-    Addon::callHooks('oembed_fetch_url', $embedurl, $j);
+    Hook::callAll('oembed_fetch_url', $embedurl, $j);
 
 ### src/Content/Nav.php
 
-    Addon::callHooks('page_header', $a->page['nav']);
-    Addon::callHooks('nav_info', $nav);
+    Hook::callAll('page_header', $a->page['nav']);
+    Hook::callAll('nav_info', $nav);
 
 ### src/Worker/Directory.php
 
-    Addon::callHooks('globaldir_update', $arr);
+    Hook::callAll('globaldir_update', $arr);
 
 ### src/Worker/Notifier.php
 
-    Addon::callHooks('notifier_end', $target_item);
-
-### src/Worker/Queue.php
-
-    Addon::callHooks('queue_predeliver', $r);
-    Addon::callHooks('queue_deliver', $params);
+    Hook::callAll('notifier_end', $target_item);
 
 ### src/Module/Login.php
 
-    Addon::callHooks('authenticate', $addon_auth);
-    Addon::callHooks('login_hook', $o);
+    Hook::callAll('authenticate', $addon_auth);
+    Hook::callAll('login_hook', $o);
 
 ### src/Module/Logout.php
 
-    Addon::callHooks("logging_out");
+    Hook::callAll("logging_out");
 
 ### src/Object/Post.php
 
-    Addon::callHooks('render_location', $locate);
-    Addon::callHooks('display_item', $arr);
+    Hook::callAll('render_location', $locate);
+    Hook::callAll('display_item', $arr);
 
 ### src/Core/ACL.php
 
-    Addon::callHooks('contact_select_options', $x);
-    Addon::callHooks($a->module.'_pre_'.$selname, $arr);
-    Addon::callHooks($a->module.'_post_'.$selname, $o);
-    Addon::callHooks($a->module.'_pre_'.$selname, $arr);
-    Addon::callHooks($a->module.'_post_'.$selname, $o);
-    Addon::callHooks('jot_networks', $jotnets);
+    Hook::callAll('contact_select_options', $x);
+    Hook::callAll($a->module.'_pre_'.$selname, $arr);
+    Hook::callAll($a->module.'_post_'.$selname, $o);
+    Hook::callAll($a->module.'_pre_'.$selname, $arr);
+    Hook::callAll($a->module.'_post_'.$selname, $o);
+    Hook::callAll('jot_networks', $jotnets);
+
+### src/Core/Authentication.php
+
+    Hook::callAll('logged_in', $a->user);
+
+### src/Core/Hook.php
+
+    self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata);
 
 ### src/Core/Worker.php
 
-    Addon::callHooks("proc_run", $arr);
+    Hook::callAll("proc_run", $arr);
 
 ### src/Util/Emailer.php
 
-    Addon::callHooks('emailer_send_prepare', $params);
-    Addon::callHooks("emailer_send", $hookdata);
+    Hook::callAll('emailer_send_prepare', $params);
+    Hook::callAll("emailer_send", $hookdata);
 
 ### src/Util/Map.php
 
-    Addon::callHooks('generate_map', $arr);
-    Addon::callHooks('generate_named_map', $arr);
-    Addon::callHooks('Map::getCoordinates', $arr);
+    Hook::callAll('generate_map', $arr);
+    Hook::callAll('generate_named_map', $arr);
+    Hook::callAll('Map::getCoordinates', $arr);
 
 ### src/Util/Network.php
 
-    Addon::callHooks('avatar_lookup', $avatar);
+    Hook::callAll('avatar_lookup', $avatar);
 
 ### src/Util/ParseUrl.php
 
-    Addon::callHooks("getsiteinfo", $siteinfo);
+    Hook::callAll("getsiteinfo", $siteinfo);
 
 ### src/Protocol/DFRN.php
 
-    Addon::callHooks('atom_feed_end', $atom);
-    Addon::callHooks('atom_feed_end', $atom);
+    Hook::callAll('atom_feed_end', $atom);
+    Hook::callAll('atom_feed_end', $atom);
 
 ### view/js/main.js