]> git.mxchange.org Git - friendica.git/blob - doc/Addons.md
Rewrite JS hooks
[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 Addon names cannot contain spaces or other punctuation and are used as filenames and function names.
11 You may supply a "friendly" name within the comment block.
12 Each addon must contain both an install and an uninstall function based on the addon name.
13 For instance "addon1name_install()".
14 These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your addon will require.
15 The install and uninstall functions will also be called (i.e. re-installed) if the addon changes after installation.
16 Therefore your uninstall should not destroy data and install should consider that data may already exist.
17 Future extensions may provide for "setup" amd "remove".
18
19 Addons should contain a comment block with the four following parameters:
20
21     /*
22      * Name: My Great Addon
23      * Description: This is what my addon does. It's really cool.
24      * Version: 1.0
25      * Author: John Q. Public <john@myfriendicasite.com>
26      */
27
28 Please also add a README or README.md file to the addon directory.
29 It will be displayed in the admin panel and should include some further information in addition to the header information.
30
31 ## PHP addon hooks
32
33 Register your addon hooks during installation.
34
35     Addon::registerHook($hookname, $file, $function);
36
37 $hookname is a string and corresponds to a known Friendica PHP hook.
38
39 $file is a pathname relative to the top-level Friendica directory.
40 This *should* be 'addon/*addon_name*/*addon_name*.php' in most cases.
41
42 $function is a string and is the name of the function which will be executed when the hook is called.
43
44 ### Arguments
45 Your hook callback functions will be called with at least one and possibly two arguments
46
47     function myhook_function(App $a, &$b) {
48
49     }
50
51
52 If you wish to make changes to the calling data, you must declare them as reference variables (with `&`) during function declaration.
53
54 #### $a
55 $a is the Friendica `App` class.
56 It contains a wealth of information about the current state of Friendica:
57
58 * which module has been called,
59 * configuration information,
60 * the page contents at the point the hook was invoked,
61 * profile and user information, etc.
62
63 It is recommeded you call this `$a` to match its usage elsewhere.
64
65 #### $b
66 $b can be called anything you like.
67 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.
68 Remember to declare it with `&` if you wish to alter it.
69
70 ## JavaScript addon hooks
71
72 ### PHP part
73
74 Make sure your JavaScript addon file (addon/*addon_name*/*addon_name*.js) is listed in the document response.
75
76 In your addon install function, add:
77
78 ```php
79 Addon::registerHook('template_vars', __FILE__, '<addon_name>_template_vars');
80 ```
81
82 In your addon uninstall function, add:
83
84 ```php
85 Addon::unregisterHook('template_vars', __FILE__, '<addon_name>_template_vars');
86 ```
87
88 Then, add your addon name to the *addon_hooks* template variable array:
89
90 ```php
91 function <addon_name>_template_vars($a, &$arr)
92 {
93         if (!array_key_exists('addon_hooks', $arr['vars']))
94         {
95                 $arr['vars']['addon_hooks'] = array();
96         }
97         $arr['vars']['addon_hooks'][] = "<addon_name>";
98 }
99 ```
100
101 ### JavaScript part
102
103 Register your addon hooks in file `addon/*addon_name*/*addon_name*.js`.
104
105 ```js
106 document.addEventListener(name, callback);
107 ```
108
109 *name* is the name of the hook and corresponds to a known Friendica JavaScript hook.
110 *callback* is a JavaScript function to execute.
111
112 ## Modules
113
114 Addons may also act as "modules" and intercept all page requests for a given URL path.
115 In order for a addon to act as a module it needs to define a function "addon_name_module()" which takes no arguments and needs not do anything.
116
117 If this function exists, you will now receive all page requests for "http://my.web.site/addon_name" - with any number of URL components as additional arguments.
118 These are parsed into an array $a->argv, with a corresponding $a->argc indicating the number of URL components.
119 So http://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).
120 This will include:
121
122 ```php
123 $a->argc = 3
124 $a->argv = array(0 => 'addon', 1 => 'arg1', 2 => 'arg2');
125 ```
126
127 Your module functions will often contain the function addon_name_content(App $a), which defines and returns the page body content.
128 They may also contain addon_name_post(App $a) which is called before the _content function and typically handles the results of POST forms.
129 You may also have addon_name_init(App $a) which is called very early on and often does module initialisation.
130
131 ## Templates
132
133 If your addon needs some template, you can use the Friendica template system.
134 Friendica uses [smarty3](http://www.smarty.net/) as a template engine.
135
136 Put your tpl files in the *templates/* subfolder of your addon.
137
138 In your code, like in the function addon_name_content(), load the template file and execute it passing needed values:
139
140 ```php
141 # load template file. first argument is the template name,
142 # second is the addon path relative to friendica top folder
143 $tpl = get_markup_template('mytemplate.tpl', 'addon/addon_name/');
144
145 # apply template. first argument is the loaded template,
146 # second an array of 'name' => 'values' to pass to template
147 $output = replace_macros($tpl, array(
148         'title' => 'My beautiful addon',
149 ));
150 ```
151
152 See also the wiki page [Quick Template Guide](https://github.com/friendica/friendica/wiki/Quick-Template-Guide).
153
154 ## Current PHP hooks
155
156 ### authenticate
157 Called when a user attempts to login.
158 `$b` is an array containing:
159
160 - **username**: the supplied username
161 - **password**: the supplied password
162 - **authenticated**: set this to non-zero to authenticate the user.
163 - **user_record**: successful authentication must also return a valid user record from the database
164
165 ### logged_in
166 Called after a user has successfully logged in.
167 `$b` contains the `$a->user` array.
168
169 ### display_item
170 Called when formatting a post for display.
171 $b is an array:
172
173 - **item**: The item (array) details pulled from the database
174 - **output**: the (string) HTML representation of this item prior to adding it to the page
175
176 ### post_local
177 Called when a status post or comment is entered on the local system.
178 `$b` is the item array of the information to be stored in the database.
179 Please note: body contents are bbcode - not HTML.
180
181 ### post_local_end
182 Called when a local status post or comment has been stored on the local system.
183 `$b` is the item array of the information which has just been stored in the database.
184 Please note: body contents are bbcode - not HTML
185
186 ### post_remote
187 Called when receiving a post from another source. This may also be used to post local activity or system generated messages.
188 `$b` is the item array of information to be stored in the database and the item body is bbcode.
189
190 ### settings_form
191 Called when generating the HTML for the user Settings page.
192 `$b` is the HTML string of the settings page before the final `</form>` tag.
193
194 ### settings_post
195 Called when the Settings pages are submitted.
196 `$b` is the $_POST array.
197
198 ### addon_settings
199 Called when generating the HTML for the addon settings page.
200 `$b` is the (string) HTML of the addon settings page before the final `</form>` tag.
201
202 ### addon_settings_post
203 Called when the Addon Settings pages are submitted.
204 `$b` is the $_POST array.
205
206 ### profile_post
207 Called when posting a profile page.
208 `$b` is the $_POST array.
209
210 ### profile_edit
211 Called prior to output of profile edit page.
212 `$b` is an array containing:
213
214 - **profile**: profile (array) record from the database
215 - **entry**: the (string) HTML of the generated entry
216
217 ### profile_advanced
218 Called when the HTML is generated for the Advanced profile, corresponding to the Profile tab within a person's profile page.
219 `$b` is the HTML string representation of the generated profile.
220 The profile array details are in `$a->profile`.
221
222 ### directory_item
223 Called from the Directory page when formatting an item for display.
224 `$b` is an array:
225
226 - **contact**: contact record array for the person from the database
227 - **entry**: the HTML string of the generated entry
228
229 ### profile_sidebar_enter
230 Called prior to generating the sidebar "short" profile for a page.
231 `$b` is the person's profile array
232
233 ### profile_sidebar
234 Called when generating the sidebar "short" profile for a page.
235 `$b` is an array:
236
237 - **profile**: profile record array for the person from the database
238 - **entry**: the HTML string of the generated entry
239
240 ### contact_block_end
241 Called when formatting the block of contacts/friends on a profile sidebar has completed.
242 `$b` is an array:
243
244 - **contacts**: array of contacts
245 - **output**: the generated HTML string of the contact block
246
247 ### bbcode
248 Called after conversion of bbcode to HTML.
249 `$b` is an HTML string converted text.
250
251 ### html2bbcode
252 Called after tag conversion of HTML to bbcode (e.g. remote message posting)
253 `$b` is a string converted text
254
255 ### page_header
256 Called after building the page navigation section.
257 `$b` is a string HTML of nav region.
258
259 ### personal_xrd
260 Called prior to output of personal XRD file.
261 `$b` is an array:
262
263 - **user**: the user record array for the person
264 - **xml**: the complete XML string to be output
265
266 ### home_content
267 Called prior to output home page content, shown to unlogged users.
268 `$b` is the HTML sring of section region.
269
270 ### contact_edit
271 Called when editing contact details on an individual from the Contacts page.
272 $b is an array:
273
274 - **contact**: contact record (array) of target contact
275 - **output**: the (string) generated HTML of the contact edit page
276
277 ### contact_edit_post
278 Called when posting the contact edit page.
279 `$b` is the `$_POST` array
280
281 ### init_1
282 Called just after DB has been opened and before session start.
283 No hook data.
284
285 ### page_end
286 Called after HTML content functions have completed.
287 `$b` is (string) HTML of content div.
288
289 ### avatar_lookup
290 Called when looking up the avatar. `$b` is an array:
291
292 - **size**: the size of the avatar that will be looked up
293 - **email**: email to look up the avatar for
294 - **url**: the (string) generated URL of the avatar
295
296 ### emailer_send_prepare
297 Called from `Emailer::send()` before building the mime message.
298 `$b` is an array of params to `Emailer::send()`.
299
300 - **fromName**: name of the sender
301 - **fromEmail**: email fo the sender
302 - **replyTo**: replyTo address to direct responses
303 - **toEmail**: destination email address
304 - **messageSubject**: subject of the message
305 - **htmlVersion**: html version of the message
306 - **textVersion**: text only version of the message
307 - **additionalMailHeader**: additions to the smtp mail header
308
309 ### emailer_send
310 Called before calling PHP's `mail()`.
311 `$b` is an array of params to `mail()`.
312
313 - **to**
314 - **subject**
315 - **body**
316 - **headers**
317
318 ### load_config
319 Called during `App` initialization to allow addons to load their own configuration file(s) with `App::loadConfigFile()`.
320
321 ### nav_info
322 Called after the navigational menu is build in `include/nav.php`.
323 `$b` is an array containing `$nav` from `include/nav.php`.
324
325 ### template_vars
326 Called before vars are passed to the template engine to render the page.
327 The registered function can add,change or remove variables passed to template.
328 `$b` is an array with:
329
330 - **template**: filename of template
331 - **vars**: array of vars passed to the template
332
333 ### acl_lookup_end
334 Called after the other queries have passed.
335 The registered function can add, change or remove the `acl_lookup()` variables.
336
337 - **results**: array of the acl_lookup() vars
338
339 ### prepare_body_init
340 Called at the start of prepare_body
341 Hook data:
342
343 - **item** (input/output): item array
344
345 ### prepare_body_content_filter
346 Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should
347 just add the reason to the filter_reasons element of the hook data.
348 Hook data:
349
350 - **item**: item array (input)
351 - **filter_reasons** (input/output): reasons array
352
353 ### prepare_body
354 Called after the HTML conversion in `prepare_body()`.
355 Hook data:
356
357 - **item** (input): item array
358 - **html** (input/output): converted item body
359 - **is_preview** (input): post preview flag
360 - **filter_reasons** (input): reasons array
361
362 ### prepare_body_final
363 Called at the end of `prepare_body()`.
364 Hook data:
365
366 - **item**: item array (input)
367 - **html**: converted item body (input/output)
368
369 ### put_item_in_cache
370 Called after `prepare_text()` in `put_item_in_cache()`.
371 Hook data:
372
373 - **item** (input): item array
374 - **rendered-html** (input/output): final item body HTML
375 - **rendered-hash** (input/output): original item body hash
376
377 ### magic_auth_success
378 Called when a magic-auth was successful.
379 Hook data:
380
381     visitor => array with the contact record of the visitor
382     url => the query string
383
384 ## Current JavaScript hooks
385
386 ### postprocess_liveupdate
387 Called at the end of the live update process (XmlHttpRequest)
388
389 ## Complete list of hook callbacks
390
391 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.
392
393 ### index.php
394
395     Addon::callHooks('init_1');
396     Addon::callHooks('app_menu', $arr);
397     Addon::callHooks('page_content_top', $a->page['content']);
398     Addon::callHooks($a->module.'_mod_init', $placeholder);
399     Addon::callHooks($a->module.'_mod_init', $placeholder);
400     Addon::callHooks($a->module.'_mod_post', $_POST);
401     Addon::callHooks($a->module.'_mod_afterpost', $placeholder);
402     Addon::callHooks($a->module.'_mod_content', $arr);
403     Addon::callHooks($a->module.'_mod_aftercontent', $arr);
404     Addon::callHooks('page_end', $a->page['content']);
405
406 ### include/api.php
407
408     Addon::callHooks('logged_in', $a->user);
409     Addon::callHooks('authenticate', $addon_auth);
410     Addon::callHooks('logged_in', $a->user);
411
412 ### include/enotify.php
413
414     Addon::callHooks('enotify', $h);
415     Addon::callHooks('enotify_store', $datarray);
416     Addon::callHooks('enotify_mail', $datarray);
417     Addon::callHooks('check_item_notification', $notification_data);
418
419 ### include/conversation.php
420
421     Addon::callHooks('conversation_start', $cb);
422     Addon::callHooks('render_location', $locate);
423     Addon::callHooks('display_item', $arr);
424     Addon::callHooks('display_item', $arr);
425     Addon::callHooks('item_photo_menu', $args);
426     Addon::callHooks('jot_tool', $jotplugins);
427
428 ### include/security.php
429
430     Addon::callHooks('logged_in', $a->user);
431
432 ### include/text.php
433
434     Addon::callHooks('contact_block_end', $arr);
435     Addon::callHooks('poke_verbs', $arr);
436     Addon::callHooks('put_item_in_cache', $hook_data);
437     Addon::callHooks('prepare_body_init', $item);
438     Addon::callHooks('prepare_body_content_filter', $hook_data);
439     Addon::callHooks('prepare_body', $hook_data);
440     Addon::callHooks('prepare_body_final', $hook_data);
441
442 ### include/items.php
443
444     Addon::callHooks('page_info_data', $data);
445
446 ### mod/directory.php
447
448     Addon::callHooks('directory_item', $arr);
449
450 ### mod/xrd.php
451
452     Addon::callHooks('personal_xrd', $arr);
453
454 ### mod/ping.php
455
456     Addon::callHooks('network_ping', $arr);
457
458 ### mod/parse_url.php
459
460     Addon::callHooks("parse_link", $arr);
461
462 ### mod/manage.php
463
464     Addon::callHooks('home_init', $ret);
465
466 ### mod/acl.php
467
468     Addon::callHooks('acl_lookup_end', $results);
469
470 ### mod/network.php
471
472     Addon::callHooks('network_content_init', $arr);
473     Addon::callHooks('network_tabs', $arr);
474
475 ### mod/friendica.php
476
477     Addon::callHooks('about_hook', $o);
478
479 ### mod/subthread.php
480
481     Addon::callHooks('post_local_end', $arr);
482
483 ### mod/profiles.php
484
485     Addon::callHooks('profile_post', $_POST);
486     Addon::callHooks('profile_edit', $arr);
487
488 ### mod/settings.php
489
490     Addon::callHooks('addon_settings_post', $_POST);
491     Addon::callHooks('connector_settings_post', $_POST);
492     Addon::callHooks('display_settings_post', $_POST);
493     Addon::callHooks('settings_post', $_POST);
494     Addon::callHooks('addon_settings', $settings_addons);
495     Addon::callHooks('connector_settings', $settings_connectors);
496     Addon::callHooks('display_settings', $o);
497     Addon::callHooks('settings_form', $o);
498
499 ### mod/photos.php
500
501     Addon::callHooks('photo_post_init', $_POST);
502     Addon::callHooks('photo_post_file', $ret);
503     Addon::callHooks('photo_post_end', $foo);
504     Addon::callHooks('photo_post_end', $foo);
505     Addon::callHooks('photo_post_end', $foo);
506     Addon::callHooks('photo_post_end', $foo);
507     Addon::callHooks('photo_post_end', intval($item_id));
508     Addon::callHooks('photo_upload_form', $ret);
509
510 ### mod/profile.php
511
512     Addon::callHooks('profile_advanced', $o);
513
514 ### mod/home.php
515
516     Addon::callHooks('home_init', $ret);
517     Addon::callHooks("home_content", $content);
518
519 ### mod/poke.php
520
521     Addon::callHooks('post_local_end', $arr);
522
523 ### mod/contacts.php
524
525     Addon::callHooks('contact_edit_post', $_POST);
526     Addon::callHooks('contact_edit', $arr);
527
528 ### mod/tagger.php
529
530     Addon::callHooks('post_local_end', $arr);
531
532 ### mod/lockview.php
533
534     Addon::callHooks('lockview_content', $item);
535
536 ### mod/uexport.php
537
538     Addon::callHooks('uexport_options', $options);
539
540 ### mod/register.php
541
542     Addon::callHooks('register_post', $arr);
543     Addon::callHooks('register_form', $arr);
544
545 ### mod/item.php
546
547     Addon::callHooks('post_local_start', $_REQUEST);
548     Addon::callHooks('post_local', $datarray);
549     Addon::callHooks('post_local_end', $datarray);
550
551 ### mod/editpost.php
552
553     Addon::callHooks('jot_tool', $jotplugins);
554
555 ### src/Network/FKOAuth1.php
556
557     Addon::callHooks('logged_in', $a->user);
558
559 ### src/Render/FriendicaSmartyEngine.php
560
561     Addon::callHooks("template_vars", $arr);
562
563 ### src/App.php
564
565     Addon::callHooks('load_config');
566
567 ### src/Model/Item.php
568
569     Addon::callHooks('post_local', $item);
570     Addon::callHooks('post_remote', $item);
571     Addon::callHooks('post_local_end', $posted_item);
572     Addon::callHooks('post_remote_end', $posted_item);
573     Addon::callHooks('tagged', $arr);
574     Addon::callHooks('post_local_end', $new_item);
575
576 ### src/Model/Contact.php
577
578     Addon::callHooks('contact_photo_menu', $args);
579     Addon::callHooks('follow', $arr);
580
581 ### src/Model/Profile.php
582
583     Addon::callHooks('profile_sidebar_enter', $profile);
584     Addon::callHooks('profile_sidebar', $arr);
585     Addon::callHooks('profile_tabs', $arr);
586     Addon::callHooks('zrl_init', $arr);
587     Addon::callHooks('magic_auth_success', $arr);
588
589 ### src/Model/Event.php
590
591     Addon::callHooks('event_updated', $event['id']);
592     Addon::callHooks("event_created", $event['id']);
593
594 ### src/Model/User.php
595
596     Addon::callHooks('register_account', $uid);
597     Addon::callHooks('remove_user', $user);
598
599 ### src/Content/Text/BBCode.php
600
601     Addon::callHooks('bbcode', $text);
602     Addon::callHooks('bb2diaspora', $text);
603
604 ### src/Content/Text/HTML.php
605
606     Addon::callHooks('html2bbcode', $message);
607
608 ### src/Content/Smilies.php
609
610     Addon::callHooks('smilie', $params);
611
612 ### src/Content/Feature.php
613
614     Addon::callHooks('isEnabled', $arr);
615     Addon::callHooks('get', $arr);
616
617 ### src/Content/ContactSelector.php
618
619     Addon::callHooks('network_to_name', $nets);
620     Addon::callHooks('gender_selector', $select);
621     Addon::callHooks('sexpref_selector', $select);
622     Addon::callHooks('marital_selector', $select);
623
624 ### src/Content/OEmbed.php
625
626     Addon::callHooks('oembed_fetch_url', $embedurl, $j);
627
628 ### src/Content/Nav.php
629
630     Addon::callHooks('page_header', $a->page['nav']);
631     Addon::callHooks('nav_info', $nav);
632
633 ### src/Worker/Directory.php
634
635     Addon::callHooks('globaldir_update', $arr);
636
637 ### src/Worker/Notifier.php
638
639     Addon::callHooks('notifier_end', $target_item);
640
641 ### src/Worker/Queue.php
642
643     Addon::callHooks('queue_predeliver', $r);
644     Addon::callHooks('queue_deliver', $params);
645
646 ### src/Module/Login.php
647
648     Addon::callHooks('authenticate', $addon_auth);
649     Addon::callHooks('login_hook', $o);
650
651 ### src/Module/Logout.php
652
653     Addon::callHooks("logging_out");
654
655 ### src/Object/Post.php
656
657     Addon::callHooks('render_location', $locate);
658     Addon::callHooks('display_item', $arr);
659
660 ### src/Core/ACL.php
661
662     Addon::callHooks('contact_select_options', $x);
663     Addon::callHooks($a->module.'_pre_'.$selname, $arr);
664     Addon::callHooks($a->module.'_post_'.$selname, $o);
665     Addon::callHooks($a->module.'_pre_'.$selname, $arr);
666     Addon::callHooks($a->module.'_post_'.$selname, $o);
667     Addon::callHooks('jot_networks', $jotnets);
668
669 ### src/Core/Worker.php
670
671     Addon::callHooks("proc_run", $arr);
672
673 ### src/Util/Emailer.php
674
675     Addon::callHooks('emailer_send_prepare', $params);
676     Addon::callHooks("emailer_send", $hookdata);
677
678 ### src/Util/Map.php
679
680     Addon::callHooks('generate_map', $arr);
681     Addon::callHooks('generate_named_map', $arr);
682     Addon::callHooks('Map::getCoordinates', $arr);
683
684 ### src/Util/Network.php
685
686     Addon::callHooks('avatar_lookup', $avatar);
687
688 ### src/Util/ParseUrl.php
689
690     Addon::callHooks("getsiteinfo", $siteinfo);
691
692 ### src/Protocol/DFRN.php
693
694     Addon::callHooks('atom_feed_end', $atom);
695     Addon::callHooks('atom_feed_end', $atom);
696
697 ### view/js/main.js
698
699     document.dispatchEvent(new Event('postprocess_liveupdate'));