]> git.mxchange.org Git - friendica.git/blob - doc/Addons.md
Add new footer hook
[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 ### footer
290 Called after HTML content functions have completed.
291 `$b` is (string) HTML of footer div/element.
292 Used to load deferred Javascript files.
293
294 ### avatar_lookup
295 Called when looking up the avatar. `$b` is an array:
296
297 - **size**: the size of the avatar that will be looked up
298 - **email**: email to look up the avatar for
299 - **url**: the (string) generated URL of the avatar
300
301 ### emailer_send_prepare
302 Called from `Emailer::send()` before building the mime message.
303 `$b` is an array of params to `Emailer::send()`.
304
305 - **fromName**: name of the sender
306 - **fromEmail**: email fo the sender
307 - **replyTo**: replyTo address to direct responses
308 - **toEmail**: destination email address
309 - **messageSubject**: subject of the message
310 - **htmlVersion**: html version of the message
311 - **textVersion**: text only version of the message
312 - **additionalMailHeader**: additions to the smtp mail header
313
314 ### emailer_send
315 Called before calling PHP's `mail()`.
316 `$b` is an array of params to `mail()`.
317
318 - **to**
319 - **subject**
320 - **body**
321 - **headers**
322
323 ### load_config
324 Called during `App` initialization to allow addons to load their own configuration file(s) with `App::loadConfigFile()`.
325
326 ### nav_info
327 Called after the navigational menu is build in `include/nav.php`.
328 `$b` is an array containing `$nav` from `include/nav.php`.
329
330 ### template_vars
331 Called before vars are passed to the template engine to render the page.
332 The registered function can add,change or remove variables passed to template.
333 `$b` is an array with:
334
335 - **template**: filename of template
336 - **vars**: array of vars passed to the template
337
338 ### acl_lookup_end
339 Called after the other queries have passed.
340 The registered function can add, change or remove the `acl_lookup()` variables.
341
342 - **results**: array of the acl_lookup() vars
343
344 ### prepare_body_init
345 Called at the start of prepare_body
346 Hook data:
347
348 - **item** (input/output): item array
349
350 ### prepare_body_content_filter
351 Called before the HTML conversion in prepare_body. If the item matches a content filter rule set by an addon, it should
352 just add the reason to the filter_reasons element of the hook data.
353 Hook data:
354
355 - **item**: item array (input)
356 - **filter_reasons** (input/output): reasons array
357
358 ### prepare_body
359 Called after the HTML conversion in `prepare_body()`.
360 Hook data:
361
362 - **item** (input): item array
363 - **html** (input/output): converted item body
364 - **is_preview** (input): post preview flag
365 - **filter_reasons** (input): reasons array
366
367 ### prepare_body_final
368 Called at the end of `prepare_body()`.
369 Hook data:
370
371 - **item**: item array (input)
372 - **html**: converted item body (input/output)
373
374 ### put_item_in_cache
375 Called after `prepare_text()` in `put_item_in_cache()`.
376 Hook data:
377
378 - **item** (input): item array
379 - **rendered-html** (input/output): final item body HTML
380 - **rendered-hash** (input/output): original item body hash
381
382 ### magic_auth_success
383 Called when a magic-auth was successful.
384 Hook data:
385
386     visitor => array with the contact record of the visitor
387     url => the query string
388
389 ## Current JavaScript hooks
390
391 ### postprocess_liveupdate
392 Called at the end of the live update process (XmlHttpRequest)
393
394 ## Complete list of hook callbacks
395
396 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.
397
398 ### index.php
399
400     Addon::callHooks('init_1');
401     Addon::callHooks('app_menu', $arr);
402     Addon::callHooks('page_content_top', $a->page['content']);
403     Addon::callHooks($a->module.'_mod_init', $placeholder);
404     Addon::callHooks($a->module.'_mod_init', $placeholder);
405     Addon::callHooks($a->module.'_mod_post', $_POST);
406     Addon::callHooks($a->module.'_mod_afterpost', $placeholder);
407     Addon::callHooks($a->module.'_mod_content', $arr);
408     Addon::callHooks($a->module.'_mod_aftercontent', $arr);
409     Addon::callHooks('page_end', $a->page['content']);
410
411 ### include/api.php
412
413     Addon::callHooks('logged_in', $a->user);
414     Addon::callHooks('authenticate', $addon_auth);
415     Addon::callHooks('logged_in', $a->user);
416
417 ### include/enotify.php
418
419     Addon::callHooks('enotify', $h);
420     Addon::callHooks('enotify_store', $datarray);
421     Addon::callHooks('enotify_mail', $datarray);
422     Addon::callHooks('check_item_notification', $notification_data);
423
424 ### include/conversation.php
425
426     Addon::callHooks('conversation_start', $cb);
427     Addon::callHooks('render_location', $locate);
428     Addon::callHooks('display_item', $arr);
429     Addon::callHooks('display_item', $arr);
430     Addon::callHooks('item_photo_menu', $args);
431     Addon::callHooks('jot_tool', $jotplugins);
432
433 ### include/security.php
434
435     Addon::callHooks('logged_in', $a->user);
436
437 ### include/text.php
438
439     Addon::callHooks('contact_block_end', $arr);
440     Addon::callHooks('poke_verbs', $arr);
441     Addon::callHooks('put_item_in_cache', $hook_data);
442     Addon::callHooks('prepare_body_init', $item);
443     Addon::callHooks('prepare_body_content_filter', $hook_data);
444     Addon::callHooks('prepare_body', $hook_data);
445     Addon::callHooks('prepare_body_final', $hook_data);
446
447 ### include/items.php
448
449     Addon::callHooks('page_info_data', $data);
450
451 ### mod/directory.php
452
453     Addon::callHooks('directory_item', $arr);
454
455 ### mod/xrd.php
456
457     Addon::callHooks('personal_xrd', $arr);
458
459 ### mod/ping.php
460
461     Addon::callHooks('network_ping', $arr);
462
463 ### mod/parse_url.php
464
465     Addon::callHooks("parse_link", $arr);
466
467 ### mod/manage.php
468
469     Addon::callHooks('home_init', $ret);
470
471 ### mod/acl.php
472
473     Addon::callHooks('acl_lookup_end', $results);
474
475 ### mod/network.php
476
477     Addon::callHooks('network_content_init', $arr);
478     Addon::callHooks('network_tabs', $arr);
479
480 ### mod/friendica.php
481
482     Addon::callHooks('about_hook', $o);
483
484 ### mod/subthread.php
485
486     Addon::callHooks('post_local_end', $arr);
487
488 ### mod/profiles.php
489
490     Addon::callHooks('profile_post', $_POST);
491     Addon::callHooks('profile_edit', $arr);
492
493 ### mod/settings.php
494
495     Addon::callHooks('addon_settings_post', $_POST);
496     Addon::callHooks('connector_settings_post', $_POST);
497     Addon::callHooks('display_settings_post', $_POST);
498     Addon::callHooks('settings_post', $_POST);
499     Addon::callHooks('addon_settings', $settings_addons);
500     Addon::callHooks('connector_settings', $settings_connectors);
501     Addon::callHooks('display_settings', $o);
502     Addon::callHooks('settings_form', $o);
503
504 ### mod/photos.php
505
506     Addon::callHooks('photo_post_init', $_POST);
507     Addon::callHooks('photo_post_file', $ret);
508     Addon::callHooks('photo_post_end', $foo);
509     Addon::callHooks('photo_post_end', $foo);
510     Addon::callHooks('photo_post_end', $foo);
511     Addon::callHooks('photo_post_end', $foo);
512     Addon::callHooks('photo_post_end', intval($item_id));
513     Addon::callHooks('photo_upload_form', $ret);
514
515 ### mod/profile.php
516
517     Addon::callHooks('profile_advanced', $o);
518
519 ### mod/home.php
520
521     Addon::callHooks('home_init', $ret);
522     Addon::callHooks("home_content", $content);
523
524 ### mod/poke.php
525
526     Addon::callHooks('post_local_end', $arr);
527
528 ### mod/contacts.php
529
530     Addon::callHooks('contact_edit_post', $_POST);
531     Addon::callHooks('contact_edit', $arr);
532
533 ### mod/tagger.php
534
535     Addon::callHooks('post_local_end', $arr);
536
537 ### mod/lockview.php
538
539     Addon::callHooks('lockview_content', $item);
540
541 ### mod/uexport.php
542
543     Addon::callHooks('uexport_options', $options);
544
545 ### mod/register.php
546
547     Addon::callHooks('register_post', $arr);
548     Addon::callHooks('register_form', $arr);
549
550 ### mod/item.php
551
552     Addon::callHooks('post_local_start', $_REQUEST);
553     Addon::callHooks('post_local', $datarray);
554     Addon::callHooks('post_local_end', $datarray);
555
556 ### mod/editpost.php
557
558     Addon::callHooks('jot_tool', $jotplugins);
559
560 ### src/Network/FKOAuth1.php
561
562     Addon::callHooks('logged_in', $a->user);
563
564 ### src/Render/FriendicaSmartyEngine.php
565
566     Addon::callHooks("template_vars", $arr);
567
568 ### src/App.php
569
570     Addon::callHooks('load_config');
571     Addon::callHooks('footer');
572
573 ### src/Model/Item.php
574
575     Addon::callHooks('post_local', $item);
576     Addon::callHooks('post_remote', $item);
577     Addon::callHooks('post_local_end', $posted_item);
578     Addon::callHooks('post_remote_end', $posted_item);
579     Addon::callHooks('tagged', $arr);
580     Addon::callHooks('post_local_end', $new_item);
581
582 ### src/Model/Contact.php
583
584     Addon::callHooks('contact_photo_menu', $args);
585     Addon::callHooks('follow', $arr);
586
587 ### src/Model/Profile.php
588
589     Addon::callHooks('profile_sidebar_enter', $profile);
590     Addon::callHooks('profile_sidebar', $arr);
591     Addon::callHooks('profile_tabs', $arr);
592     Addon::callHooks('zrl_init', $arr);
593     Addon::callHooks('magic_auth_success', $arr);
594
595 ### src/Model/Event.php
596
597     Addon::callHooks('event_updated', $event['id']);
598     Addon::callHooks("event_created", $event['id']);
599
600 ### src/Model/User.php
601
602     Addon::callHooks('register_account', $uid);
603     Addon::callHooks('remove_user', $user);
604
605 ### src/Content/Text/BBCode.php
606
607     Addon::callHooks('bbcode', $text);
608     Addon::callHooks('bb2diaspora', $text);
609
610 ### src/Content/Text/HTML.php
611
612     Addon::callHooks('html2bbcode', $message);
613
614 ### src/Content/Smilies.php
615
616     Addon::callHooks('smilie', $params);
617
618 ### src/Content/Feature.php
619
620     Addon::callHooks('isEnabled', $arr);
621     Addon::callHooks('get', $arr);
622
623 ### src/Content/ContactSelector.php
624
625     Addon::callHooks('network_to_name', $nets);
626     Addon::callHooks('gender_selector', $select);
627     Addon::callHooks('sexpref_selector', $select);
628     Addon::callHooks('marital_selector', $select);
629
630 ### src/Content/OEmbed.php
631
632     Addon::callHooks('oembed_fetch_url', $embedurl, $j);
633
634 ### src/Content/Nav.php
635
636     Addon::callHooks('page_header', $a->page['nav']);
637     Addon::callHooks('nav_info', $nav);
638
639 ### src/Worker/Directory.php
640
641     Addon::callHooks('globaldir_update', $arr);
642
643 ### src/Worker/Notifier.php
644
645     Addon::callHooks('notifier_end', $target_item);
646
647 ### src/Worker/Queue.php
648
649     Addon::callHooks('queue_predeliver', $r);
650     Addon::callHooks('queue_deliver', $params);
651
652 ### src/Module/Login.php
653
654     Addon::callHooks('authenticate', $addon_auth);
655     Addon::callHooks('login_hook', $o);
656
657 ### src/Module/Logout.php
658
659     Addon::callHooks("logging_out");
660
661 ### src/Object/Post.php
662
663     Addon::callHooks('render_location', $locate);
664     Addon::callHooks('display_item', $arr);
665
666 ### src/Core/ACL.php
667
668     Addon::callHooks('contact_select_options', $x);
669     Addon::callHooks($a->module.'_pre_'.$selname, $arr);
670     Addon::callHooks($a->module.'_post_'.$selname, $o);
671     Addon::callHooks($a->module.'_pre_'.$selname, $arr);
672     Addon::callHooks($a->module.'_post_'.$selname, $o);
673     Addon::callHooks('jot_networks', $jotnets);
674
675 ### src/Core/Worker.php
676
677     Addon::callHooks("proc_run", $arr);
678
679 ### src/Util/Emailer.php
680
681     Addon::callHooks('emailer_send_prepare', $params);
682     Addon::callHooks("emailer_send", $hookdata);
683
684 ### src/Util/Map.php
685
686     Addon::callHooks('generate_map', $arr);
687     Addon::callHooks('generate_named_map', $arr);
688     Addon::callHooks('Map::getCoordinates', $arr);
689
690 ### src/Util/Network.php
691
692     Addon::callHooks('avatar_lookup', $avatar);
693
694 ### src/Util/ParseUrl.php
695
696     Addon::callHooks("getsiteinfo", $siteinfo);
697
698 ### src/Protocol/DFRN.php
699
700     Addon::callHooks('atom_feed_end', $atom);
701     Addon::callHooks('atom_feed_end', $atom);
702
703 ### view/js/main.js
704
705     document.dispatchEvent(new Event('postprocess_liveupdate'));