1 Friendica Addon/Entwicklung
4 * [Zur Startseite der Hilfe](help)
6 Bitte schau dir das Beispiel-Addon "randplace" für ein funktionierendes Beispiel für manche der hier aufgeführten Funktionen an.
7 Das Facebook-Addon bietet ein Beispiel dafür, die "addon"- und "module"-Funktion gemeinsam zu integrieren.
8 Addons arbeiten, indem sie Event Hooks abfangen.
9 Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden.
11 Addon-Namen können keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt.
12 Du kannst einen lesbaren Namen im Kommentarblock eintragen.
13 Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-Namen basieren; z.B. "addon1name_install()".
14 Diese beiden Funktionen haben keine Argumente und sind dafür verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Addon benötigt.
15 Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgeführt (z.B. neu installiert), wenn sich das Addon nach der Installation ändert - somit sollte deine Deinstallationsfunktion keine Daten zerstört und deine Installationsfunktion sollte bestehende Daten berücksichtigen.
16 Zukünftige Extensions werden möglicherweise "Setup" und "Entfernen" anbieten.
18 Addons sollten einen Kommentarblock mit den folgenden vier Parametern enthalten:
21 * Name: My Great Addon
22 * Description: This is what my addon does. It's really cool.
24 * Author: John Q. Public <john@myfriendicasite.com>
27 Registriere deine Addon-Hooks während der Installation.
29 \Friendica\Core\Hook::register($hookname, $file, $function);
31 $hookname ist ein String und entspricht einem bekannten Friendica-Hook.
33 $file steht für den Pfadnamen, der relativ zum Top-Level-Friendicaverzeichnis liegt.
34 Das *sollte* "addon/addon_name/addon_name.php' sein.
36 $function ist ein String und der Name der Funktion, die ausgeführt wird, wenn der Hook aufgerufen wird.
41 Deine Hook-Callback-Funktion wird mit mindestens einem und bis zu zwei Argumenten aufgerufen
43 function myhook_function(App $a, &$b) {
47 Wenn du Änderungen an den aufgerufenen Daten vornehmen willst, musst du diese als Referenzvariable (mit "&") während der Funktionsdeklaration deklarieren.
49 $a ist die Friendica "App"-Klasse, die eine Menge an Informationen über den aktuellen Friendica-Status beinhaltet, u.a. welche Module genutzt werden, Konfigurationsinformationen, Inhalte der Seite zum Zeitpunkt des Hook-Aufrufs.
50 Es ist empfohlen, diese Funktion "$a" zu nennen, um seine Nutzung an den Gebrauch an anderer Stelle anzugleichen.
52 $b kann frei benannt werden.
53 Diese Information ist speziell auf den Hook bezogen, der aktuell bearbeitet wird, und beinhaltet normalerweise Daten, die du sofort nutzen, anzeigen oder bearbeiten kannst.
54 Achte darauf, diese mit "&" zu deklarieren, wenn du sie bearbeiten willst.
60 Addons können auch als "Module" agieren und alle Seitenanfragen für eine bestimte URL abfangen.
61 Um ein Addon als Modul zu nutzen, ist es nötig, die Funktion "addon_name_module()" zu definieren, die keine Argumente benötigt und nichts weiter machen muss.
63 Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen für "http://example.com/addon_name" erhalten - mit allen URL-Komponenten als zusätzliche Argumente.
64 Diese werden in das App\Arguments Objekt geparst.
65 So würde `http://example.com/addon/arg1/arg2` dies ergeben:
67 DI::args()->getArgc(); // = 3
68 DI::args()->get(0); // = 'addon'
69 DI::args()->get(1); // = 'arg1'
70 DI::args()->get(2); // = 'arg2'
73 Deine Modulfunktionen umfassen oft die Funktion addon_name_content(App $a), welche den Seiteninhalt definiert und zurückgibt.
74 Sie können auch addon_name_post(App $a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt.
75 Du kannst ebenso addon_name_init(App $a) nutzen, was oft frühzeitig aufgerufen wird und das Modul initialisert.
81 **'authenticate'** - wird aufgerufen, wenn sich der User einloggt.
83 'username' => der übertragene Nutzername
84 'password' => das übertragene Passwort
85 'authenticated' => setze das auf einen anderen Wert als "0", damit der User sich authentifiziert
86 'user_record' => die erfolgreiche Authentifizierung muss auch einen gültigen Nutzereintrag aus der Datenbank zurückgeben
88 **'logged_in'** - wird aufgerufen, sobald ein Nutzer sich erfolgreich angemeldet hat.
89 $b beinhaltet den $a->Nutzer-Array
92 **'display_item'** - wird aufgerufen, wenn ein Beitrag für die Anzeige formatiert wird.
94 'item' => Die Item-Details (Array), die von der Datenbank ausgegeben werden
95 'output' => Die HTML-Ausgabe (String) des Items, bevor es zur Seite hinzugefügt wird
97 **'post_local'** - wird aufgerufen, wenn der Statusbeitrag oder ein Kommentar im lokalen System eingetragen wird.
98 $b ist das Item-Array der Information, die in der Datenbank hinterlegt wird.
99 {Bitte beachte: der Seiteninhalt ist bbcode - nicht HTML)
101 **'post_local_end'** - wird aufgerufen, wenn ein lokaler Statusbeitrag oder Kommentar im lokalen System gespeichert wird.
102 $b ist das Item-Array einer Information, die gerade in der Datenbank gespeichert wurden.
103 {Bitte beachte: der Seiteninhalt ist bbcode - nicht HTML)
105 **'post_remote'** - wird aufgerufen, wenn ein Beitrag aus einer anderen Quelle empfangen wird. Dies kann auch genutzt werden, um lokale Aktivitäten oder systemgenerierte Nachrichten zu veröffentlichen/posten.
106 $b ist das Item-Array einer Information, die in der Datenbank und im Item gespeichert ist.
107 {Bitte beachte: der Seiteninhalt ist bbcode - nicht HTML)
109 **'settings_form'** - wird aufgerufen, wenn die HTML-Ausgabe für die Einstellungsseite generiert wird.
110 $b ist die HTML-Ausgabe (String) der Einstellungsseite vor dem finalen "</form>"-Tag.
112 **'settings_post'** - wird aufgerufen, wenn die Einstellungsseiten geladen werden.
113 $b ist der $_POST-Array
115 **'addon_settings'** - wird aufgerufen, wenn die HTML-Ausgabe der Addon-Einstellungsseite generiert wird.
116 $b ist die HTML-Ausgabe (String) der Addon-Einstellungsseite vor dem finalen "</form>"-Tag.
118 **'addon_settings_post'** - wird aufgerufen, wenn die Addon-Einstellungsseite geladen wird.
119 $b ist der $_POST-Array
121 **'profile_post'** - wird aufgerufen, wenn die Profilseite angezeigt wird.
122 $b ist der $_POST-Array
124 **'profile_edit'** - wird aufgerufen, bevor die Profil-Bearbeitungsseite angezeigt wird.
126 'profile' => Profileintrag (Array) aus der Datenbank
127 'entry' => die HTML-Ausgabe (string) des generierten Eintrags
129 **'profile_advanced'** - wird aufgerufen, wenn die HTML-Ausgabe für das "Advanced profile" generiert wird; stimmt mit dem "Profil"-Tab auf der Profilseite der Nutzer überein.
130 $b ist die HTML-Ausgabe (String) des erstellten Profils
131 (Die Details des Profil-Arrays sind in $a->profile)
133 **'directory_item'** - wird von der Verzeichnisseite aufgerufen, wenn ein Item für die Anzeige formatiert wird.
135 'contact' => Kontakteintrag (Array) einer Person aus der Datenbank
136 'entry' => die HTML-Ausgabe (String) des generierten Eintrags
138 **'profile_sidebar_enter'** - wird aufgerufen, bevor die Sidebar "Kurzprofil" einer Seite erstellt wird.
139 $b ist der Profil-Array einer Person
141 **'profile_sidebar'** - wird aufgerufen, wenn die Sidebar "Kurzprofil" einer Seite erstellt wird.
143 'profile' => Kontakteintrag (Array) einer Person aus der Datenbank
144 'entry' => die HTML-Ausgabe (String) des generierten Eintrags
146 **'contact_block_end'** - wird aufgerufen, wenn der Block "Kontakte/Freunde" der Profil-Sidebar komplett formatiert wurde.
148 'contacts' => Array von "contacts"
149 'output' => die HTML-Ausgabe (String) des Kontaktblocks
151 **'bbcode'** - wird während der Umwandlung von bbcode auf HTML aufgerufen.
152 $b ist der konvertierte Text (String)
154 **'html2bbcode'** - wird während der Umwandlung von HTML zu bbcode aufgerufen (z.B. bei Nachrichtenbeiträgen).
155 $b ist der konvertierte Text (String)
157 **'page_header'** - wird aufgerufen, nachdem der Bereich der Seitennavigation geladen wurde.
158 $b ist die HTML-Ausgabe (String) der "nav"-Region
160 **'personal_xrd'** - wird aufgerufen, bevor die Ausgabe der persönlichen XRD-Datei erzeugt wird.
162 'user' => die hinterlegten Einträge der Person
163 'xml' => die komplette XML-Datei die ausgegeben wird
165 **'home_content'** - wird aufgerufen, bevor die Ausgabe des Homepage-Inhalts erstellt wird; wird nicht eingeloggten Nutzern angezeigt.
166 $b ist die HTML-Ausgabe (String) der Auswahlregion
168 **'contact_edit'** - wird aufgerufen, wenn die Kontaktdetails vom Nutzer auf der "Kontakte"-Seite bearbeitet werden.
170 'contact' => Kontakteintrag (Array) des abgezielten Kontakts
171 'output' => die HTML-Ausgabe (String) der "Kontakt bearbeiten"-Seite
173 **'contact_edit_post'** - wird aufgerufen, wenn die "Kontakt bearbeiten"-Seite ausgegeben wird.
174 $b ist der $_POST-Array
176 **'init_1'** - wird aufgerufen, kurz nachdem die Datenbank vor Beginn der Sitzung geöffnet wird.
177 $b wird nicht genutzt
179 **'page_end'** - wird aufgerufen, nachdem die Funktion des HTML-Inhalts komplett abgeschlossen ist.
180 $b ist die HTML-Ausgabe (String) vom Inhalt-"div"
182 **'avatar_lookup'** - wird aufgerufen, wenn der Avatar geladen wird.
184 'size' => Größe des Avatars, der geladen wird
185 'email' => Email-Adresse, um nach dem Avatar zu suchen
186 'url' => generierte URL (String) des Avatars
189 - wird aufgerufen nachdem in include/nav,php der Inhalt des Navigations Menüs erzeugt wurde.
190 - $b ist ein Array, das $nav wiederspiegelt.
192 Komplette Liste der Hook-Callbacks
195 Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 01-Apr-2018 generiert): Bitte schau in die Quellcodes für Details zu Hooks, die oben nicht dokumentiert sind.
199 Hook::callAll('init_1');
200 Hook::callAll('app_menu', $arr);
201 Hook::callAll('page_content_top', DI::page()['content']);
202 Hook::callAll($a->module.'_mod_init', $placeholder);
203 Hook::callAll($a->module.'_mod_init', $placeholder);
204 Hook::callAll($a->module.'_mod_post', $_POST);
205 Hook::callAll($a->module.'_mod_afterpost', $placeholder);
206 Hook::callAll($a->module.'_mod_content', $arr);
207 Hook::callAll($a->module.'_mod_aftercontent', $arr);
208 Hook::callAll('page_end', DI::page()['content']);
212 Hook::callAll('logged_in', $a->user);
213 Hook::callAll('authenticate', $addon_auth);
214 Hook::callAll('logged_in', $a->user);
216 ### include/enotify.php
218 Hook::callAll('enotify', $h);
219 Hook::callAll('enotify_store', $datarray);
220 Hook::callAll('enotify_mail', $datarray);
221 Hook::callAll('check_item_notification', $notification_data);
223 ### src/Content/Conversation.php
225 Hook::callAll('conversation_start', $cb);
226 Hook::callAll('render_location', $locate);
227 Hook::callAll('display_item', $arr);
228 Hook::callAll('display_item', $arr);
229 Hook::callAll('item_photo_menu', $args);
230 Hook::callAll('jot_tool', $jotplugins);
232 ### mod/directory.php
234 Hook::callAll('directory_item', $arr);
238 Hook::callAll('personal_xrd', $arr);
242 Hook::callAll('network_ping', $arr);
244 ### mod/parse_url.php
246 Hook::callAll("parse_link", $arr);
248 ### src/Module/Delegation.php
250 Hook::callAll('home_init', $ret);
254 Hook::callAll('acl_lookup_end', $results);
258 Hook::callAll('network_content_init', $arr);
259 Hook::callAll('network_tabs', $arr);
261 ### mod/friendica.php
263 Hook::callAll('about_hook', $o);
267 Hook::callAll('profile_post', $_POST);
268 Hook::callAll('profile_edit', $arr);
272 Hook::callAll('addon_settings_post', $_POST);
273 Hook::callAll('connector_settings_post', $_POST);
274 Hook::callAll('display_settings_post', $_POST);
275 Hook::callAll('settings_post', $_POST);
276 Hook::callAll('addon_settings', $settings_addons);
277 Hook::callAll('connector_settings', $settings_connectors);
278 Hook::callAll('display_settings', $o);
279 Hook::callAll('settings_form', $o);
283 Hook::callAll('photo_post_init', $_POST);
284 Hook::callAll('photo_post_file', $ret);
285 Hook::callAll('photo_post_end', $foo);
286 Hook::callAll('photo_post_end', $foo);
287 Hook::callAll('photo_post_end', $foo);
288 Hook::callAll('photo_post_end', $foo);
289 Hook::callAll('photo_post_end', intval($item_id));
290 Hook::callAll('photo_upload_form', $ret);
294 Hook::callAll('profile_advanced', $o);
298 Hook::callAll('home_init', $ret);
299 Hook::callAll("home_content", $content);
303 Hook::callAll('post_local_end', $arr);
307 Hook::callAll('contact_edit_post', $_POST);
308 Hook::callAll('contact_edit', $arr);
312 Hook::callAll('post_local_end', $arr);
316 Hook::callAll('uexport_options', $options);
320 Hook::callAll('register_post', $arr);
321 Hook::callAll('register_form', $arr);
325 Hook::callAll('post_local_start', $_REQUEST);
326 Hook::callAll('post_local', $datarray);
327 Hook::callAll('post_local_end', $datarray);
331 Hook::callAll('jot_tool', $jotplugins);
333 ### src/Network/FKOAuth1.php
335 Hook::callAll('logged_in', $a->user);
337 ### src/Render/FriendicaSmartyEngine.php
339 Hook::callAll("template_vars", $arr);
341 ### src/Model/Item.php
343 Hook::callAll('post_local', $item);
344 Hook::callAll('post_remote', $item);
345 Hook::callAll('post_local_end', $posted_item);
346 Hook::callAll('post_remote_end', $posted_item);
347 Hook::callAll('tagged', $arr);
348 Hook::callAll('post_local_end', $new_item);
349 Hook::callAll('put_item_in_cache', $hook_data);
350 Hook::callAll('prepare_body_init', $item);
351 Hook::callAll('prepare_body_content_filter', $hook_data);
352 Hook::callAll('prepare_body', $hook_data);
353 Hook::callAll('prepare_body_final', $hook_data);
355 ### src/Model/Contact.php
357 Hook::callAll('contact_photo_menu', $args);
358 Hook::callAll('follow', $arr);
360 ### src/Model/Profile.php
362 Hook::callAll('profile_sidebar_enter', $profile);
363 Hook::callAll('profile_sidebar', $arr);
364 Hook::callAll('profile_tabs', $arr);
365 Hook::callAll('zrl_init', $arr);
367 ### src/Model/Event.php
369 Hook::callAll('event_updated', $event['id']);
370 Hook::callAll("event_created", $event['id']);
372 ### src/Model/User.php
374 Hook::callAll('register_account', $uid);
375 Hook::callAll('remove_user', $user);
377 ### src/Content/ContactBlock.php
379 Hook::callAll('contact_block_end', $arr);
381 ### src/Content/Text/BBCode.php
383 Hook::callAll('bbcode', $text);
384 Hook::callAll('bb2diaspora', $text);
386 ### src/Content/Text/HTML.php
388 Hook::callAll('html2bbcode', $message);
390 ### src/Content/Smilies.php
392 Hook::callAll('smilie', $params);
394 ### src/Content/Feature.php
396 Hook::callAll('isEnabled', $arr);
397 Hook::callAll('get', $arr);
399 ### src/Content/ContactSelector.php
401 Hook::callAll('network_to_name', $nets);
403 ### src/Content/OEmbed.php
405 Hook::callAll('oembed_fetch_url', $embedurl, $j);
407 ### src/Content/Nav.php
409 Hook::callAll('page_header', DI::page()['nav']);
410 Hook::callAll('nav_info', $nav);
412 ### src/Core/Authentication.php
414 Hook::callAll('logged_in', $a->user);
416 ### src/Core/Protocol.php
418 Hook::callAll('support_follow', $hook_data);
419 Hook::callAll('support_revoke_follow', $hook_data);
420 Hook::callAll('unfollow', $hook_data);
421 Hook::callAll('revoke_follow', $hook_data);
422 Hook::callAll('block', $hook_data);
423 Hook::callAll('unblock', $hook_data);
425 ### src/Core/StorageManager
427 Hook::callAll('storage_instance', $data);
428 Hook::callAll('storage_config', $data);
430 ### src/Module/PermissionTooltip.php
432 Hook::callAll('lockview_content', $item);
434 ### src/Worker/Directory.php
436 Hook::callAll('globaldir_update', $arr);
438 ### src/Worker/Notifier.php
440 Hook::callAll('notifier_end', $target_item);
442 ### src/Module/Login.php
444 Hook::callAll('authenticate', $addon_auth);
445 Hook::callAll('login_hook', $o);
447 ### src/Module/Logout.php
449 Hook::callAll("logging_out");
451 ### src/Object/Post.php
453 Hook::callAll('render_location', $locate);
454 Hook::callAll('display_item', $arr);
458 Hook::callAll('contact_select_options', $x);
459 Hook::callAll($a->module.'_pre_'.$selname, $arr);
460 Hook::callAll($a->module.'_post_'.$selname, $o);
461 Hook::callAll($a->module.'_pre_'.$selname, $arr);
462 Hook::callAll($a->module.'_post_'.$selname, $o);
463 Hook::callAll('jot_networks', $jotnets);
465 ### src/Core/Authentication.php
467 Hook::callAll('logged_in', $a->user);
469 ### src/Core/Hook.php
471 self::callSingle(self::getApp(), 'hook_fork', $fork_hook, $hookdata);
473 ### src/Core/L10n/L10n.php
475 Hook::callAll('poke_verbs', $arr);
477 ### src/Core/Worker.php
479 Hook::callAll("proc_run", $arr);
481 ### src/Util/Emailer.php
483 Hook::callAll('emailer_send_prepare', $email);
484 Hook::callAll("emailer_send", $hookdata);
488 Hook::callAll('generate_map', $arr);
489 Hook::callAll('generate_named_map', $arr);
490 Hook::callAll('Map::getCoordinates', $arr);
492 ### src/Util/Network.php
494 Hook::callAll('avatar_lookup', $avatar);
496 ### src/Util/ParseUrl.php
498 Hook::callAll("getsiteinfo", $siteinfo);
500 ### src/Protocol/DFRN.php
502 Hook::callAll('atom_feed_end', $atom);
503 Hook::callAll('atom_feed_end', $atom);
505 ### src/Protocol/Email.php
507 Hook::callAll('email_getmessage', $message);
508 Hook::callAll('email_getmessage_end', $ret);