Merge pull request #2319 from stieben/develop

Added the possibility for themes to override core module functions
pull/2326/head
fabrixxm 7 years ago
commit 9330a6994c
  1. 101
      doc/Plugins.md
  2. 78
      doc/de/Plugins.md
  3. 16
      doc/themes.md
  4. 11
      index.php
  5. 4
      mod/_well_known.php
  6. 3
      mod/acctlink.php
  7. 4
      mod/acl.php
  8. 78
      mod/admin.php
  9. 2
      mod/allfriends.php
  10. 5
      mod/amcd.php
  11. 11
      mod/api.php
  12. 36
      mod/apps.php
  13. 3
      mod/attach.php
  14. 46
      mod/babel.php
  15. 5
      mod/bookmarklet.php
  16. 11
      mod/cb.php
  17. 2
      mod/common.php
  18. 13
      mod/community.php
  19. 4
      mod/contactgroup.php
  20. 38
      mod/contacts.php
  21. 48
      mod/content.php
  22. 2
      mod/credits.php
  23. 10
      mod/crepair.php
  24. 10
      mod/delegate.php
  25. 3
      mod/dfrn_confirm.php
  26. 6
      mod/dfrn_notify.php
  27. 13
      mod/dfrn_poll.php
  28. 19
      mod/directory.php
  29. 6
      mod/dirfind.php
  30. 9
      mod/display.php
  31. 5
      mod/editpost.php
  32. 6
      mod/events.php
  33. 3
      mod/fbrowser.php
  34. 5
      mod/filer.php
  35. 2
      mod/filerm.php
  36. 4
      mod/follow.php
  37. 11
      mod/friendica.php
  38. 19
      mod/fsuggest.php
  39. 11
      mod/group.php
  40. 10
      mod/hcard.php
  41. 3
      mod/help.php
  42. 3
      mod/hostxrd.php
  43. 3
      mod/ignored.php
  44. 55
      mod/install.php
  45. 13
      mod/invite.php
  46. 13
      mod/item.php
  47. 7
      mod/like.php
  48. 11
      mod/localtime.php
  49. 20
      mod/lockview.php
  50. 4
      mod/login.php
  51. 7
      mod/lostpass.php
  52. 3
      mod/maintenance.php
  53. 8
      mod/manage.php
  54. 2
      mod/match.php
  55. 13
      mod/message.php
  56. 4
      mod/modexp.php
  57. 10
      mod/mood.php
  58. 9
      mod/msearch.php
  59. 3
      mod/navigation.php
  60. 17
      mod/network.php
  61. 10
      mod/newmember.php
  62. 11
      mod/nodeinfo.php
  63. 6
      mod/nogroup.php
  64. 3
      mod/noscrape.php
  65. 20
      mod/notes.php
  66. 9
      mod/notice.php
  67. 6
      mod/notifications.php
  68. 8
      mod/notify.php
  69. 4
      mod/oembed.php
  70. 17
      mod/oexchange.php
  71. 10
      mod/openid.php
  72. 16
      mod/opensearch.php
  73. 2
      mod/ostatus_subscribe.php
  74. 4
      mod/p.php
  75. 18
      mod/parse_url.php
  76. 2
      mod/photo.php
  77. 15
      mod/photos.php
  78. 4
      mod/ping.php
  79. 3
      mod/poco.php
  80. 12
      mod/poke.php
  81. 7
      mod/post.php
  82. 4
      mod/pretheme.php
  83. 4
      mod/probe.php
  84. 7
      mod/profile.php
  85. 26
      mod/profile_photo.php
  86. 14
      mod/profiles.php
  87. 12
      mod/profperm.php
  88. 12
      mod/proxy.php
  89. 20
      mod/pubsub.php
  90. 5
      mod/pubsubhubbub.php
  91. 3
      mod/qsearch.php
  92. 3
      mod/randprof.php
  93. 4
      mod/receive.php
  94. 6
      mod/redir.php
  95. 9
      mod/regmod.php
  96. 6
      mod/removeme.php
  97. 2
      mod/repair_ostatus.php
  98. 6
      mod/rsd_xml.php
  99. 7
      mod/salmon.php
  100. 14
      mod/search.php
  101. Some files were not shown because too many files have changed in this diff Show More

