]> git.mxchange.org Git - friendica.git/blob - doc/Addons.md
Update style.css
[friendica.git] / doc / Addons.md
1 Friendica Addon development
2 ==============
3
4 * [Home](help)
5
6 Please see the sample addon 'randplace' for a working example of using some of these features.
7 Addons work by intercepting event hooks - which must be registered.
8 Modules work by intercepting specific page requests (by URL path).
9
10 ## Naming
11
12 Addon names are used in file paths and functions names, and as such:
13 - Can't contain spaces or punctuation.
14 - Can't start with a number.
15
16 ## Metadata
17
18 You can provide human-readable information about your addon in the first multi-line comment of your addon file.
19
20 Here's the structure:
21
22 ```php
23 /**
24  * Name: {Human-readable name}
25  * Description: {Short description}
26  * Version: 1.0
27  * Author: {Author1 Name}
28  * Author: {Author2 Name} <{Author profile link}>
29  * Maintainer: {Maintainer1 Name}
30  * Maintainer: {Maintainer2 Name} <{Maintainer profile link}>
31  * Status: {Unsupported|Arbitrary status}
32  */
33 ```
34
35 You can also provide a longer documentation in a `README` or `README.md` file.
36 The latter will be converted from Markdown to HTML in the addon detail page.
37
38 ## Install/Uninstall
39
40 If your addon uses hooks, they have to be registered in a `<addon>_install()` function.
41 This function also allows to perform arbitrary actions your addon needs to function properly.
42
43 Uninstalling an addon automatically unregisters any hook it registered, but if you need to provide specific uninstallation steps, you can add them in a `<addon>_uninstall()` function.
44
45 The install and uninstall functions will be called (i.e. re-installed) if the addon changes after installation.
46 Therefore your uninstall should not destroy data and install should consider that data may already exist.
47 Future extensions may provide for "setup" and "remove".
48
49 ## PHP addon hooks
50
51 Register your addon hooks during installation.
52
53     \Friendica\Core\Hook::register($hookname, $file, $function);
54
55 `$hookname` is a string and corresponds to a known Friendica PHP hook.
56
57 `$file` is a pathname relative to the top-level Friendica directory.
58 This *should* be 'addon/*addon_name*/*addon_name*.php' in most cases and can be shortened to `__FILE__`.
59
60 `$function` is a string and is the name of the function which will be executed when the hook is called.
61
62 ### Arguments
63 Your hook callback functions will be called with at most one argument
64
65     function <addon>_<hookname>(&$b) {
66
67     }
68
69 If you wish to make changes to the calling data, you must declare them as reference variables (with `&`) during function declaration.
70
71 #### $b
72 $b can be called anything you like.
73 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.
74 Remember to declare it with `&` if you wish to alter it.
75
76 ## Admin settings
77
78 Your addon can provide user-specific settings via the `addon_settings` PHP hook, but it can also provide node-wide settings in the administration page of your addon.
79
80 Simply declare a `<addon>_addon_admin()` function to display the form and a `<addon>_addon_admin_post()` function to process the data from the form.0
81
82 ## Global stylesheets
83
84 If your addon requires adding a stylesheet on all pages of Friendica, add the following hook:
85
86 ```php
87 function <addon>_install()
88 {
89         \Friendica\Core\Hook::register('head', __FILE__, '<addon>_head');
90         ...
91 }
92
93
94 function <addon>_head()
95 {
96         \Friendica\DI::page()->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css');
97 }
98 ```
99
100 `__DIR__` is the folder path of your addon.
101
102 ## JavaScript
103
104 ### Global scripts
105
106 If your addon requires adding a script on all pages of Friendica, add the following hook:
107
108
109 ```php
110 function <addon>_install()
111 {
112         \Friendica\Core\Hook::register('footer', __FILE__, '<addon>_footer');
113         ...
114 }
115
116 function <addon>_footer()
117 {
118         \Friendica\DI::page()->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js');
119 }
120 ```
121
122 `__DIR__` is the folder path of your addon.
123
124 ### JavaScript hooks
125
126 The main Friendica script provides hooks via events dispatched on the `document` property.
127 In your JavaScript file included as described above, add your event listener like this:
128
129 ```js
130 document.addEventListener(name, callback);
131 ```
132
133 - *name* is the name of the hook and corresponds to a known Friendica JavaScript hook.
134 - *callback* is a JavaScript anonymous function to execute.
135
136 More info about JavaScript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
137
138 #### Current JavaScript hooks
139
140 ##### postprocess_liveupdate
141 Called at the end of the live update process (XmlHttpRequest) and on a post preview.
142 No additional data is provided.
143
144 ## Modules
145
146 Addons may also act as "modules" and intercept all page requests for a given URL path.
147 In order for a addon to act as a module it needs to declare an empty function `<addon>_module()`.
148
149 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.
150 These are parsed into the `App\Arguments` object.
151 So `https://my.web.site/addon/arg1/arg2` would give this:
152 ```php
153 DI::args()->getArgc(); // = 3
154 DI::args()->get(0); // = 'addon'
155 DI::args()->get(1); // = 'arg1'
156 DI::args()->get(2); // = 'arg2'
157 ```
158
159 To display a module page, you need to declare the function `<addon>_content()`, which defines and returns the page body content.
160 They may also contain `<addon>_post()` which is called before the `<addon>_content` function and typically handles the results of POST forms.
161 You may also have `<addon>_init()` which is called before `<addon>_content` and should include common logic to your module.
162
163 ## Templates
164
165 If your addon needs some template, you can use the Friendica template system.
166 Friendica uses [smarty3](http://www.smarty.net/) as a template engine.
167
168 Put your tpl files in the *templates/* subfolder of your addon.
169
170 In your code, like in the function addon_name_content(), load the template file and execute it passing needed values:
171
172 ```php
173 use Friendica\Core\Renderer;
174
175 # load template file. first argument is the template name,
176 # second is the addon path relative to friendica top folder
177 $tpl = Renderer::getMarkupTemplate('mytemplate.tpl', __DIR__);
178
179 # apply template. first argument is the loaded template,
180 # second an array of 'name' => 'values' to pass to template
181 $output = Renderer::replaceMacros($tpl, array(
182         'title' => 'My beautiful addon',
183 ));
184 ```
185
186 See also the wiki page [Quick Template Guide](https://github.com/friendica/friendica/wiki/Quick-Template-Guide).
187
188 ## Current PHP hooks
189
190 ### authenticate
191 Called when a user attempts to login.
192 `$b` is an array containing:
193
194 - **username**: the supplied username
195 - **password**: the supplied password
196 - **authenticated**: set this to non-zero to authenticate the user.
197 - **user_record**: successful authentication must also return a valid user record from the database
198
199 ### logged_in
200 Called after a user has successfully logged in.
201 `$b` contains the `App->user` array.
202
203 ### display_item
204 Called when formatting a post for display.
205 $b is an array:
206
207 - **item**: The item (array) details pulled from the database
208 - **output**: the (string) HTML representation of this item prior to adding it to the page
209
210 ### post_local
211 Called when a status post or comment is entered on the local system.
212 `$b` is the item array of the information to be stored in the database.
213 Please note: body contents are bbcode - not HTML.
214
215 ### post_local_end
216 Called when a local status post or comment has been stored on the local system.
217 `$b` is the item array of the information which has just been stored in the database.
218 Please note: body contents are bbcode - not HTML
219
220 ### post_remote
221 Called when receiving a post from another source. This may also be used to post local activity or system generated messages.
222 `$b` is the item array of information to be stored in the database and the item body is bbcode.
223
224 ### detect_languages
225 Called after the language detection. This can be used for alternative language detection methods.
226 `$data` is an array:
227
228 - **text**: The text that is analyzed.
229 - **detected**: (input/output) Array of language codes detected in the related text. The array key is the language code, the array value the probability.
230 - **uri-id**: The Uri-Id of the item.
231 - **author-id**: The id of the author contact.
232
233 ### addon_settings
234 Called when generating the HTML for the addon settings page.
235 `$data` is an array containing:
236
237 - **addon** (output): Required. The addon folder name.
238 - **title** (output): Required. The addon settings panel title.
239 - **href** (output): Optional. If set, will reduce the panel to a link pointing to this URL, can be relative. Incompatible with the following keys.
240 - **html** (output): Optional. Raw HTML of the addon form elements. Both the `<form>` tags and the submit buttons are taken care of elsewhere.
241 - **submit** (output): Optional. If unset, a default submit button with `name="<addon name>-submit"` will be generated.
242   Can take different value types:
243   - **string**: The label to replace the default one.
244   - **associative array**: A list of submit button, the key is the value of the `name` attribute, the value is the displayed label.
245     The first submit button in this list is considered the main one and themes might emphasize its display.
246
247 #### Examples
248
249 ##### With link
250 ```php
251 $data = [
252         'addon' => 'advancedcontentfilter',
253         'title' => DI::l10n()->t('Advanced Content Filter'),
254         'href'  => 'advancedcontentfilter',
255 ];
256 ```
257 ##### With default submit button
258 ```php
259 $data = [
260         'addon' => 'fromapp',
261         'title' => DI::l10n()->t('FromApp Settings'),
262         'html'  => $html,
263 ];
264 ```
265 ##### With no HTML, just a submit button
266 ```php
267 $data = [
268         'addon'  => 'opmlexport',
269         'title'  => DI::l10n()->t('OPML Export'),
270         'submit' => DI::l10n()->t('Export RSS/Atom contacts'),
271 ];
272 ```
273 ##### With multiple submit buttons
274 ```php
275 $data = [
276         'addon'  => 'catavatar',
277         'title'  => DI::l10n()->t('Cat Avatar Settings'),
278         'html'   => $html,
279         'submit' => [
280                 'catavatar-usecat'   => DI::l10n()->t('Use Cat as Avatar'),
281                 'catavatar-morecat'  => DI::l10n()->t('Another random Cat!'),
282                 'catavatar-emailcat' => DI::pConfig()->get(Session::getLocalUser(), 'catavatar', 'seed', false) ? DI::l10n()->t('Reset to email Cat') : null,
283         ],
284 ];
285 ```
286
287 ### addon_settings_post
288 Called when the Addon Settings pages are submitted.
289 `$b` is the $_POST array.
290
291 ### connector_settings
292 Called when generating the HTML for a connector addon settings page.
293 `$data` is an array containing:
294
295 - **connector** (output): Required. The addon folder name.
296 - **title** (output): Required. The addon settings panel title.
297 - **image** (output): Required. The relative path of the logo image of the platform/protocol this addon is connecting to, max size 48x48px.
298 - **enabled** (output): Optional. If set to a falsy value, the connector image will be dimmed.
299 - **html** (output): Optional. Raw HTML of the addon form elements. Both the `<form>` tags and the submit buttons are taken care of elsewhere.
300 - **submit** (output): Optional. If unset, a default submit button with `name="<addon name>-submit"` will be generated.
301   Can take different value types:
302     - **string**: The label to replace the default one.
303       - **associative array**: A list of submit button, the key is the value of the `name` attribute, the value is the displayed label.
304         The first submit button in this list is considered the main one and themes might emphasize its display.
305
306 #### Examples
307
308 ##### With default submit button
309 ```php
310 $data = [
311         'connector' => 'diaspora',
312         'title'     => DI::l10n()->t('Diaspora Export'),
313         'image'     => 'images/diaspora-logo.png',
314         'enabled'   => $enabled,
315         'html'      => $html,
316 ];
317 ```
318
319 ##### With custom submit button label and no logo dim
320 ```php
321 $data = [
322         'connector' => 'ifttt',
323         'title'     => DI::l10n()->t('IFTTT Mirror'),
324         'image'     => 'addon/ifttt/ifttt.png',
325         'html'      => $html,
326         'submit'    => DI::l10n()->t('Generate new key'),
327 ];
328 ```
329
330 ##### With conditional submit buttons
331 ```php
332 $submit = ['pumpio-submit' => DI::l10n()->t('Save Settings')];
333 if ($oauth_token && $oauth_token_secret) {
334         $submit['pumpio-delete'] = DI::l10n()->t('Delete this preset');
335 }
336
337 $data = [
338         'connector' => 'pumpio',
339         'title'     => DI::l10n()->t('Pump.io Import/Export/Mirror'),
340         'image'     => 'images/pumpio.png',
341         'enabled'   => $enabled,
342         'html'      => $html,
343         'submit'    => $submit,
344 ];
345 ```
346
347 ### profile_post
348 Called when posting a profile page.
349 `$b` is the $_POST array.
350
351 ### profile_edit
352 Called prior to output of profile edit page.
353 `$b` is an array containing:
354
355 - **profile**: profile (array) record from the database
356 - **entry**: the (string) HTML of the generated entry
357
358 ### profile_advanced
359 Called when the HTML is generated for the Advanced profile, corresponding to the Profile tab within a person's profile page.
360 `$b` is the HTML string representation of the generated profile.
361 The profile array details are in `App->profile`.
362
363 ### directory_item
364 Called from the Directory page when formatting an item for display.
365 `$b` is an array:
366
367 - **contact**: contact record array for the person from the database
368 - **entry**: the HTML string of the generated entry
369
370 ### profile_sidebar_enter
371 Called prior to generating the sidebar "short" profile for a page.
372 `$b` is the person's profile array
373
374 ### profile_sidebar
375 Called when generating the sidebar "short" profile for a page.
376 `$b` is an array:
377
378 - **profile**: profile record array for the person from the database
379 - **entry**: the HTML string of the generated entry
380
381 ### contact_block_end
382 Called when formatting the block of contacts/friends on a profile sidebar has completed.
383 `$b` is an array:
384
385 - **contacts**: array of contacts
386 - **output**: the generated HTML string of the contact block
387
388 ### bbcode
389 Called after conversion of bbcode to HTML.
390 `$b` is an HTML string converted text.
391
392 ### html2bbcode
393 Called after tag conversion of HTML to bbcode (e.g. remote message posting)
394 `$b` is a string converted text
395
396 ### head
397 Called when building the `<head>` sections.
398 Stylesheets should be registered using this hook.
399 `$b` is an HTML string of the `<head>` tag.
400
401 ### page_header
402 Called after building the page navigation section.
403 `$b` is a string HTML of nav region.
404
405 ### personal_xrd
406 Called prior to output of personal XRD file.
407 `$b` is an array:
408
409 - **user**: the user record array for the person
410 - **xml**: the complete XML string to be output
411
412 ### home_content
413 Called prior to output home page content, shown to unlogged users.
414 `$b` is the HTML string of section region.
415
416 ### contact_edit
417 Called when editing contact details on an individual from the Contacts page.
418 $b is an array:
419
420 - **contact**: contact record (array) of target contact
421 - **output**: the (string) generated HTML of the contact edit page
422
423 ### contact_edit_post
424 Called when posting the contact edit page.
425 `$b` is the `$_POST` array
426
427 ### init_1
428 Called just after DB has been opened and before session start.
429 No hook data.
430
431 ### page_end
432 Called after HTML content functions have completed.
433 `$b` is (string) HTML of content div.
434
435 ### footer
436 Called after HTML content functions have completed.
437 Deferred JavaScript files should be registered using this hook.
438 `$b` is (string) HTML of footer div/element.
439
440 ### avatar_lookup
441 Called when looking up the avatar. `$b` is an array:
442
443 - **size**: the size of the avatar that will be looked up
444 - **email**: email to look up the avatar for
445 - **url**: the (string) generated URL of the avatar
446
447 ### emailer_send_prepare
448 Called from `Emailer::send()` before building the mime message.
449 `$b` is an array of params to `Emailer::send()`.
450
451 - **fromName**: name of the sender
452 - **fromEmail**: email fo the sender
453 - **replyTo**: replyTo address to direct responses
454 - **toEmail**: destination email address
455 - **messageSubject**: subject of the message
456 - **htmlVersion**: html version of the message
457 - **textVersion**: text only version of the message
458 - **additionalMailHeader**: additions to the smtp mail header
459 - **sent**: default false, if set to true in the hook, the default mailer will be skipped.
460
461 ### emailer_send
462 Called before calling PHP's `mail()`.
463 `$b` is an array of params to `mail()`.
464
465 - **to**
466 - **subject**
467 - **body**
468 - **headers**
469 - **sent**: default false, if set to true in the hook, the default mailer will be skipped.
470
471 ### load_config
472 Called during `App` initialization to allow addons to load their own configuration file(s) with `App::loadConfigFile()`.
473
474 ### nav_info
475 Called after the navigational menu is build in `include/nav.php`.
476 `$b` is an array containing `$nav` from `include/nav.php`.
477
478 ### template_vars
479 Called before vars are passed to the template engine to render the page.
480 The registered function can add,change or remove variables passed to template.
481 `$b` is an array with:
482
483 - **template**: filename of template
484 - **vars**: array of vars passed to the template
485
486 ### acl_lookup_end
487 Called after the other queries have passed.
488 The registered function can add, change or remove the `acl_lookup()` variables.
489
490 - **results**: array of the acl_lookup() vars
491
492 ### prepare_body_init
493 Called at the start of prepare_body
494 Hook data:
495
496 - **item** (input/output): item array
497
498 ### prepare_body_content_filter
499 Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should
500 just add the reason to the filter_reasons element of the hook data.
501 Hook data:
502
503 - **item**: item array (input)
504 - **filter_reasons** (input/output): reasons array
505
506 ### prepare_body
507 Called after the HTML conversion in `prepare_body()`.
508 Hook data:
509
510 - **item** (input): item array
511 - **html** (input/output): converted item body
512 - **is_preview** (input): post preview flag
513 - **filter_reasons** (input): reasons array
514
515 ### prepare_body_final
516 Called at the end of `prepare_body()`.
517 Hook data:
518
519 - **item**: item array (input)
520 - **html**: converted item body (input/output)
521
522 ### put_item_in_cache
523 Called after `prepare_text()` in `put_item_in_cache()`.
524 Hook data:
525
526 - **item** (input): item array
527 - **rendered-html** (input/output): final item body HTML
528 - **rendered-hash** (input/output): original item body hash
529
530 ### magic_auth_success
531 Called when a magic-auth was successful.
532 Hook data:
533
534     visitor => array with the contact record of the visitor
535     url => the query string
536
537 ### jot_networks
538 Called when displaying the post permission screen.
539 Hook data is a list of form fields that need to be displayed along the ACL.
540 Form field array structure is:
541
542 - **type**: `checkbox` or `select`.
543 - **field**: Standard field data structure to be used by `field_checkbox.tpl` and `field_select.tpl`.
544
545 For `checkbox`, **field** is:
546   - [0] (String): Form field name; Mandatory.
547   - [1]: (String): Form field label; Optional, default is none.
548   - [2]: (Boolean): Whether the checkbox should be checked by default; Optional, default is false.
549   - [3]: (String): Additional help text; Optional, default is none.
550   - [4]: (String): Additional HTML attributes; Optional, default is none.
551
552 For `select`, **field** is:
553   - [0] (String): Form field name; Mandatory.
554   - [1] (String): Form field label; Optional, default is none.
555   - [2] (Boolean): Default value to be selected by default; Optional, default is none.
556   - [3] (String): Additional help text; Optional, default is none.
557   - [4] (Array): Associative array of options. Item key is option value, item value is option label; Mandatory.
558
559 ### route_collection
560 Called just before dispatching the router.
561 Hook data is a `\FastRoute\RouterCollector` object that should be used to add addon routes pointing to classes.
562
563 **Notice**: The class whose name is provided in the route handler must be reachable via auto-loader.
564
565 ### probe_detect
566
567 Called before trying to detect the target network of a URL.
568 If any registered hook function sets the `result` key of the hook data array, it will be returned immediately.
569 Hook functions should also return immediately if the hook data contains an existing result.
570
571 Hook data:
572
573 - **uri** (input): the profile URI.
574 - **network** (input): the target network (can be empty for auto-detection).
575 - **uid** (input): the user to return the contact data for (can be empty for public contacts).
576 - **result** (output): Leave null if address isn't relevant to the connector, set to contact array if probe is successful, false otherwise.
577
578 ### item_by_link
579
580 Called when trying to probe an item from a given URI.
581 If any registered hook function sets the `item_id` key of the hook data array, it will be returned immediately.
582 Hook functions should also return immediately if the hook data contains an existing `item_id`.
583
584 Hook data:
585 - **uri** (input): the item URI.
586 - **uid** (input): the user to return the item data for (can be empty for public contacts).
587 - **item_id** (output): Leave null if URI isn't relevant to the connector, set to created item array if probe is successful, false otherwise.
588
589 ### support_follow
590
591 Called to assert whether a connector addon provides follow capabilities.
592
593 Hook data:
594 - **protocol** (input): shorthand for the protocol. List of values is available in `src/Core/Protocol.php`.
595 - **result** (output): should be true if the connector provides follow capabilities, left alone otherwise.
596
597 ### support_revoke_follow
598
599 Called to assert whether a connector addon provides follow revocation capabilities.
600
601 Hook data:
602 - **protocol** (input): shorthand for the protocol. List of values is available in `src/Core/Protocol.php`.
603 - **result** (output): should be true if the connector provides follow revocation capabilities, left alone otherwise.
604
605 ### follow
606
607 Called before adding a new contact for a user to handle non-native network remote contact (like Twitter).
608
609 Hook data:
610
611 - **url** (input): URL of the remote contact.
612 - **contact** (output): should be filled with the contact (with uid = user creating the contact) array if follow was successful.
613
614 ### unfollow
615
616 Called when unfollowing a remote contact on a non-native network (like Twitter)
617
618 Hook data:
619 - **contact** (input): the target public contact (uid = 0) array.
620 - **uid** (input): the id of the source local user.
621 - **result** (output): wether the unfollowing is successful or not.
622
623 ### revoke_follow
624
625 Called when making a remote contact on a non-native network (like Twitter) unfollow you.
626
627 Hook data:
628 - **contact** (input): the target public contact (uid = 0) array.
629 - **uid** (input): the id of the source local user.
630 - **result** (output): a boolean value indicating wether the operation was successful or not.
631
632 ### block
633
634 Called when blocking a remote contact on a non-native network (like Twitter).
635
636 Hook data:
637 - **contact** (input): the remote contact (uid = 0) array.
638 - **uid** (input): the user id to issue the block for.
639 - **result** (output): a boolean value indicating wether the operation was successful or not.
640
641 ### unblock
642
643 Called when unblocking a remote contact on a non-native network (like Twitter).
644
645 Hook data:
646 - **contact** (input): the remote contact (uid = 0) array.
647 - **uid** (input): the user id to revoke the block for.
648 - **result** (output): a boolean value indicating wether the operation was successful or not.
649
650 ### support_probe
651
652 Called to assert whether a connector addon provides probing capabilities.
653
654 Hook data:
655 - **protocol** (input): shorthand for the protocol. List of values is available in `src/Core/Protocol.php`.
656 - **result** (output): should be true if the connector provides follow capabilities, left alone otherwise.
657
658 ### storage_instance
659
660 Called when a custom storage is used (e.g. webdav_storage)
661
662 Hook data:
663 - **name** (input): the name of the used storage backend
664 - **data['storage']** (output): the storage instance to use (**must** implement `\Friendica\Core\Storage\IWritableStorage`) 
665
666 ### storage_config
667
668 Called when the admin of the node wants to configure a custom storage (e.g. webdav_storage)
669
670 Hook data:
671 - **name** (input): the name of the used storage backend
672 - **data['storage_config']** (output): the storage configuration instance to use (**must** implement `\Friendica\Core\Storage\Capability\IConfigureStorage`)
673
674 ## Complete list of hook callbacks
675
676 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.
677
678 ### index.php
679
680     Hook::callAll('init_1');
681     Hook::callAll('app_menu', $arr);
682     Hook::callAll('page_content_top', DI::page()['content']);
683     Hook::callAll($a->module.'_mod_init', $placeholder);
684     Hook::callAll($a->module.'_mod_init', $placeholder);
685     Hook::callAll($a->module.'_mod_post', $_POST);
686     Hook::callAll($a->module.'_mod_content', $arr);
687     Hook::callAll($a->module.'_mod_aftercontent', $arr);
688     Hook::callAll('page_end', DI::page()['content']);
689
690 ### include/api.php
691
692     Hook::callAll('logged_in', $a->user);
693     Hook::callAll('authenticate', $addon_auth);
694     Hook::callAll('logged_in', $a->user);
695
696 ### include/enotify.php
697
698     Hook::callAll('enotify', $h);
699     Hook::callAll('enotify_store', $datarray);
700     Hook::callAll('enotify_mail', $datarray);
701     Hook::callAll('check_item_notification', $notification_data);
702
703 ### src/Content/Conversation.php
704
705     Hook::callAll('conversation_start', $cb);
706     Hook::callAll('render_location', $locate);
707     Hook::callAll('display_item', $arr);
708     Hook::callAll('display_item', $arr);
709     Hook::callAll('item_photo_menu', $args);
710     Hook::callAll('jot_tool', $jotplugins);
711
712 ### mod/directory.php
713
714     Hook::callAll('directory_item', $arr);
715
716 ### mod/xrd.php
717
718     Hook::callAll('personal_xrd', $arr);
719
720 ### mod/parse_url.php
721
722     Hook::callAll("parse_link", $arr);
723
724 ### src/Module/Delegation.php
725
726     Hook::callAll('home_init', $ret);
727
728 ### mod/acl.php
729
730     Hook::callAll('acl_lookup_end', $results);
731
732 ### mod/network.php
733
734     Hook::callAll('network_content_init', $arr);
735     Hook::callAll('network_tabs', $arr);
736
737 ### mod/friendica.php
738
739     Hook::callAll('about_hook', $o);
740
741 ### mod/profiles.php
742
743     Hook::callAll('profile_post', $_POST);
744     Hook::callAll('profile_edit', $arr);
745
746 ### mod/settings.php
747
748     Hook::callAll('addon_settings_post', $_POST);
749     Hook::callAll('connector_settings_post', $_POST);
750     Hook::callAll('display_settings_post', $_POST);
751     Hook::callAll('addon_settings', $settings_addons);
752     Hook::callAll('connector_settings', $settings_connectors);
753     Hook::callAll('display_settings', $o);
754
755 ### mod/photos.php
756
757     Hook::callAll('photo_post_init', $_POST);
758     Hook::callAll('photo_post_file', $ret);
759     Hook::callAll('photo_post_end', $foo);
760     Hook::callAll('photo_post_end', $foo);
761     Hook::callAll('photo_post_end', $foo);
762     Hook::callAll('photo_post_end', $foo);
763     Hook::callAll('photo_post_end', intval($item_id));
764     Hook::callAll('photo_upload_form', $ret);
765
766 ### mod/profile.php
767
768     Hook::callAll('profile_advanced', $o);
769
770 ### mod/home.php
771
772     Hook::callAll('home_init', $ret);
773     Hook::callAll("home_content", $content);
774
775 ### mod/contacts.php
776
777     Hook::callAll('contact_edit_post', $_POST);
778     Hook::callAll('contact_edit', $arr);
779
780 ### mod/tagger.php
781
782     Hook::callAll('post_local_end', $arr);
783
784 ### mod/uexport.php
785
786     Hook::callAll('uexport_options', $options);
787
788 ### mod/register.php
789
790     Hook::callAll('register_post', $arr);
791     Hook::callAll('register_form', $arr);
792
793 ### mod/item.php
794
795     Hook::callAll('post_local_start', $_REQUEST);
796     Hook::callAll('post_local', $datarray);
797     Hook::callAll('post_local_end', $datarray);
798
799 ### src/Render/FriendicaSmartyEngine.php
800
801     Hook::callAll("template_vars", $arr);
802
803 ### src/App.php
804
805     Hook::callAll('load_config');
806     Hook::callAll('head');
807     Hook::callAll('footer');
808     Hook::callAll('route_collection');
809
810 ### src/Model/Item.php
811
812     Hook::callAll('detect_languages', $item);
813     Hook::callAll('post_local', $item);
814     Hook::callAll('post_remote', $item);
815     Hook::callAll('post_local_end', $posted_item);
816     Hook::callAll('post_remote_end', $posted_item);
817     Hook::callAll('tagged', $arr);
818     Hook::callAll('post_local_end', $new_item);
819     Hook::callAll('put_item_in_cache', $hook_data);
820     Hook::callAll('prepare_body_init', $item);
821     Hook::callAll('prepare_body_content_filter', $hook_data);
822     Hook::callAll('prepare_body', $hook_data);
823     Hook::callAll('prepare_body_final', $hook_data);
824
825 ### src/Model/Contact.php
826
827     Hook::callAll('contact_photo_menu', $args);
828     Hook::callAll('follow', $arr);
829
830 ### src/Model/Profile.php
831
832     Hook::callAll('profile_sidebar_enter', $profile);
833     Hook::callAll('profile_sidebar', $arr);
834     Hook::callAll('profile_tabs', $arr);
835     Hook::callAll('zrl_init', $arr);
836     Hook::callAll('magic_auth_success', $arr);
837
838 ### src/Model/Event.php
839
840     Hook::callAll('event_updated', $event['id']);
841     Hook::callAll("event_created", $event['id']);
842
843 ### src/Model/Register.php
844
845     Hook::callAll('authenticate', $addon_auth);
846
847 ### src/Model/User.php
848
849     Hook::callAll('authenticate', $addon_auth);
850     Hook::callAll('register_account', $uid);
851     Hook::callAll('remove_user', $user);
852
853 ### src/Module/Notifications/Ping.php
854
855     Hook::callAll('network_ping', $arr);
856
857 ### src/Module/PermissionTooltip.php
858
859     Hook::callAll('lockview_content', $item);
860
861 ### src/Module/Post/Edit.php
862
863     Hook::callAll('jot_tool', $jotplugins);
864
865 ### src/Module/Settings/Delegation.php
866
867     Hook::callAll('authenticate', $addon_auth);
868
869 ### src/Module/Settings/TwoFactor/Index.php
870
871     Hook::callAll('authenticate', $addon_auth);
872
873 ### src/Security/Authenticate.php
874
875     Hook::callAll('authenticate', $addon_auth);
876
877 ### src/Security/ExAuth.php
878
879     Hook::callAll('authenticate', $addon_auth);
880
881 ### src/Content/ContactBlock.php
882
883     Hook::callAll('contact_block_end', $arr);
884
885 ### src/Content/Text/BBCode.php
886
887     Hook::callAll('bbcode', $text);
888     Hook::callAll('bb2diaspora', $text);
889
890 ### src/Content/Text/HTML.php
891
892     Hook::callAll('html2bbcode', $message);
893
894 ### src/Content/Smilies.php
895
896     Hook::callAll('smilie', $params);
897
898 ### src/Content/Feature.php
899
900     Hook::callAll('isEnabled', $arr);
901     Hook::callAll('get', $arr);
902
903 ### src/Content/ContactSelector.php
904
905     Hook::callAll('network_to_name', $nets);
906
907 ### src/Content/OEmbed.php
908
909     Hook::callAll('oembed_fetch_url', $embedurl, $j);
910
911 ### src/Content/Nav.php
912
913     Hook::callAll('page_header', DI::page()['nav']);
914     Hook::callAll('nav_info', $nav);
915
916 ### src/Core/Authentication.php
917
918     Hook::callAll('logged_in', $a->user);
919
920 ### src/Core/Protocol.php
921
922     Hook::callAll('support_follow', $hook_data);
923     Hook::callAll('support_revoke_follow', $hook_data);
924     Hook::callAll('unfollow', $hook_data);
925     Hook::callAll('revoke_follow', $hook_data);
926     Hook::callAll('block', $hook_data);
927     Hook::callAll('unblock', $hook_data);
928     Hook::callAll('support_probe', $hook_data);
929
930 ### src/Core/Logger/Factory.php
931
932     Hook::callAll('logger_instance', $data);
933
934 ### src/Core/StorageManager
935
936     Hook::callAll('storage_instance', $data);
937     Hook::callAll('storage_config', $data);
938
939 ### src/Worker/Directory.php
940
941     Hook::callAll('globaldir_update', $arr);
942
943 ### src/Worker/Notifier.php
944
945     Hook::callAll('notifier_end', $target_item);
946
947 ### src/Module/Login.php
948
949     Hook::callAll('login_hook', $o);
950
951 ### src/Module/Logout.php
952
953     Hook::callAll("logging_out");
954
955 ### src/Object/Post.php
956
957     Hook::callAll('render_location', $locate);
958     Hook::callAll('display_item', $arr);
959
960 ### src/Core/ACL.php
961
962     Hook::callAll('contact_select_options', $x);
963     Hook::callAll($a->module.'_pre_'.$selname, $arr);
964     Hook::callAll($a->module.'_post_'.$selname, $o);
965     Hook::callAll($a->module.'_pre_'.$selname, $arr);
966     Hook::callAll($a->module.'_post_'.$selname, $o);
967     Hook::callAll('jot_networks', $jotnets);
968
969 ### src/Core/Authentication.php
970
971     Hook::callAll('logged_in', $a->user);
972     Hook::callAll('authenticate', $addon_auth);
973
974 ### src/Core/Hook.php
975
976     self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata);
977
978 ### src/Core/Worker.php
979
980     Hook::callAll("proc_run", $arr);
981
982 ### src/Util/Emailer.php
983
984     Hook::callAll('emailer_send_prepare', $params);
985     Hook::callAll("emailer_send", $hookdata);
986
987 ### src/Util/Map.php
988
989     Hook::callAll('generate_map', $arr);
990     Hook::callAll('generate_named_map', $arr);
991     Hook::callAll('Map::getCoordinates', $arr);
992
993 ### src/Util/Network.php
994
995     Hook::callAll('avatar_lookup', $avatar);
996
997 ### src/Util/ParseUrl.php
998
999     Hook::callAll("getsiteinfo", $siteinfo);
1000
1001 ### src/Protocol/DFRN.php
1002
1003     Hook::callAll('atom_feed_end', $atom);
1004     Hook::callAll('atom_feed_end', $atom);
1005
1006 ### src/Protocol/Email.php
1007
1008     Hook::callAll('email_getmessage', $message);
1009     Hook::callAll('email_getmessage_end', $ret);
1010
1011 ### view/js/main.js
1012
1013     document.dispatchEvent(new Event('postprocess_liveupdate'));