* Status: {Unsupported|Arbitrary status}
*/
```
-
+
You can also provide a longer documentation in a `README` or `README.md` file.
The latter will be converted from Markdown to HTML in the addon detail page.
function <addon>_head(App $a)
{
- $a->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css');
+ \Friendica\DI::page()->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css');
}
```
function <addon>_footer(App $a)
{
- $a->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js');
+ \Friendica\DI::page()->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js');
}
```
In order for a addon to act as a module it needs to declare an empty function `<addon>_module()`.
If this function exists, you will now receive all page requests for `https://my.web.site/<addon>` - with any number of URL components as additional arguments.
-These are parsed into an array $a->argv, with a corresponding $a->argc indicating the number of URL components.
-So `https://my.web.site/addon/arg1/arg2` would look for a module named "addon" and pass its module functions the $a App structure (which is available to many components).
-This will include:
-
+These are parsed into the `App\Arguments` object.
+So `https://my.web.site/addon/arg1/arg2` would give this:
```php
-$a->argc = 3
-$a->argv = array(0 => 'addon', 1 => 'arg1', 2 => 'arg2');
+DI::args()->getArgc(); // = 3
+DI::args()->get(0); // = 'addon'
+DI::args()->get(1); // = 'arg1'
+DI::args()->get(2); // = 'arg2'
```
To display a module page, you need to declare the function `<addon>_content(App $a)`, which defines and returns the page body content.
In your code, like in the function addon_name_content(), load the template file and execute it passing needed values:
```php
+use Friendica\Core\Renderer;
+
# load template file. first argument is the template name,
# second is the addon path relative to friendica top folder
$tpl = Renderer::getMarkupTemplate('mytemplate.tpl', __DIR__);
- **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.
+ - [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.
- [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.
+ - [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory.
### route_collection
Called just before dispatching the router.
**Notice**: The class whose name is provided in the route handler must be reachable via auto-loader.
+### probe_detect
+
+Called before trying to detect the target network of a URL.
+If any registered hook function sets the `result` key of the hook data array, it will be returned immediately.
+Hook functions should also return immediately if the hook data contains an existing result.
+
+Hook data:
+
+- **uri** (input): the profile URI.
+- **network** (input): the target network (can be empty for auto-detection).
+- **uid** (input): the user to return the contact data for (can be empty for public contacts).
+- **result** (output): Set by the hook function to indicate a successful detection.
+
+### support_follow
+
+Called to assert whether a connector addon provides follow capabilities.
+
+Hook data:
+- **protocol** (input): shorthand for the protocol. List of values is available in `src/Core/Protocol.php`.
+- **result** (output): should be true if the connector provides follow capabilities, left alone otherwise.
+
+### support_revoke_follow
+
+Called to assert whether a connector addon provides follow revocation capabilities.
+
+Hook data:
+- **protocol** (input): shorthand for the protocol. List of values is available in `src/Core/Protocol.php`.
+- **result** (output): should be true if the connector provides follow revocation capabilities, left alone otherwise.
+
+### follow
+
+Called before adding a new contact for a user to handle non-native network remote contact (like Twitter).
+
+Hook data:
+
+- **url** (input): URL of the remote contact.
+- **contact** (output): should be filled with the contact (with uid = user creating the contact) array if follow was successful.
+
+### unfollow
+
+Called when unfollowing a remote contact on a non-native network (like Twitter)
+
+Hook data:
+- **contact** (input): the remote contact (uid = local unfollowing user id) array.
+- **result** (output): wether the unfollowing is successful or not.
+
+### revoke_follow
+
+Called when making a remote contact on a non-native network (like Twitter) unfollow you.
+
+Hook data:
+- **contact** (input): the remote contact (uid = local revoking user id) array.
+- **result** (output): a boolean value indicating wether the operation was successful or not.
+
+### block
+
+Called when blocking a remote contact on a non-native network (like Twitter).
+
+Hook data:
+- **contact** (input): the remote contact (uid = 0) array.
+- **uid** (input): the user id to issue the block for.
+- **result** (output): a boolean value indicating wether the operation was successful or not.
+
+### unblock
+
+Called when unblocking a remote contact on a non-native network (like Twitter).
+
+Hook data:
+- **contact** (input): the remote contact (uid = 0) array.
+- **uid** (input): the user id to revoke the block for.
+- **result** (output): a boolean value indicating wether the operation was successful or not.
+
+### storage_instance
+
+Called when a custom storage is used (e.g. webdav_storage)
+
+Hook data:
+- **name** (input): the name of the used storage backend
+- **data['storage']** (output): the storage instance to use (**must** implement `\Friendica\Core\Storage\IWritableStorage`)
+
+### storage_config
+
+Called when the admin of the node wants to configure a custom storage (e.g. webdav_storage)
+
+Hook data:
+- **name** (input): the name of the used storage backend
+- **data['storage_config']** (output): the storage configuration instance to use (**must** implement `\Friendica\Core\Storage\Capability\IConfigureStorage`)
+
## Complete list of hook callbacks
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.
Hook::callAll('init_1');
Hook::callAll('app_menu', $arr);
- Hook::callAll('page_content_top', $a->page['content']);
+ Hook::callAll('page_content_top', DI::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']);
+ Hook::callAll('page_end', DI::page()['content']);
### include/api.php
Hook::callAll('enotify_mail', $datarray);
Hook::callAll('check_item_notification', $notification_data);
-### include/conversation.php
+### src/Content/Conversation.php
Hook::callAll('conversation_start', $cb);
Hook::callAll('render_location', $locate);
Hook::callAll('item_photo_menu', $args);
Hook::callAll('jot_tool', $jotplugins);
-### include/items.php
-
- Hook::callAll('page_info_data', $data);
-
### mod/directory.php
Hook::callAll('directory_item', $arr);
Hook::callAll('about_hook', $o);
-### mod/subthread.php
-
- Hook::callAll('post_local_end', $arr);
-
### mod/profiles.php
Hook::callAll('profile_post', $_POST);
Hook::callAll('post_local_end', $arr);
-### mod/lockview.php
-
- Hook::callAll('lockview_content', $item);
-
### mod/uexport.php
Hook::callAll('uexport_options', $options);
Hook::callAll('jot_tool', $jotplugins);
-### src/Network/FKOAuth1.php
-
- Hook::callAll('logged_in', $a->user);
-
### src/Render/FriendicaSmartyEngine.php
Hook::callAll("template_vars", $arr);
Hook::callAll('event_updated', $event['id']);
Hook::callAll("event_created", $event['id']);
+### src/Model/Register.php
+
+ Hook::callAll('authenticate', $addon_auth);
+
### src/Model/User.php
+ Hook::callAll('authenticate', $addon_auth);
Hook::callAll('register_account', $uid);
Hook::callAll('remove_user', $user);
+### src/Module/PermissionTooltip.php
+
+ Hook::callAll('lockview_content', $item);
+
+### src/Module/Settings/Delegation.php
+
+ Hook::callAll('authenticate', $addon_auth);
+
+### src/Module/Settings/TwoFactor/Index.php
+
+ Hook::callAll('authenticate', $addon_auth);
+
+### src/Security/Authenticate.php
+
+ Hook::callAll('authenticate', $addon_auth);
+
+### src/Security/ExAuth.php
+
+ Hook::callAll('authenticate', $addon_auth);
+
### src/Content/ContactBlock.php
Hook::callAll('contact_block_end', $arr);
### src/Content/ContactSelector.php
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
### src/Content/Nav.php
- Hook::callAll('page_header', $a->page['nav']);
+ Hook::callAll('page_header', DI::page()['nav']);
Hook::callAll('nav_info', $nav);
+### src/Core/Authentication.php
+
+ Hook::callAll('logged_in', $a->user);
+
+### src/Core/Protocol.php
+
+ Hook::callAll('support_follow', $hook_data);
+ Hook::callAll('support_revoke_follow', $hook_data);
+ Hook::callAll('unfollow', $hook_data);
+ Hook::callAll('revoke_follow', $hook_data);
+ Hook::callAll('block', $hook_data);
+ Hook::callAll('unblock', $hook_data);
+
+### src/Core/StorageManager
+
+ Hook::callAll('storage_instance', $data);
+ Hook::callAll('storage_config', $data);
+
### src/Worker/Directory.php
Hook::callAll('globaldir_update', $arr);
### src/Module/Login.php
- Hook::callAll('authenticate', $addon_auth);
Hook::callAll('login_hook', $o);
### src/Module/Logout.php
### src/Core/Authentication.php
Hook::callAll('logged_in', $a->user);
+ Hook::callAll('authenticate', $addon_auth);
### src/Core/Hook.php