@ -1,5 +1,7 @@
Friendica Addon/Plugin development
==========================
==============
* [Home](help)
Please see the sample addon 'randplace' for a working example of using some of these features.
Addons work by intercepting event hooks - which must be registered.
@ -16,12 +18,12 @@ Future extensions may provide for "setup" amd "remove".
Plugins should contain a comment block with the four following parameters:
/*
* Name: My Great Plugin
* Description: This is what my plugin does. It's really cool
* Version: 1.0
* Author: John Q. Public <john@myfriendicasite.com>
*/
/*
* Name: My Great Plugin
* Description: This is what my plugin does. It's really cool.
* Version: 1.0
* Author: John Q. Public <john@myfriendicasite.com>
*/
Register your plugin hooks during installation.
@ -45,7 +47,7 @@ Your hook callback functions will be called with at least one and possibly two a
If you wish to make changes to the calling data, you must declare them as reference variables (with '&') during function declaration.
###$a
#### $a
$a is the Friendica 'App' class.
It contains a wealth of information about the current state of Friendica:
@ -56,13 +58,13 @@ It contains a wealth of information about the current state of Friendica:
It is recommeded you call this '$a' to match its usage elsewhere.
###$b
#### $b
$b can be called anything you like.
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.
Remember to declare it with '&' if you wish to alter it.
Modules
--------
---
Plugins/addons may also act as "modules" and intercept all page requests for a given URL path.
In order for a plugin to act as a module it needs to define a function "plugin_name_module()" which takes no arguments and needs not do anything.
@ -72,15 +74,15 @@ These are parsed into an array $a->argv, with a corresponding $a->argc indicatin
So http://my.web.site/plugin/arg1/arg2 would look for a module named "plugin" and pass its module functions the $a App structure (which is available to many components).
This will include:
$a->argc = 3
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
$a->argc = 3
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
Your module functions will often contain the function plugin_name_content(&$a), which defines and returns the page body content.
They may also contain plugin_name_post(&$a) which is called before the _content function and typically handles the results of POST forms.
You may also have plugin_name_init(&$a) which is called very early on and often does module initialisation.
Templates
----------
---
If your plugin needs some template, you can use the Friendica template system.
Friendica uses [smarty3](http://www.smarty.net/) as a template engine.
@ -104,140 +106,140 @@ See also the wiki page [Quick Template Guide](https://github.com/friendica/frien
Current hooks
-------------
###'authenticate'
### 'authenticate'
'authenticate' is called when a user attempts to login.
$b is an array containing:
'username' => the supplied username
'password' => the supplied password
'username' => the supplied username
'password' => the supplied password
'authenticated' => set this to non-zero to authenticate the user.
'user_record' => successful authentication must also return a valid user record from the database
###'logged_in'
### 'logged_in'
'logged_in' is called after a user has successfully logged in.
$b contains the $a->user array.
###'display_item'
### 'display_item'
'display_item' is called when formatting a post for display.
$b is an array:
'item' => The item (array) details pulled from the database
'output' => the (string) HTML representation of this item prior to adding it to the page
###'post_local'
### 'post_local'
* called when a status post or comment is entered on the local system
* $b is the item array of the information to be stored in the database
* Please note: body contents are bbcode - not HTML
###'post_local_end'
### 'post_local_end'
* called when a local status post or comment has been stored on the local system
* $b is the item array of the information which has just been stored in the database
* Please note: body contents are bbcode - not HTML
###'post_remote'
### 'post_remote'
* called when receiving a post from another source. This may also be used to post local activity or system generated messages.
* $b is the item array of information to be stored in the database and the item body is bbcode.
###'settings_form'
### 'settings_form'
* called when generating the HTML for the user Settings page
* $b is the (string) HTML of the settings page before the final '</form>' tag.
###'settings_post'
### 'settings_post'
* called when the Settings pages are submitted
* $b is the $_POST array
###'plugin_settings'
### 'plugin_settings'
* called when generating the HTML for the addon settings page
* $b is the (string) HTML of the addon settings page before the final '</form>' tag.
###'plugin_settings_post'
### 'plugin_settings_post'
* called when the Addon Settings pages are submitted
* $b is the $_POST array
###'profile_post'
### 'profile_post'
* called when posting a profile page
* $b is the $_POST array
###'profile_edit'
### 'profile_edit'
'profile_edit' is called prior to output of profile edit page.
$b is an array containing:
'profile' => profile (array) record from the database
'entry' => the (string) HTML of the generated entry
###'profile_advanced'
### 'profile_advanced'
* called when the HTML is generated for the 'Advanced profile', corresponding to the 'Profile' tab within a person's profile page
* $b is the (string) HTML representation of the generated profile
* The profile array details are in $a->profile.
###'directory_item'
### 'directory_item'
'directory_item' is called from the Directory page when formatting an item for display.
$b is an array:
'contact' => contact (array) record for the person from the database
'entry' => the (string) HTML of the generated entry
###'profile_sidebar_enter'
### 'profile_sidebar_enter'
* called prior to generating the sidebar "short" profile for a page
* $b is the person's profile array
###'profile_sidebar'
### 'profile_sidebar'
'profile_sidebar is called when generating the sidebar "short" profile for a page.
$b is an array:
'profile' => profile (array) record for the person from the database
'entry' => the (string) HTML of the generated entry
###'contact_block_end'
### 'contact_block_end'
is called when formatting the block of contacts/friends on a profile sidebar has completed.
$b is an array:
'contacts' => array of contacts
'output' => the (string) generated HTML of the contact block
###'bbcode'
### 'bbcode'
* called during conversion of bbcode to html
* $b is a string converted text
###'html2bbcode'
### 'html2bbcode'
* called during conversion of html to bbcode (e.g. remote message posting)
* $b is a string converted text
###'page_header'
### 'page_header'
* called after building the page navigation section
* $b is a string HTML of nav region
###'personal_xrd'
### 'personal_xrd'
'personal_xrd' is called prior to output of personal XRD file.
$b is an array:
'user' => the user record for the person
'xml' => the complete XML to be output
###'home_content'
### 'home_content'
* called prior to output home page content, shown to unlogged users
* $b is (string) HTML of section region
###'contact_edit'
### 'contact_edit'
is called when editing contact details on an individual from the Contacts page.
$b is an array:
'contact' => contact record (array) of target contact
'output' => the (string) generated HTML of the contact edit page
###'contact_edit_post'
### 'contact_edit_post'
* called when posting the contact edit page.
* $b is the $_POST array
###'init_1'
### 'init_1'
* called just after DB has been opened and before session start
* $b is not used or passed
###'page_end'
### 'page_end'
* called after HTML content functions have completed
* $b is (string) HTML of content div
###'avatar_lookup'
### 'avatar_lookup'
'avatar_lookup' is called when looking up the avatar.
$b is an array:
@ -245,11 +247,11 @@ $b is an array:
'email' => email to look up the avatar for
'url' => the (string) generated URL of the avatar
###'emailer_send_prepare'
### 'emailer_send_prepare'
'emailer_send_prepare' called from Emailer::send() before building the mime message.
$b is an array, params to Emailer::send()
'fromName' => name of the sender
'fromName' => name of the sender
'fromEmail' => email fo the sender
'replyTo' => replyTo address to direct responses
'toEmail' => destination email address
@ -258,20 +260,20 @@ $b is an array, params to Emailer::send()
'textVersion' => text only version of the message
'additionalMailHeader' => additions to the smtp mail header
###'emailer_send'
### 'emailer_send'
is called before calling PHP's mail().
$b is an array, params to mail()
'to'
'subject'
'to'
'subject'
'body'
'headers'
###'nav_info'
### 'nav_info'
is called after the navigational menu is build in include/nav.php.
$b is an array containing $nav from nav.php.
###'template_vars'
### 'template_vars'
is called before vars are passed to the template engine to render the page.
The registered function can add,change or remove variables passed to template.
$b is an array with:
@ -463,4 +465,3 @@ mod/cb.php: call_hooks('cb_afterpost');
mod/cb.php: call_hooks('cb_content', $o);
mod/directory.php: call_hooks('directory_item', $arr);

@ -1,27 +1,28 @@
**Friendica Addon/Plugin-Entwicklung**
Friendica Addon/Plugin-Entwicklung
==============
* [Zur Startseite der Hilfe](help)
Bitte schau dir das Beispiel-Addon "randplace" für ein funktionierendes Beispiel für manche der hier aufgeführten Funktionen an.
Das Facebook-Addon bietet ein Beispiel dafür, die "addon"- und "module"-Funktion gemeinsam zu integrieren.
Addons arbeiten, indem sie Event Hooks abfangen. Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden
Bitte schau dir das Beispiel-Addon "randplace" für ein funktionierendes Beispiel für manche der hier aufgeführten Funktionen an.
Das Facebook-Addon bietet ein Beispiel dafür, die "addon"- und "module"-Funktion gemeinsam zu integrieren.
Addons arbeiten, indem sie Event Hooks abfangen.
Module arbeiten, indem bestimmte Seitenanfragen (durch den URL-Pfad) abgefangen werden.
Plugin-Namen können keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt.
Du kannst einen lesbaren Namen im Kommentarblock eintragen.
Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-/Plugin-Namen basieren; z.B. "plugin1name_install()".
Diese beiden Funktionen haben keine Argumente und sind dafür verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Plugin benötigt.
Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgeführt (z.B. neu installiert), wenn sich das Plugin nach der Installation ändert - somit sollte deine Deinstallationsfunktion keine Daten zerstört und deine Installationsfunktion sollte bestehende Daten berücksichtigen.
Plugin-Namen können keine Leerstellen oder andere Interpunktionen enthalten und werden als Datei- und Funktionsnamen genutzt.
Du kannst einen lesbaren Namen im Kommentarblock eintragen.
Jedes Addon muss beides beinhalten - eine Installations- und eine Deinstallationsfunktion, die auf dem Addon-/Plugin-Namen basieren; z.B. "plugin1name_install()".
Diese beiden Funktionen haben keine Argumente und sind dafür verantwortlich, Event Hooks zu registrieren und abzumelden (unregistering), die dein Plugin benötigt.
Die Installations- und Deinstallationsfunktionfunktionen werden auch ausgeführt (z.B. neu installiert), wenn sich das Plugin nach der Installation ändert - somit sollte deine Deinstallationsfunktion keine Daten zerstört und deine Installationsfunktion sollte bestehende Daten berücksichtigen.
Zukünftige Extensions werden möglicherweise "Setup" und "Entfernen" anbieten.
Plugins sollten einen Kommentarblock mit den folgenden vier Parametern enthalten:
/*
* Name: My Great Plugin
* Description: This is what my plugin does. It's really cool
* Version: 1.0
* Author: John Q. Public <john@myfriendicasite.com>
*/
/*
* Name: My Great Plugin
* Description: This is what my plugin does. It's really cool.
* Version: 1.0
* Author: John Q. Public <john@myfriendicasite.com>
*/
Registriere deine Plugin-Hooks während der Installation.
@ -29,45 +30,50 @@ Registriere deine Plugin-Hooks während der Installation.
$hookname ist ein String und entspricht einem bekannten Friendica-Hook.
$file steht für den Pfadnamen, der relativ zum Top-Level-Friendicaverzeichnis liegt.
$file steht für den Pfadnamen, der relativ zum Top-Level-Friendicaverzeichnis liegt.
Das *sollte* "addon/plugin_name/plugin_name.php' sein.
$function ist ein String und der Name der Funktion, die ausgeführt wird, wenn der Hook aufgerufen wird.
Argumente
---
Deine Hook-Callback-Funktion wird mit mindestens einem und bis zu zwei Argumenten aufgerufen
function myhook_function(&$a, &$b) {
}
Wenn du Änderungen an den aufgerufenen Daten vornehmen willst, musst du diese als Referenzvariable (mit "&") während der Funktionsdeklaration deklarieren.
Wenn du Änderungen an den aufgerufenen Daten vornehmen willst, musst du diese als Referenzvariable (mit "&") während der Funktionsdeklaration deklarieren.
$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.
Es ist empfohlen, diese Funktion "$a" zu nennen, um seine Nutzung an den Gebrauch an anderer Stelle anzugleichen.
$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.
Es ist empfohlen, diese Funktion "$a" zu nennen, um seine Nutzung an den Gebrauch an anderer Stelle anzugleichen.
$b kann frei benannt werden.
Diese Information ist speziell auf den Hook bezogen, der aktuell bearbeitet wird, und beinhaltet normalerweise Daten, die du sofort nutzen, anzeigen oder bearbeiten kannst.
Achte darauf, diese mit "&" zu deklarieren, wenn du sie bearbeiten willst.
$b kann frei benannt werden.
Diese Information ist speziell auf den Hook bezogen, der aktuell bearbeitet wird, und beinhaltet normalerweise Daten, die du sofort nutzen, anzeigen oder bearbeiten kannst.
Achte darauf, diese mit "&" zu deklarieren, wenn du sie bearbeiten willst.
**Module**
Module
---
Plugins/Addons können auch als "Module" agieren und alle Seitenanfragen für eine bestimte URL abfangen.
Um ein Plugin als Modul zu nutzen, ist es nötig, die Funktion "plugin_name_module()" zu definieren, die keine Argumente benötigt und nichts weiter machen muss.
Plugins/Addons können auch als "Module" agieren und alle Seitenanfragen für eine bestimte URL abfangen.
Um ein Plugin als Modul zu nutzen, ist es nötig, die Funktion "plugin_name_module()" zu definieren, die keine Argumente benötigt und nichts weiter machen muss.
Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen für "http://my.web.site/plugin_name" erhalten - mit allen URL-Komponenten als zusätzliche Argumente.
Diese werden in ein Array $a->argv geparst und stimmen mit $a->argc überein, wobei sie die Anzahl der URL-Komponenten abbilden.
So würde http://my.web.site/plugin/arg1/arg2 nach einem Modul "plugin" suchen und seiner Modulfunktion die $a-App-Strukur übergeben (dies ist für viele Komponenten verfügbar). Das umfasst:
Wenn diese Funktion existiert, wirst du nun alle Seitenanfragen für "http://example.com/plugin_name" erhalten - mit allen URL-Komponenten als zusätzliche Argumente.
Diese werden in ein Array $a->argv geparst und stimmen mit $a->argc überein, wobei sie die Anzahl der URL-Komponenten abbilden.
So würde http://example.com/plugin/arg1/arg2 nach einem Modul "plugin" suchen und seiner Modulfunktion die $a-App-Strukur übergeben (dies ist für viele Komponenten verfügbar). Das umfasst:
$a->argc = 3
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
$a->argc = 3
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
Deine Modulfunktionen umfassen oft die Funktion plugin_name_content(&$a), welche den Seiteninhalt definiert und zurückgibt.
Sie können auch plugin_name_post(&$a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt.
Deine Modulfunktionen umfassen oft die Funktion plugin_name_content(&$a), welche den Seiteninhalt definiert und zurückgibt.
Sie können auch plugin_name_post(&$a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt.
Du kannst ebenso plugin_name_init(&$a) nutzen, was oft frühzeitig aufgerufen wird und das Modul initialisert.
**Derzeitige Hooks:**
Derzeitige Hooks
---
**'authenticate'** - wird aufgerufen, wenn sich der User einloggt.
$b ist ein Array
@ -180,6 +186,9 @@ Du kannst ebenso plugin_name_init(&$a) nutzen, was oft frühzeitig aufgerufen wi
- wird aufgerufen nachdem in include/nav,php der Inhalt des Navigations Menüs erzeugt wurde.
- $b ist ein Array, das $nav wiederspiegelt.
Komplette Liste der Hook-Callbacks
---
Eine komplette Liste aller Hook-Callbacks mit den zugehörigen Dateien (am 14-Feb-2012 generiert): Bitte schau in die Quellcodes für Details zu Hooks, die oben nicht dokumentiert sind.
boot.php: call_hooks('login_hook',$o);
@ -204,7 +213,7 @@ include/text.php: call_hooks('contact_block_end', $arr);
include/text.php: call_hooks('smilie', $s);
include/text.php: call_hooks('prepare_body_init', $item);
include/text.php: call_hooks('prepare_body_init', $item);
include/text.php: call_hooks('prepare_body', $prep_arr);
@ -359,4 +368,3 @@ mod/cb.php: call_hooks('cb_afterpost');
mod/cb.php: call_hooks('cb_content', $o);
mod/directory.php: call_hooks('directory_item', $arr);

@ -59,7 +59,19 @@ The same rule applies to the JavaScript files found in
they will be overwritten by files in
/view/theme/**your-theme-name**/js.
/view/theme/**your-theme-name**/js
### Modules
You have the freedom to override core modules found in
/mod
They will be overwritten by files in
/view/theme/**your-theme-name**/mod
Be aware that you can break things easily here if you don't know what you do. Also notice that you can override parts of the module – functions not defined in your theme module will be loaded from the core module.
## Expand an existing Theme
@ -288,4 +300,4 @@ The default file is in
/view/default.php
if you want to change it, say adding a 4th column for banners of your favourite FLOSS projects, place a new default.php file in your theme directory.
As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.
As with the theme.php file, you can use the properties of the $a variable with holds the friendica application to decide what content is displayed.

@ -233,7 +233,16 @@ if(strlen($a->module)) {
}
/**
* If not, next look for a 'standard' program module in the 'mod' directory
* If not, next look for module overrides by the theme
*/
if((! $a->module_loaded) && (file_exists("view/theme/" . current_theme() . "/mod/{$a->module}.php"))) {
include_once("view/theme/" . current_theme() . "/mod/{$a->module}.php");
// We will not set module_loaded to true to allow for partial overrides.
}
/**
* Finally, look for a 'standard' program module in the 'mod' directory
*/
if((! $a->module_loaded) && (file_exists("mod/{$a->module}.php"))) {

@ -2,6 +2,7 @@
require_once("mod/hostxrd.php");
require_once("mod/nodeinfo.php");
if(! function_exists('_well_known_init')) {
function _well_known_init(&$a){
if ($a->argc > 1) {
switch($a->argv[1]) {
@ -19,7 +20,9 @@ function _well_known_init(&$a){
http_status_exit(404);
killme();
}
}
if(! function_exists('wk_social_relay')) {
function wk_social_relay(&$a) {
define('SR_SCOPE_ALL', 'all');
@ -64,3 +67,4 @@ function wk_social_relay(&$a) {
echo json_encode($relay, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
exit;
}
}

@ -2,8 +2,8 @@
require_once('include/Scrape.php');
if(! function_exists('acctlink_init')) {
function acctlink_init(&$a) {
if(x($_GET,'addr')) {
$addr = trim($_GET['addr']);
$res = probe_url($addr);
@ -14,3 +14,4 @@ function acctlink_init(&$a) {
}
}
}
}

@ -3,8 +3,8 @@
require_once("include/acl_selectors.php");
if(! function_exists('acl_init')) {
function acl_init(&$a){
acl_lookup($a);
}
}

@ -2,7 +2,7 @@
/**
* @file mod/admin.php
*
*
* @brief Friendica admin
*/
@ -23,6 +23,7 @@ require_once("include/text.php");
* @param App $a
*
*/
if(! function_exists('admin_post')) {
function admin_post(&$a){
@ -110,6 +111,7 @@ function admin_post(&$a){
goaway($a->get_baseurl(true) . '/admin' );
return; // NOTREACHED
}
}
/**
* @brief Generates content of the admin panel pages
@ -128,6 +130,7 @@ function admin_post(&$a){
* @param App $a
* @return string
*/
if(! function_exists('admin_content')) {
function admin_content(&$a) {
if(!is_site_admin()) {
@ -245,6 +248,7 @@ function admin_content(&$a) {
return $o;
}
}
}
/**
* @brief Subpage with some stats about "the federation" network
@ -260,6 +264,7 @@ function admin_content(&$a) {
* @param App $a
* @return string
*/
if(! function_exists('admin_page_federation')) {
function admin_page_federation(&$a) {
// get counts on active friendica, diaspora, redmatrix, hubzilla, gnu
// social and statusnet nodes this node is knowing
@ -284,7 +289,7 @@ function admin_page_federation(&$a) {
// what versions for that platform do we know at all?
// again only the active nodes
$v = q('SELECT count(*) AS total, version FROM gserver
WHERE last_contact > last_failure AND platform LIKE "%s"
WHERE last_contact > last_failure AND platform LIKE "%s"
GROUP BY version
ORDER BY version;', $p);
@ -301,12 +306,12 @@ function admin_page_federation(&$a) {
$newVC = $vv['total'];
$newVV = $vv['version'];
$posDash = strpos($newVV, '-');
if($posDash)
if($posDash)
$newVV = substr($newVV, 0, $posDash);
if(isset($newV[$newVV]))
$newV[$newVV] += $newVC;
$newV[$newVV] += $newVC;
else
$newV[$newVV] = $newVC;
$newV[$newVV] = $newVC;
}
foreach ($newV as $key => $value) {
array_push($newVv, array('total'=>$value, 'version'=>$key));
@ -361,6 +366,7 @@ function admin_page_federation(&$a) {
'$baseurl' => $a->get_baseurl(),
));
}
}
/**
* @brief Admin Inspect Queue Page
@ -375,6 +381,7 @@ function admin_page_federation(&$a) {
* @param App $a
* @return string
*/
if(! function_exists('admin_page_queue')) {
function admin_page_queue(&$a) {
// get content from the queue table
$r = q("SELECT c.name,c.nurl,q.id,q.network,q.created,q.last from queue as q, contact as c where c.id=q.cid order by q.cid, q.created;");
@ -394,6 +401,7 @@ function admin_page_queue(&$a) {
'$entries' => $r,
));
}
}
/**
* @brief Admin Summary Page
@ -406,6 +414,7 @@ function admin_page_queue(&$a) {
* @param App $a
* @return string
*/
if(! function_exists('admin_page_summary')) {
function admin_page_summary(&$a) {
$r = q("SELECT `page-flags`, COUNT(uid) as `count` FROM `user` GROUP BY `page-flags`");
$accounts = array(
@ -452,12 +461,14 @@ function admin_page_summary(&$a) {
'$plugins' => array( t('Active plugins'), $a->plugins )
));
}
}
/**
* @brief Process send data from Admin Site Page
*
*
* @param App $a
*/
if(! function_exists('admin_page_site_post')) {
function admin_page_site_post(&$a) {
if(!x($_POST,"page_site")) {
return;
@ -770,6 +781,7 @@ function admin_page_site_post(&$a) {
return; // NOTREACHED
}
}
/**
* @brief Generate Admin Site subpage
@ -779,6 +791,7 @@ function admin_page_site_post(&$a) {
* @param App $a
* @return string
*/
if(! function_exists('admin_page_site')) {
function admin_page_site(&$a) {
/* Installed langs */
@ -983,7 +996,7 @@ function admin_page_site(&$a) {
'$form_security_token' => get_form_security_token("admin_site")
));
}
}
/**
@ -998,6 +1011,7 @@ function admin_page_site(&$a) {
* @param App $a
* @return string
**/
if(! function_exists('admin_page_dbsync')) {
function admin_page_dbsync(&$a) {
$o = '';
@ -1073,14 +1087,15 @@ function admin_page_dbsync(&$a) {
}
return $o;
}
}
/**
* @brief Process data send by Users admin page
*
*
* @param App $a
*/
if(! function_exists('admin_page_users_post')) {
function admin_page_users_post(&$a){
$pending = ( x($_POST, 'pending') ? $_POST['pending'] : array() );
$users = ( x($_POST, 'user') ? $_POST['user'] : array() );
@ -1171,6 +1186,7 @@ function admin_page_users_post(&$a){
goaway($a->get_baseurl(true) . '/admin/users' );
return; // NOTREACHED
}
}
/**
* @brief Admin panel subpage for User management
@ -1184,6 +1200,7 @@ function admin_page_users_post(&$a){
* @param App $a
* @return string
*/
if(! function_exists('admin_page_users')) {
function admin_page_users(&$a){
if($a->argc>2) {
$uid = $a->argv[3];
@ -1336,7 +1353,7 @@ function admin_page_users(&$a){
$o .= paginate($a);
return $o;
}
}
/**
* @brief Plugins admin page
@ -1354,6 +1371,7 @@ function admin_page_users(&$a){
* @param App $a
* @return string
*/
if(! function_exists('admin_page_plugins')) {
function admin_page_plugins(&$a){
/*
@ -1479,17 +1497,19 @@ function admin_page_plugins(&$a){
'$baseurl' => $a->get_baseurl(true),
'$function' => 'plugins',
'$plugins' => $plugins,
'$pcount' => count($plugins),
'$pcount' => count($plugins),
'$noplugshint' => sprintf( t('There are currently no plugins available on your node. You can find the official plugin repository at %1$s and might find other interesting plugins in the open plugin registry at %2$s'), 'https://github.com/friendica/friendica-addons', 'http://addons.friendi.ca'),
'$form_security_token' => get_form_security_token("admin_themes"),
));
}
}
/**
* @param array $themes
* @param string $th
* @param int $result
*/
if(! function_exists('toggle_theme')) {
function toggle_theme(&$themes,$th,&$result) {
for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) {
@ -1504,12 +1524,14 @@ function toggle_theme(&$themes,$th,&$result) {
}
}
}
}
/**
* @param array $themes
* @param string $th
* @return int
*/
if(! function_exists('theme_status')) {
function theme_status($themes,$th) {
for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) {
@ -1523,12 +1545,13 @@ function theme_status($themes,$th) {
}
return 0;
}
}
/**
* @param array $themes
* @return string
*/
if(! function_exists('rebuild_theme_table')) {
function rebuild_theme_table($themes) {
$o = '';
if(count($themes)) {
@ -1542,7 +1565,7 @@ function rebuild_theme_table($themes) {
}
return $o;
}
}
/**
* @brief Themes admin page
@ -1560,6 +1583,7 @@ function rebuild_theme_table($themes) {
* @param App $a
* @return string
*/
if(! function_exists('admin_page_themes')) {
function admin_page_themes(&$a){
$allowed_themes_str = get_config('system','allowed_themes');
@ -1734,13 +1758,14 @@ function admin_page_themes(&$a){
'$form_security_token' => get_form_security_token("admin_themes"),
));
}
}
/**
* @brief Prosesses data send by Logs admin page
*
*
* @param App $a
*/
if(! function_exists('admin_page_logs_post')) {
function admin_page_logs_post(&$a) {
if(x($_POST,"page_logs")) {
check_form_security_token_redirectOnErr('/admin/logs', 'admin_logs');
@ -1758,6 +1783,7 @@ function admin_page_logs_post(&$a) {
goaway($a->get_baseurl(true) . '/admin/logs' );
return; // NOTREACHED
}
}
/**
* @brief Generates admin panel subpage for configuration of the logs
@ -1775,6 +1801,7 @@ function admin_page_logs_post(&$a) {
* @param App $a
* @return string
*/
if(! function_exists('admin_page_logs')) {
function admin_page_logs(&$a){
$log_choices = array(
@ -1806,6 +1833,7 @@ function admin_page_logs(&$a){
'$phplogcode' => "error_reporting(E_ERROR | E_WARNING | E_PARSE );\nini_set('error_log','php.out');\nini_set('log_errors','1');\nini_set('display_errors', '1');",
));
}
}
/**
* @brief Generates admin panel subpage to view the Friendica log
@ -1825,6 +1853,7 @@ function admin_page_logs(&$a){
* @param App $a
* @return string
*/
if(! function_exists('admin_page_viewlogs')) {
function admin_page_viewlogs(&$a){
$t = get_markup_template("admin_viewlogs.tpl");
$f = get_config('system','logfile');
@ -1861,12 +1890,14 @@ function admin_page_viewlogs(&$a){
'$logname' => get_config('system','logfile')
));
}
}
/**
* @brief Prosesses data send by the features admin page
*
*
* @param App $a
*/
if(! function_exists('admin_page_features_post')) {
function admin_page_features_post(&$a) {
check_form_security_token_redirectOnErr('/admin/features', 'admin_manage_features');
@ -1898,23 +1929,25 @@ function admin_page_features_post(&$a) {
goaway($a->get_baseurl(true) . '/admin/features' );
return; // NOTREACHED
}
}
/**
* @brief Subpage for global additional feature management
*
*
* This functin generates the subpage 'Manage Additional Features'
* for the admin panel. At this page the admin can set preferences
* for the user settings of the 'additional features'. If needed this
* for the user settings of the 'additional features'. If needed this
* preferences can be locked through the admin.
*
*
* The returned string contains the HTML code of the subpage 'Manage
* Additional Features'
*
*
* @param App $a
* @return string
*/
if(! function_exists('admin_page_features')) {
function admin_page_features(&$a) {
if((argc() > 1) && (argv(1) === 'features')) {
$arr = array();
$features = get_features(false);
@ -1933,7 +1966,7 @@ function admin_page_features(&$a) {
);
}
}
$tpl = get_markup_template("admin_settings_features.tpl");
$o .= replace_macros($tpl, array(
'$form_security_token' => get_form_security_token("admin_manage_features"),
@ -1945,3 +1978,4 @@ function admin_page_features(&$a) {
return $o;
}
}
}

@ -5,6 +5,7 @@ require_once('include/Contact.php');
require_once('include/contact_selectors.php');
require_once('mod/contacts.php');
if(! function_exists('allfriends_content')) {
function allfriends_content(&$a) {
$o = '';
@ -97,3 +98,4 @@ function allfriends_content(&$a) {
return $o;
}
}

@ -1,5 +1,5 @@
<?php
if(! function_exists('amcd_content')) {
function amcd_content(&$a) {
//header("Content-type: text/json");
echo <<< EOT
@ -46,4 +46,5 @@ echo <<< EOT
}
EOT;
killme();
}
}
}

@ -1,10 +1,8 @@
<?php
require_once('include/api.php');
if(! function_exists('oauth_get_client')) {
function oauth_get_client($request){
$params = $request->get_parameters();
$token = $params['oauth_token'];
@ -19,9 +17,10 @@ function oauth_get_client($request){
return $r[0];
}
}
if(! function_exists('api_post')) {
function api_post(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL);
return;
@ -31,9 +30,10 @@ function api_post(&$a) {
notice( t('Permission denied.') . EOL);
return;
}
}
}
if(! function_exists('api_content')) {
function api_content(&$a) {
if ($a->cmd=='api/oauth/authorize'){
/*
@ -114,3 +114,4 @@ function api_content(&$a) {
echo api_call($a);
killme();
}
}

@ -1,25 +1,23 @@
<?php
if(! function_exists('apps_content')) {
function apps_content(&$a) {
$privateaddons = get_config('config','private_addons');
if ($privateaddons === "1") {
if((! (local_user()))) {
info( t("You must be logged in to use addons. "));
return;};
}
$title = t('Applications');
$privateaddons = get_config('config','private_addons');
if ($privateaddons === "1") {
if((! (local_user()))) {
info( t("You must be logged in to use addons. "));
return;
}
}
if(count($a->apps)==0)
notice( t('No installed applications.') . EOL);
$title = t('Applications');
if(count($a->apps)==0)
notice( t('No installed applications.') . EOL);
$tpl = get_markup_template("apps.tpl");
return replace_macros($tpl, array(
'$title' => $title,
'$apps' => $a->apps,
));
$tpl = get_markup_template("apps.tpl");
return replace_macros($tpl, array(
'$title' => $title,
'$apps' => $a->apps,
));
}
}

@ -1,7 +1,7 @@
<?php
require_once('include/security.php');
if(! function_exists('attach_init')) {
function attach_init(&$a) {
if($a->argc != 2) {
@ -47,3 +47,4 @@ function attach_init(&$a) {
killme();
// NOTREACHED
}
}

@ -9,55 +9,56 @@ function visible_lf($s) {
return str_replace("\n",'<br />', $s);
}
if(! function_exists('babel_content')) {
function babel_content(&$a) {
$o .= '<h1>Babel Diagnostic</h1>';
$o .= '<form action="babel" method="post">';
$o .= t('Source (bbcode) text:') . EOL . '<textarea name="text" >' . htmlspecialchars($_REQUEST['text']) .'</textarea>' . EOL;
$o .= '<input type="submit" name="submit" value="Submit" /></form>';
$o .= '<input type="submit" name="submit" value="Submit" /></form>';
$o .= '<br /><br />';
$o .= '<form action="babel" method="post">';
$o .= t('Source (Diaspora) text to convert to BBcode:') . EOL . '<textarea name="d2bbtext" >' . htmlspecialchars($_REQUEST['d2bbtext']) .'</textarea>' . EOL;
$o .= '<input type="submit" name="submit" value="Submit" /></form>';
$o .= '<input type="submit" name="submit" value="Submit" /></form>';
$o .= '<br /><br />';
if(x($_REQUEST,'text')) {
$text = trim($_REQUEST['text']);
$o .= "<h2>" . t("Source input: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($text) . EOL. EOL;
$o .= "<h2>" . t("Source input: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($text) . EOL. EOL;
$html = bbcode($text);
$o .= "<h2>" . t("bb2html (raw HTML): ") . "</h2>" . EOL. EOL;
$o .= htmlspecialchars($html). EOL. EOL;
$o .= "<h2>" . t("bb2html (raw HTML): ") . "</h2>" . EOL. EOL;
$o .= htmlspecialchars($html). EOL. EOL;
//$html = bbcode($text);
$o .= "<h2>" . t("bb2html: ") . "</h2>" . EOL. EOL;
$o .= $html. EOL. EOL;
$o .= "<h2>" . t("bb2html: ") . "</h2>" . EOL. EOL;
$o .= $html. EOL. EOL;
$bbcode = html2bbcode($html);
$o .= "<h2>" . t("bb2html2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bbcode) . EOL. EOL;
$o .= "<h2>" . t("bb2html2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bbcode) . EOL. EOL;
$diaspora = bb2diaspora($text);
$o .= "<h2>" . t("bb2md: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($diaspora) . EOL. EOL;
$o .= "<h2>" . t("bb2md: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($diaspora) . EOL. EOL;
$html = Markdown($diaspora);
$o .= "<h2>" . t("bb2md2html: ") . "</h2>" . EOL. EOL;
$o .= $html. EOL. EOL;
$o .= "<h2>" . t("bb2md2html: ") . "</h2>" . EOL. EOL;
$o .= $html. EOL. EOL;
$bbcode = diaspora2bb($diaspora);
$o .= "<h2>" . t("bb2dia2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bbcode) . EOL. EOL;
$o .= "<h2>" . t("bb2dia2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bbcode) . EOL. EOL;
$bbcode = html2bbcode($html);
$o .= "<h2>" . t("bb2md2html2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bbcode) . EOL. EOL;
$o .= "<h2>" . t("bb2md2html2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bbcode) . EOL. EOL;
@ -66,14 +67,15 @@ function babel_content(&$a) {
if(x($_REQUEST,'d2bbtext')) {
$d2bbtext = trim($_REQUEST['d2bbtext']);
$o .= "<h2>" . t("Source input (Diaspora format): ") . "</h2>" . EOL. EOL;
$o .= visible_lf($d2bbtext) . EOL. EOL;
$o .= "<h2>" . t("Source input (Diaspora format): ") . "</h2>" . EOL. EOL;
$o .= visible_lf($d2bbtext) . EOL. EOL;
$bb = diaspora2bb($d2bbtext);
$o .= "<h2>" . t("diaspora2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bb) . EOL. EOL;
$o .= "<h2>" . t("diaspora2bb: ") . "</h2>" . EOL. EOL;
$o .= visible_lf($bb) . EOL. EOL;
}
return $o;
}
}

@ -1,12 +1,14 @@
<?php
require_once('include/conversation.php');
require_once('include/items.php');
if(! function_exists('bookmarklet_init')) {
function bookmarklet_init(&$a) {
$_GET["mode"] = "minimal";
}
}
if(! function_exists('bookmarklet_content')) {
function bookmarklet_content(&$a) {
if(!local_user()) {
$o = '<h2>'.t('Login').'</h2>';
@ -44,3 +46,4 @@ function bookmarklet_content(&$a) {
return $o;
}
}

@ -4,21 +4,28 @@
* General purpose landing page for plugins/addons
*/
if(! function_exists('cb_init')) {
function cb_init(&$a) {
call_hooks('cb_init');
}
}
if(! function_exists('cb_post')) {
function cb_post(&$a) {
call_hooks('cb_post', $_POST);
}
}
if(! function_exists('cb_afterpost')) {
function cb_afterpost(&$a) {
call_hooks('cb_afterpost');
}
}
if(! function_exists('cb_content')) {
function cb_content(&$a) {
$o = '';
call_hooks('cb_content', $o);
return $o;
}
}
}

@ -5,6 +5,7 @@ require_once('include/Contact.php');
require_once('include/contact_selectors.php');
require_once('mod/contacts.php');
if(! function_exists('common_content')) {
function common_content(&$a) {
$o = '';
@ -144,3 +145,4 @@ function common_content(&$a) {
return $o;
}
}

@ -1,15 +1,14 @@
<?php
if(! function_exists('community_init')) {
function community_init(&$a) {
if(! local_user()) {
unset($_SESSION['theme']);
unset($_SESSION['mobile-theme']);
}
}
}
if(! function_exists('community_content')) {
function community_content(&$a, $update = 0) {
$o = '';
@ -115,7 +114,9 @@ function community_content(&$a, $update = 0) {
return $o;
}
}
if(! function_exists('community_getitems')) {
function community_getitems($start, $itemspage) {
if (get_config('system','community_page_style') == CP_GLOBAL_COMMUNITY)
return(community_getpublicitems($start, $itemspage));
@ -140,9 +141,10 @@ function community_getitems($start, $itemspage) {
);
return($r);
}
}
if(! function_exists('community_getpublicitems')) {
function community_getpublicitems($start, $itemspage) {
$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
`author-name` AS `name`, `owner-avatar` AS `photo`,
@ -157,3 +159,4 @@ function community_getpublicitems($start, $itemspage) {
return($r);
}
}

@ -2,6 +2,7 @@
require_once('include/group.php');
if(! function_exists('contactgroup_content')) {
function contactgroup_content(&$a) {
@ -47,4 +48,5 @@ function contactgroup_content(&$a) {
}
killme();
}
}
}

@ -7,6 +7,7 @@ require_once('include/Scrape.php');
require_once('mod/proxy.php');
require_once('include/Photo.php');
if(! function_exists('contacts_init')) {
function contacts_init(&$a) {
if(! local_user())
return;
@ -38,7 +39,7 @@ function contacts_init(&$a) {
if (($a->data['contact']['network'] != "") AND ($a->data['contact']['network'] != NETWORK_DFRN)) {
$networkname = format_network_name($a->data['contact']['network'],$a->data['contact']['url']);
} else
} else
$networkname = '';
$vcard_widget = replace_macros(get_markup_template("vcard-widget.tpl"),array(
@ -88,9 +89,10 @@ function contacts_init(&$a) {
'$base' => $base
));
}
}
if(! function_exists('contacts_batch_actions')) {
function contacts_batch_actions(&$a){
$contacts_id = $_POST['contact_batch'];
if (!is_array($contacts_id)) return;
@ -132,10 +134,10 @@ function contacts_batch_actions(&$a){
goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
else
goaway($a->get_baseurl(true) . '/contacts');
}
}
if(! function_exists('contacts_post')) {
function contacts_post(&$a) {
if(! local_user())
@ -215,10 +217,11 @@ function contacts_post(&$a) {
$a->data['contact'] = $r[0];
return;
}
}
/*contact actions*/
if(! function_exists('_contact_update')) {
function _contact_update($contact_id) {
$r = q("SELECT `uid`, `url`, `network` FROM `contact` WHERE `id` = %d", intval($contact_id));
if (!$r)
@ -239,7 +242,9 @@ function _contact_update($contact_id) {
// pull feed and consume it, which should subscribe to the hub.
proc_run('php',"include/onepoll.php","$contact_id", "force");
}
}
if(! function_exists('_contact_update_profile')) {