mirror of
https://github.com/friendica/friendica
synced 2024-09-10 11:41:27 +02:00
Merge remote-tracking branch 'refs/remotes/friendica/develop' into develop
This commit is contained in:
commit
dbf7c7d9ad
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -48,3 +48,6 @@ nbproject
|
|||
/php_friendica.phpproj
|
||||
/php_friendica.sln
|
||||
/php_friendica.phpproj.user
|
||||
|
||||
#ignore things from transifex-client
|
||||
venv/
|
||||
|
|
9
.tx/config
Normal file
9
.tx/config
Normal file
|
@ -0,0 +1,9 @@
|
|||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[friendica.messagespo]
|
||||
file_filter = view/lang/<lang>/messages.po
|
||||
source_file = util/messages.po
|
||||
source_lang = en
|
||||
type = PO
|
||||
|
2
LICENSE
2
LICENSE
|
@ -1,5 +1,5 @@
|
|||
Friendica Communications Server
|
||||
Copyright (c) 2010-2016 the Friendica Project
|
||||
Copyright (c) 2010-2017 the Friendica Project
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
|
|
10
boot.php
10
boot.php
|
@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica');
|
|||
define ( 'FRIENDICA_CODENAME', 'Asparagus');
|
||||
define ( 'FRIENDICA_VERSION', '3.5.1-dev' );
|
||||
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
|
||||
define ( 'DB_UPDATE_VERSION', 1211 );
|
||||
define ( 'DB_UPDATE_VERSION', 1212 );
|
||||
|
||||
/**
|
||||
* @brief Constant with a HTML line break.
|
||||
|
@ -1540,7 +1540,7 @@ function check_db() {
|
|||
* Sets the base url for use in cmdline programs which don't have
|
||||
* $_SERVER variables
|
||||
*/
|
||||
function check_url(App &$a) {
|
||||
function check_url(App $a) {
|
||||
|
||||
$url = get_config('system','url');
|
||||
|
||||
|
@ -1562,7 +1562,7 @@ function check_url(App &$a) {
|
|||
/**
|
||||
* @brief Automatic database updates
|
||||
*/
|
||||
function update_db(App &$a) {
|
||||
function update_db(App $a) {
|
||||
$build = get_config('system','build');
|
||||
if(! x($build))
|
||||
$build = set_config('system','build',DB_UPDATE_VERSION);
|
||||
|
@ -1678,7 +1678,7 @@ function run_update_function($x) {
|
|||
* @param App $a
|
||||
*
|
||||
*/
|
||||
function check_plugins(App &$a) {
|
||||
function check_plugins(App $a) {
|
||||
|
||||
$r = q("SELECT * FROM `addon` WHERE `installed` = 1");
|
||||
if (dbm::is_result($r))
|
||||
|
@ -2414,7 +2414,7 @@ function get_temppath() {
|
|||
}
|
||||
|
||||
/// @deprecated
|
||||
function set_template_engine(App &$a, $engine = 'internal') {
|
||||
function set_template_engine(App $a, $engine = 'internal') {
|
||||
/// @note This function is no longer necessary, but keep it as a wrapper to the class method
|
||||
/// to avoid breaking themes again unnecessarily
|
||||
|
||||
|
|
94
database.sql
94
database.sql
|
@ -1,6 +1,6 @@
|
|||
-- ------------------------------------------
|
||||
-- Friendica 3.5.1-dev (Asparagus)
|
||||
-- DB_UPDATE_VERSION 1211
|
||||
-- DB_UPDATE_VERSION 1212
|
||||
-- ------------------------------------------
|
||||
|
||||
|
||||
|
@ -174,9 +174,16 @@ CREATE TABLE IF NOT EXISTS `contact` (
|
|||
`fetch_further_information` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`ffi_keyword_blacklist` mediumtext,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`),
|
||||
INDEX `addr_uid` (`addr`,`uid`),
|
||||
INDEX `nurl` (`nurl`)
|
||||
INDEX `uid_name` (`uid`,`name`),
|
||||
INDEX `uid_self` (`uid`,`self`),
|
||||
INDEX `alias_uid` (`alias`(32),`uid`),
|
||||
INDEX `uid_pending` (`uid`,`pending`),
|
||||
INDEX `uid_blocked` (`uid`,`blocked`),
|
||||
INDEX `uid_rel_network_poll` (`uid`,`rel`,`network`,`poll`(64),`archive`),
|
||||
INDEX `uid_network_batch` (`uid`,`network`,`batch`(64)),
|
||||
INDEX `addr_uid` (`addr`(32),`uid`),
|
||||
INDEX `nurl_uid` (`nurl`(32),`uid`),
|
||||
INDEX `nick_uid` (`nick`(32),`uid`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -232,7 +239,7 @@ CREATE TABLE IF NOT EXISTS `event` (
|
|||
`deny_cid` mediumtext,
|
||||
`deny_gid` mediumtext,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`)
|
||||
INDEX `uid_start` (`uid`,`start`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -257,7 +264,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
|
|||
`pubkey` text,
|
||||
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `addr` (`addr`)
|
||||
INDEX `addr` (`addr`(32))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -280,7 +287,7 @@ CREATE TABLE IF NOT EXISTS `fserver` (
|
|||
`posturl` varchar(255) NOT NULL DEFAULT '',
|
||||
`key` text,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `server` (`server`)
|
||||
INDEX `server` (`server`(32))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -342,10 +349,10 @@ CREATE TABLE IF NOT EXISTS `gcontact` (
|
|||
`generation` tinyint(3) NOT NULL DEFAULT 0,
|
||||
`server_url` varchar(255) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `nurl` (`nurl`),
|
||||
INDEX `name` (`name`),
|
||||
INDEX `nick` (`nick`),
|
||||
INDEX `addr` (`addr`),
|
||||
INDEX `nurl` (`nurl`(32)),
|
||||
INDEX `name` (`name`(32)),
|
||||
INDEX `nick` (`nick`(32)),
|
||||
INDEX `addr` (`addr`(32)),
|
||||
INDEX `updated` (`updated`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
|
@ -360,7 +367,7 @@ CREATE TABLE IF NOT EXISTS `glink` (
|
|||
`zcid` int(11) NOT NULL DEFAULT 0,
|
||||
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `cid_uid_gcid_zcid` (`cid`,`uid`,`gcid`,`zcid`),
|
||||
UNIQUE INDEX `cid_uid_gcid_zcid` (`cid`,`uid`,`gcid`,`zcid`),
|
||||
INDEX `gcid` (`gcid`),
|
||||
INDEX `zcid` (`zcid`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
@ -387,7 +394,9 @@ CREATE TABLE IF NOT EXISTS `group_member` (
|
|||
`gid` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`contact-id` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid_gid_contactid` (`uid`,`gid`,`contact-id`)
|
||||
INDEX `cid_contactid` (`cid`,`contact-id`),
|
||||
INDEX `uid_contactid` (`uid`,`contact-id`),
|
||||
UNIQUE INDEX `uid_gid_contactid` (`uid`,`gid`,`contact-id`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -410,7 +419,7 @@ CREATE TABLE IF NOT EXISTS `gserver` (
|
|||
`last_contact` datetime DEFAULT '0000-00-00 00:00:00',
|
||||
`last_failure` datetime DEFAULT '0000-00-00 00:00:00',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `nurl` (`nurl`)
|
||||
INDEX `nurl` (`nurl`(32))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -525,24 +534,17 @@ CREATE TABLE IF NOT EXISTS `item` (
|
|||
INDEX `uid_network_received` (`uid`,`network`,`received`),
|
||||
INDEX `uid_received` (`uid`,`received`),
|
||||
INDEX `uid_network_commented` (`uid`,`network`,`commented`),
|
||||
INDEX `uid_commented` (`uid`,`commented`),
|
||||
INDEX `uid_title` (`uid`,`title`),
|
||||
INDEX `uid_thrparent` (`uid`,`thr-parent`),
|
||||
INDEX `uid_parenturi` (`uid`,`parent-uri`),
|
||||
INDEX `uid_contactid_id` (`uid`,`contact-id`,`id`),
|
||||
INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`),
|
||||
INDEX `gcontactid_uid_created` (`gcontact-id`,`uid`,`created`),
|
||||
INDEX `authorid_created` (`author-id`,`created`),
|
||||
INDEX `ownerid_created` (`owner-id`,`created`),
|
||||
INDEX `wall_body` (`wall`,`body`(6)),
|
||||
INDEX `uid_visible_moderated_created` (`uid`,`visible`,`moderated`,`created`),
|
||||
INDEX `uid_uri` (`uid`,`uri`),
|
||||
INDEX `uid_wall_created` (`uid`,`wall`,`created`),
|
||||
INDEX `resource-id` (`resource-id`),
|
||||
INDEX `uid_type` (`uid`,`type`),
|
||||
INDEX `uid_starred_id` (`uid`,`starred`,`id`),
|
||||
INDEX `contactid_allowcid_allowpid_denycid_denygid` (`contact-id`,`allow_cid`(10),`allow_gid`(10),`deny_cid`(10),`deny_gid`(10)),
|
||||
INDEX `uid_wall_parent_created` (`uid`,`wall`,`parent`,`created`),
|
||||
INDEX `uid_type_changed` (`uid`,`type`,`changed`),
|
||||
INDEX `contactid_verb` (`contact-id`,`verb`),
|
||||
INDEX `deleted_changed` (`deleted`,`changed`),
|
||||
|
@ -564,7 +566,7 @@ CREATE TABLE IF NOT EXISTS `item_id` (
|
|||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`),
|
||||
INDEX `sid` (`sid`),
|
||||
INDEX `service` (`service`),
|
||||
INDEX `service` (`service`(32)),
|
||||
INDEX `iid` (`iid`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
|
@ -602,11 +604,10 @@ CREATE TABLE IF NOT EXISTS `mail` (
|
|||
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`),
|
||||
INDEX `guid` (`guid`),
|
||||
INDEX `uid_seen` (`uid`,`seen`),
|
||||
INDEX `convid` (`convid`),
|
||||
INDEX `reply` (`reply`),
|
||||
INDEX `uri` (`uri`),
|
||||
INDEX `parent-uri` (`parent-uri`)
|
||||
INDEX `uri` (`uri`(64)),
|
||||
INDEX `parent-uri` (`parent-uri`(64))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -662,7 +663,11 @@ CREATE TABLE IF NOT EXISTS `notify` (
|
|||
`name_cache` tinytext,
|
||||
`msg_cache` mediumtext,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`)
|
||||
INDEX `uid_hash` (`uid`,`hash`),
|
||||
INDEX `uid_seen_date` (`uid`,`seen`,`date`),
|
||||
INDEX `uid_type_link` (`uid`,`type`,`link`),
|
||||
INDEX `uid_link` (`uid`,`link`),
|
||||
INDEX `uid_date` (`uid`,`date`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -675,8 +680,7 @@ CREATE TABLE IF NOT EXISTS `notify-threads` (
|
|||
`parent-item` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
`receiver-uid` int(11) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `master-parent-item` (`master-parent-item`),
|
||||
INDEX `receiver-uid` (`receiver-uid`)
|
||||
INDEX `master-parent-item` (`master-parent-item`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -745,9 +749,9 @@ CREATE TABLE IF NOT EXISTS `photo` (
|
|||
PRIMARY KEY(`id`),
|
||||
INDEX `uid_contactid` (`uid`,`contact-id`),
|
||||
INDEX `uid_profile` (`uid`,`profile`),
|
||||
INDEX `uid_album_created` (`uid`,`album`,`created`),
|
||||
INDEX `resource-id` (`resource-id`),
|
||||
INDEX `guid` (`guid`)
|
||||
INDEX `uid_album_created` (`uid`,`album`(32),`created`),
|
||||
INDEX `uid_album_resource-id_created` (`uid`,`album`(32),`resource-id`(64),`created`),
|
||||
INDEX `resource-id` (`resource-id`(64))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -839,8 +843,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
|
|||
`thumb` varchar(255) NOT NULL DEFAULT '',
|
||||
`publish` tinyint(1) NOT NULL DEFAULT 0,
|
||||
`net-publish` tinyint(1) NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `hometown` (`hometown`)
|
||||
PRIMARY KEY(`id`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -912,8 +915,7 @@ CREATE TABLE IF NOT EXISTS `search` (
|
|||
`uid` int(11) NOT NULL DEFAULT 0,
|
||||
`term` varchar(255) NOT NULL DEFAULT '',
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `uid` (`uid`),
|
||||
INDEX `term` (`term`)
|
||||
INDEX `uid` (`uid`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -925,7 +927,7 @@ CREATE TABLE IF NOT EXISTS `session` (
|
|||
`data` text,
|
||||
`expire` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `sid` (`sid`),
|
||||
INDEX `sid` (`sid`(64)),
|
||||
INDEX `expire` (`expire`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
|
@ -977,12 +979,11 @@ CREATE TABLE IF NOT EXISTS `term` (
|
|||
`uid` int(10) unsigned NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY(`tid`),
|
||||
INDEX `oid_otype_type_term` (`oid`,`otype`,`type`,`term`),
|
||||
INDEX `uid_term_tid` (`uid`,`term`,`tid`),
|
||||
INDEX `type_term` (`type`,`term`),
|
||||
INDEX `uid_otype_type_term_global_created` (`uid`,`otype`,`type`,`term`,`global`,`created`),
|
||||
INDEX `otype_type_term_tid` (`otype`,`type`,`term`,`tid`),
|
||||
INDEX `uid_otype_type_url` (`uid`,`otype`,`type`,`url`),
|
||||
INDEX `guid` (`guid`)
|
||||
INDEX `uid_term_tid` (`uid`,`term`(32),`tid`),
|
||||
INDEX `type_term` (`type`,`term`(32)),
|
||||
INDEX `uid_otype_type_term_global_created` (`uid`,`otype`,`type`,`term`(32),`global`,`created`),
|
||||
INDEX `uid_otype_type_url` (`uid`,`otype`,`type`,`url`(64)),
|
||||
INDEX `guid` (`guid`(64))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -1022,9 +1023,6 @@ CREATE TABLE IF NOT EXISTS `thread` (
|
|||
INDEX `uid_network_created` (`uid`,`network`,`created`),
|
||||
INDEX `uid_contactid_commented` (`uid`,`contact-id`,`commented`),
|
||||
INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`),
|
||||
INDEX `uid_gcontactid_commented` (`uid`,`gcontact-id`,`commented`),
|
||||
INDEX `uid_gcontactid_created` (`uid`,`gcontact-id`,`created`),
|
||||
INDEX `wall_private_received` (`wall`,`private`,`received`),
|
||||
INDEX `uid_created` (`uid`,`created`),
|
||||
INDEX `uid_commented` (`uid`,`commented`)
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
@ -1090,7 +1088,7 @@ CREATE TABLE IF NOT EXISTS `user` (
|
|||
`deny_gid` mediumtext,
|
||||
`openidserver` text,
|
||||
PRIMARY KEY(`uid`),
|
||||
INDEX `nickname` (`nickname`)
|
||||
INDEX `nickname` (`nickname`(32))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
@ -1100,7 +1098,7 @@ CREATE TABLE IF NOT EXISTS `userd` (
|
|||
`id` int(11) NOT NULL auto_increment,
|
||||
`username` varchar(255) NOT NULL,
|
||||
PRIMARY KEY(`id`),
|
||||
INDEX `username` (`username`)
|
||||
INDEX `username` (`username`(32))
|
||||
) DEFAULT CHARSET=utf8mb4;
|
||||
|
||||
--
|
||||
|
|
26
doc/FAQ.md
26
doc/FAQ.md
|
@ -43,29 +43,29 @@ We recommend to talk to the admin(s) of the affected friendica server. (Admins,
|
|||
|
||||
###How can I upload images, files, links, videos and sound files to posts?
|
||||
|
||||
You can upload images from your computer by using the [editor](help/Text_editor).
|
||||
You can upload images from your computer using the [editor](help/Text_editor).
|
||||
An overview of all uploaded images is listed at *yourpage.com/photos/profilename*.
|
||||
On that page, you can also upload images directly and choose, if your contacts shall receive a message about this upload.
|
||||
On that page, you can also upload images directly and choose if your contacts will receive a message about this upload.
|
||||
|
||||
Generally, you could attach every kind of file to a post.
|
||||
Generally, you can attach any kind of file to a post.
|
||||
This is possible by using the "paper-clip"-symbol in the editor.
|
||||
These files will be linked to your post and can be downloaded by your contacts.
|
||||
But it's not possible to get a preview for these ones.
|
||||
Because of this, this upload method is recommended for office or zipped files.
|
||||
If you want share content from Dropbox, Owncloud or any other [filehoster](http://en.wikipedia.org/wiki/Comparison_of_file_hosting_services), use the "link"-button (chain-symbol).
|
||||
But it's not possible to get a preview for these items.
|
||||
Because of this, this upload method is only recommended for office or zipped files.
|
||||
If you want to share content from Dropbox, Owncloud or any other [filehoster](http://en.wikipedia.org/wiki/Comparison_of_file_hosting_services), use the "link"-button (chain-symbol).
|
||||
|
||||
When you're adding URLs of other webpages with the "link"-button, Friendica tries to create a small preview.
|
||||
If this doesn't work, try to add the link by typing: [url=http://example.com]*self-chosen name*[/url].
|
||||
|
||||
You can also add video and audio files to posts.
|
||||
But instead of a direct upload you have to use one of the following methods:
|
||||
However, instead of a direct upload you have to use one of the following methods:
|
||||
|
||||
1. Add the video or audio link of a hoster (Youtube, Vimeo, Soundcloud and everyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start it. SoundCloud directly inserts a player to your post.
|
||||
1. Add the video or audio link of a hoster (Youtube, Vimeo, Soundcloud and anyone else with oembed/opengraph-support). Videos will be shown with a preview image you can click on to start. SoundCloud directly inserts a player to your post.
|
||||
|
||||
2. If you have your own server, you can upload multimedia files via FTP and insert the URL.
|
||||
|
||||
Friendica is using HTML5 for embedding content.
|
||||
Therefore, the supported files are depending on your browser and operating system.
|
||||
Friendica uses HTML5 for embedding content.
|
||||
Therefore, the supported files are dependent on your browser and operating system.
|
||||
Some supported filetypes are WebM, MP4, MP3 and OGG.
|
||||
See Wikipedia for more of them ([video](http://en.wikipedia.org/wiki/HTML5_video), [audio](http://en.wikipedia.org/wiki/HTML5_audio)).
|
||||
|
||||
|
@ -188,7 +188,7 @@ Admin
|
|||
|
||||
###Can I configure multiple domains with the same code instance?
|
||||
|
||||
No, this function is not supported anymore starting from Friendica 3.3.
|
||||
No, this function is no longer supported from Friendica 3.3 onwards.
|
||||
|
||||
<a name="sources"></a>
|
||||
|
||||
|
@ -202,12 +202,12 @@ Addons are listed at [this page](https://github.com/friendica/friendica-addons).
|
|||
If you are searching for new themes, you can find them at [Friendica-Themes.com](http://friendica-themes.com/)
|
||||
|
||||
<a name="adminaccount1"></a>
|
||||
###I've changed the my email address now the admin panel is gone?
|
||||
###I've changed my email address now the admin panel is gone?
|
||||
|
||||
Have a look into your <tt>.htconfig.php</tt> and fix your email address there.
|
||||
|
||||
<a name="adminaccount2"></a>
|
||||
###Can there be more then just one admin for a node?
|
||||
###Can there be more then one admin for a node?
|
||||
|
||||
Yes. You just have to list more then one email address in the
|
||||
<tt>.htconfig.php</tt> file. The listed emails need to be separated by a comma.
|
||||
|
|
|
@ -40,7 +40,7 @@ Arguments
|
|||
---
|
||||
Your hook callback functions will be called with at least one and possibly two arguments
|
||||
|
||||
function myhook_function(&$a, &$b) {
|
||||
function myhook_function(App $a, &$b) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -77,9 +77,9 @@ This will include:
|
|||
$a->argc = 3
|
||||
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
|
||||
|
||||
Your module functions will often contain the function plugin_name_content(App &$a), which defines and returns the page body content.
|
||||
They may also contain plugin_name_post(App &$a) which is called before the _content function and typically handles the results of POST forms.
|
||||
You may also have plugin_name_init(App &$a) which is called very early on and often does module initialisation.
|
||||
Your module functions will often contain the function plugin_name_content(App $a), which defines and returns the page body content.
|
||||
They may also contain plugin_name_post(App $a) which is called before the _content function and typically handles the results of POST forms.
|
||||
You may also have plugin_name_init(App $a) which is called very early on and often does module initialisation.
|
||||
|
||||
Templates
|
||||
---
|
||||
|
@ -285,7 +285,7 @@ $b is an array with:
|
|||
is called after the other queries have passed.
|
||||
The registered function can add, change or remove the acl_lookup() variables.
|
||||
|
||||
'results' => array of the acl_lookup() vars
|
||||
'results' => array of the acl_lookup() vars
|
||||
|
||||
|
||||
Complete list of hook callbacks
|
||||
|
|
|
@ -32,7 +32,7 @@ Let's say you have a php file in "include/" that define a very useful class:
|
|||
file: include/ItemsManager.php
|
||||
<?php
|
||||
namespace \Friendica;
|
||||
|
||||
|
||||
class ItemsManager {
|
||||
public function getAll() { ... }
|
||||
public function getByID($id) { ... }
|
||||
|
@ -67,11 +67,11 @@ The code will be something like:
|
|||
```
|
||||
file: mod/network.php
|
||||
<?php
|
||||
|
||||
function network_content(App &$a) {
|
||||
|
||||
function network_content(App $a) {
|
||||
$itemsmanager = new \Friendica\ItemsManager();
|
||||
$items = $itemsmanager->getAll();
|
||||
|
||||
|
||||
// pass $items to template
|
||||
// return result
|
||||
}
|
||||
|
@ -86,7 +86,7 @@ Going further: now we have a bunch of "*Manager" classes that cause some code du
|
|||
file: include/BaseManager.php
|
||||
<?php
|
||||
namespace \Friendica;
|
||||
|
||||
|
||||
class BaseManager {
|
||||
public function thatFunctionEveryManagerUses() { ... }
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ and then let's change the ItemsManager class to use this code
|
|||
file: include/ItemsManager.php
|
||||
<?php
|
||||
namespace \Friendica;
|
||||
|
||||
|
||||
class ItemsManager extends BaseManager {
|
||||
public function getAll() { ... }
|
||||
public function getByID($id) { ... }
|
||||
|
@ -110,9 +110,9 @@ It works with the "BaseManager" example here, it works when we need to call stat
|
|||
|
||||
```
|
||||
file: include/dfrn.php
|
||||
<?php
|
||||
<?php
|
||||
namespace \Friendica;
|
||||
|
||||
|
||||
class dfrn {
|
||||
public static function mail($item, $owner) { ... }
|
||||
}
|
||||
|
@ -121,7 +121,7 @@ It works with the "BaseManager" example here, it works when we need to call stat
|
|||
```
|
||||
file: mod/mail.php
|
||||
<?php
|
||||
|
||||
|
||||
mail_post($a){
|
||||
...
|
||||
\Friendica\dfrn::mail($item, $owner);
|
||||
|
@ -134,15 +134,15 @@ If your code is in same namespace as the class you need, you don't need to prepe
|
|||
```
|
||||
file: include/delivery.php
|
||||
<?php
|
||||
|
||||
|
||||
namespace \Friendica;
|
||||
|
||||
// this is the same content of current include/delivery.php,
|
||||
|
||||
// this is the same content of current include/delivery.php,
|
||||
// but has been declared to be in "Friendica" namespace
|
||||
|
||||
|
||||
[...]
|
||||
switch($contact['network']) {
|
||||
|
||||
|
||||
case NETWORK_DFRN:
|
||||
if ($mail) {
|
||||
$item['body'] = ...
|
||||
|
@ -160,11 +160,11 @@ But if you want to use classes from another library, you need to use the full na
|
|||
|
||||
```
|
||||
<?php
|
||||
namespace \Frienidca;
|
||||
|
||||
namespace \Friendica;
|
||||
|
||||
class Diaspora {
|
||||
public function md2bbcode() {
|
||||
$html = \Michelf\MarkdownExtra::defaultTransform($text);
|
||||
$html = \Michelf\MarkdownExtra::defaultTransform($text);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -173,13 +173,13 @@ if you use that class in many places of the code and you don't want to write the
|
|||
|
||||
```
|
||||
<?php
|
||||
namespace \Frienidca;
|
||||
|
||||
namespace \Friendica;
|
||||
|
||||
use \Michelf\MarkdownExtra;
|
||||
|
||||
|
||||
class Diaspora {
|
||||
public function md2bbcode() {
|
||||
$html = MarkdownExtra::defaultTransform($text);
|
||||
$html = MarkdownExtra::defaultTransform($text);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
@ -190,7 +190,7 @@ You can go more deep if you want to, like:
|
|||
```
|
||||
<?php
|
||||
namespace \Friendica\Network;
|
||||
|
||||
|
||||
class DFRN {
|
||||
}
|
||||
```
|
||||
|
@ -200,7 +200,7 @@ or
|
|||
```
|
||||
<?php
|
||||
namespace \Friendica\DBA;
|
||||
|
||||
|
||||
class MySQL {
|
||||
}
|
||||
```
|
||||
|
|
|
@ -40,7 +40,7 @@ Argumente
|
|||
|
||||
Deine Hook-Callback-Funktion wird mit mindestens einem und bis zu zwei Argumenten aufgerufen
|
||||
|
||||
function myhook_function(&$a, &$b) {
|
||||
function myhook_function(App $a, &$b) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -67,9 +67,9 @@ So würde http://example.com/plugin/arg1/arg2 nach einem Modul "plugin" suchen u
|
|||
$a->argc = 3
|
||||
$a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
|
||||
|
||||
Deine Modulfunktionen umfassen oft die Funktion plugin_name_content(App &$a), welche den Seiteninhalt definiert und zurückgibt.
|
||||
Sie können auch plugin_name_post(App &$a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt.
|
||||
Du kannst ebenso plugin_name_init(App &$a) nutzen, was oft frühzeitig aufgerufen wird und das Modul initialisert.
|
||||
Deine Modulfunktionen umfassen oft die Funktion plugin_name_content(App $a), welche den Seiteninhalt definiert und zurückgibt.
|
||||
Sie können auch plugin_name_post(App $a) umfassen, welches vor der content-Funktion aufgerufen wird und normalerweise die Resultate der POST-Formulare handhabt.
|
||||
Du kannst ebenso plugin_name_init(App $a) nutzen, was oft frühzeitig aufgerufen wird und das Modul initialisert.
|
||||
|
||||
|
||||
Derzeitige Hooks
|
||||
|
@ -311,7 +311,7 @@ mod/photos.php: call_hooks('photo_post_end',intval($item_id));
|
|||
|
||||
mod/photos.php: call_hooks('photo_upload_form',$ret);
|
||||
|
||||
mod/friendica.php: call_hooks('about_hook', $o);
|
||||
mod/friendica.php: call_hooks('about_hook', $o);
|
||||
|
||||
mod/editpost.php: call_hooks('jot_tool', $jotplugins);
|
||||
|
||||
|
|
|
@ -25,6 +25,8 @@ Example: To set the directory value please add this line to your .htconfig.php:
|
|||
* **allowed_link_protocols** (Array) - Allowed protocols in links URLs, add at your own risk. http is always allowed.
|
||||
* **birthday_input_format** - Default value is "ymd".
|
||||
* **block_local_dir** (Boolean) - Blocks the access to the directory of the local users.
|
||||
* **curl_range_bytes** - Maximum number of bytes that should be fetched. Default is 0, which mean "no limit".
|
||||
* **dbclean** (Boolean) - Enable the automatic database cleanup process
|
||||
* **default_service_class** -
|
||||
* **delivery_batch_count** - Number of deliveries per process. Default value is 1. (Disabled when using the worker)
|
||||
* **diaspora_test** (Boolean) - For development only. Disables the message transfer.
|
||||
|
@ -45,7 +47,8 @@ Example: To set the directory value please add this line to your .htconfig.php:
|
|||
* **max_processes_frontend** - Maximum number of concurrent database processes for foreground tasks. Default value is 20.
|
||||
* **memcache** (Boolean) - Use memcache. To use memcache the PECL extension "memcache" has to be installed and activated.
|
||||
* **memcache_host** - Hostname of the memcache daemon. Default is '127.0.0.1'.
|
||||
* **memcache_port** - Portnumberof the memcache daemon. Default is 11211.
|
||||
* **memcache_port** - Portnumber of the memcache daemon. Default is 11211.
|
||||
* **no_count** (Boolean) - Don't do count calculations (currently only when showing albums)
|
||||
* **no_oembed** (Boolean) - Don't use OEmbed to fetch more information about a link.
|
||||
* **no_oembed_rich_content** (Boolean) - Don't show the rich content (e.g. embedded PDF).
|
||||
* **no_smilies** (Boolean) - Don't show smilies.
|
||||
|
|
|
@ -122,7 +122,7 @@ the 1st part of the line is the name of the CSS file (without the .css) the 2nd
|
|||
Calling the t() function with the common name makes the string translateable.
|
||||
The selected 1st part will be saved in the database by the theme_post function.
|
||||
|
||||
function theme_post(App &$a){
|
||||
function theme_post(App $a){
|
||||
// non local users shall not pass
|
||||
if (! local_user()) {
|
||||
return;
|
||||
|
@ -168,7 +168,7 @@ The content of this file should be something like
|
|||
|
||||
<?php
|
||||
/* meta informations for the theme, see below */
|
||||
function duepuntozero_lr_init(App &$a) {
|
||||
function duepuntozero_lr_init(App $a) {
|
||||
$a-> theme_info = array(
|
||||
'extends' => 'duepuntozero'.
|
||||
);
|
||||
|
@ -251,7 +251,7 @@ Next crucial part of the theme.php file is a definition of an init function.
|
|||
The name of the function is <theme-name>_init.
|
||||
So in the case of quattro it is
|
||||
|
||||
function quattro_init(App &$a) {
|
||||
function quattro_init(App $a) {
|
||||
$a->theme_info = array();
|
||||
set_template_engine($a, 'smarty3');
|
||||
}
|
||||
|
|
|
@ -612,7 +612,7 @@ function get_contact($url, $uid = 0, $no_update = false) {
|
|||
*
|
||||
* @return string posts in HTML
|
||||
*/
|
||||
function posts_from_gcontact($a, $gcontact_id) {
|
||||
function posts_from_gcontact(App $a, $gcontact_id) {
|
||||
|
||||
require_once('include/conversation.php');
|
||||
|
||||
|
@ -636,7 +636,7 @@ function posts_from_gcontact($a, $gcontact_id) {
|
|||
$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
|
||||
`author-name` AS `name`, `owner-avatar` AS `photo`,
|
||||
`owner-link` AS `url`, `owner-avatar` AS `thumb`
|
||||
FROM `item` FORCE INDEX (`gcontactid_uid_created`)
|
||||
FROM `item`
|
||||
WHERE `gcontact-id` = %d AND $sql AND
|
||||
NOT `deleted` AND NOT `moderated` AND `visible`
|
||||
ORDER BY `item`.`created` DESC LIMIT %d, %d",
|
||||
|
@ -664,7 +664,7 @@ function posts_from_gcontact($a, $gcontact_id) {
|
|||
*
|
||||
* @return string posts in HTML
|
||||
*/
|
||||
function posts_from_contact_url($a, $contact_url) {
|
||||
function posts_from_contact_url(App $a, $contact_url) {
|
||||
|
||||
require_once('include/conversation.php');
|
||||
|
||||
|
|
|
@ -283,7 +283,7 @@ class Photo {
|
|||
do {
|
||||
|
||||
// FIXME - implement horizantal bias for scaling as in followin GD functions
|
||||
// to allow very tall images to be constrained only horizontally.
|
||||
// to allow very tall images to be constrained only horizontally.
|
||||
|
||||
$this->image->scaleImage($dest_width, $dest_height);
|
||||
} while ($this->image->nextImage());
|
||||
|
@ -943,7 +943,7 @@ function scale_image($width, $height, $max) {
|
|||
return array("width" => $dest_width, "height" => $dest_height);
|
||||
}
|
||||
|
||||
function store_photo($a, $uid, $imagedata = "", $url = "") {
|
||||
function store_photo(App $a, $uid, $imagedata = "", $url = "") {
|
||||
$r = q("SELECT `user`.`nickname`, `user`.`page-flags`, `contact`.`id` FROM `user` INNER JOIN `contact` on `user`.`uid` = `contact`.`uid`
|
||||
WHERE `user`.`uid` = %d AND `user`.`blocked` = 0 AND `contact`.`self` = 1 LIMIT 1",
|
||||
intval($uid));
|
||||
|
|
|
@ -715,11 +715,19 @@ class Probe {
|
|||
$photos = $xpath->query("//*[contains(concat(' ', @class, ' '), ' photo ') or contains(concat(' ', @class, ' '), ' avatar ')]", $vcard); // */
|
||||
foreach ($photos AS $photo) {
|
||||
$attr = array();
|
||||
foreach ($photo->attributes as $attribute)
|
||||
foreach ($photo->attributes as $attribute) {
|
||||
$attr[$attribute->name] = trim($attribute->value);
|
||||
}
|
||||
|
||||
if (isset($attr["src"]) AND isset($attr["width"]))
|
||||
if (isset($attr["src"]) AND isset($attr["width"])) {
|
||||
$avatar[$attr["width"]] = $attr["src"];
|
||||
}
|
||||
|
||||
// We don't have a width. So we just take everything that we got.
|
||||
// This is a Hubzilla workaround which doesn't send a width.
|
||||
if ((sizeof($avatar) == 0) AND isset($attr["src"])) {
|
||||
$avatar[] = $attr["src"];
|
||||
}
|
||||
}
|
||||
|
||||
if (sizeof($avatar)) {
|
||||
|
|
|
@ -135,7 +135,7 @@ function contact_selector($selname, $selclass, $preselected = false, $options) {
|
|||
$o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"" . $x['size'] . "$\" $tabindex >\r\n";
|
||||
|
||||
$r = q("SELECT `id`, `name`, `url`, `network` FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
|
||||
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
|
||||
$sql_extra
|
||||
ORDER BY `name` ASC ",
|
||||
intval(local_user())
|
||||
|
@ -210,7 +210,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
|
|||
$o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" $tabindex >\r\n";
|
||||
|
||||
$r = q("SELECT `id`, `name`, `url`, `network` FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
|
||||
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
|
||||
$sql_extra
|
||||
ORDER BY `name` ASC ",
|
||||
intval(local_user())
|
||||
|
@ -372,7 +372,7 @@ function populate_acl($user = null, $show_jotnets = false) {
|
|||
|
||||
}
|
||||
|
||||
function construct_acl_data(&$a, $user) {
|
||||
function construct_acl_data(App $a, $user) {
|
||||
|
||||
// Get group and contact information for html ACL selector
|
||||
$acl_data = acl_lookup($a, 'html');
|
||||
|
@ -404,7 +404,7 @@ function construct_acl_data(&$a, $user) {
|
|||
|
||||
}
|
||||
|
||||
function acl_lookup(&$a, $out_type = 'json') {
|
||||
function acl_lookup(App $a, $out_type = 'json') {
|
||||
|
||||
if (!local_user()) {
|
||||
return '';
|
||||
|
@ -449,8 +449,8 @@ function acl_lookup(&$a, $out_type = 'json') {
|
|||
// autocomplete for editor mentions
|
||||
if ($type=='' || $type=='c'){
|
||||
$r = q("SELECT COUNT(*) AS c FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0
|
||||
AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0
|
||||
WHERE `uid` = %d AND NOT `self`
|
||||
AND NOT `blocked` AND NOT `pending` AND NOT `archive`
|
||||
AND `notify` != '' $sql_extra2" ,
|
||||
intval(local_user())
|
||||
);
|
||||
|
@ -461,8 +461,8 @@ function acl_lookup(&$a, $out_type = 'json') {
|
|||
// autocomplete for Private Messages
|
||||
|
||||
$r = q("SELECT COUNT(*) AS c FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0
|
||||
AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0
|
||||
WHERE `uid` = %d AND NOT `self`
|
||||
AND NOT `blocked` AND NOT `pending` AND NOT `archive`
|
||||
AND `network` IN ('%s','%s','%s') $sql_extra2" ,
|
||||
intval(local_user()),
|
||||
dbesc(NETWORK_DFRN),
|
||||
|
@ -477,8 +477,8 @@ function acl_lookup(&$a, $out_type = 'json') {
|
|||
// autocomplete for Contacts
|
||||
|
||||
$r = q("SELECT COUNT(*) AS c FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0
|
||||
AND `pending` = 0 $sql_extra2" ,
|
||||
WHERE `uid` = %d AND NOT `self`
|
||||
AND NOT `pending` $sql_extra2" ,
|
||||
intval(local_user())
|
||||
);
|
||||
$contact_count = (int)$r[0]['c'];
|
||||
|
@ -525,7 +525,7 @@ function acl_lookup(&$a, $out_type = 'json') {
|
|||
if ($type==''){
|
||||
|
||||
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `forum`, `prv` FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
|
||||
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
|
||||
AND NOT (`network` IN ('%s', '%s'))
|
||||
$sql_extra2
|
||||
ORDER BY `name` ASC ",
|
||||
|
@ -536,7 +536,7 @@ function acl_lookup(&$a, $out_type = 'json') {
|
|||
elseif ($type=='c'){
|
||||
|
||||
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `forum`, `prv` FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
|
||||
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != ''
|
||||
AND NOT (`network` IN ('%s'))
|
||||
$sql_extra2
|
||||
ORDER BY `name` ASC ",
|
||||
|
@ -546,7 +546,7 @@ function acl_lookup(&$a, $out_type = 'json') {
|
|||
}
|
||||
elseif($type == 'm') {
|
||||
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag` FROM `contact`
|
||||
WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0
|
||||
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive`
|
||||
AND `network` IN ('%s','%s','%s')
|
||||
$sql_extra2
|
||||
ORDER BY `name` ASC ",
|
||||
|
@ -687,11 +687,11 @@ function acl_lookup(&$a, $out_type = 'json') {
|
|||
}
|
||||
/**
|
||||
* @brief Searching for global contacts for autocompletion
|
||||
*
|
||||
*
|
||||
* @param App $a
|
||||
* @return array with the search results
|
||||
*/
|
||||
function navbar_complete(App &$a) {
|
||||
function navbar_complete(App $a) {
|
||||
|
||||
// logger('navbar_complete');
|
||||
|
||||
|
|
|
@ -133,7 +133,7 @@
|
|||
* @hook 'logged_in'
|
||||
* array $user logged user record
|
||||
*/
|
||||
function api_login(App &$a){
|
||||
function api_login(App $a){
|
||||
// login with oauth
|
||||
try{
|
||||
$oauth = new FKOAuth1();
|
||||
|
@ -251,7 +251,7 @@
|
|||
* @param App $a
|
||||
* @return string API call result
|
||||
*/
|
||||
function api_call(App &$a){
|
||||
function api_call(App $a){
|
||||
global $API, $called_api;
|
||||
|
||||
$type="json";
|
||||
|
@ -404,7 +404,7 @@
|
|||
* @param array $user_info
|
||||
* @return array
|
||||
*/
|
||||
function api_rss_extra(&$a, $arr, $user_info){
|
||||
function api_rss_extra(App $a, $arr, $user_info){
|
||||
if (is_null($user_info)) $user_info = api_get_user($a);
|
||||
$arr['$user'] = $user_info;
|
||||
$arr['$rss'] = array(
|
||||
|
@ -444,7 +444,7 @@
|
|||
* @param int|string $contact_id Contact ID or URL
|
||||
* @param string $type Return type (for errors)
|
||||
*/
|
||||
function api_get_user(&$a, $contact_id = Null, $type = "json"){
|
||||
function api_get_user(App $a, $contact_id = Null, $type = "json"){
|
||||
global $called_api;
|
||||
$user = null;
|
||||
$extra_query = "";
|
||||
|
@ -712,7 +712,7 @@
|
|||
* @param array $item : item from db
|
||||
* @return array(array:author, array:owner)
|
||||
*/
|
||||
function api_item_get_user(&$a, $item) {
|
||||
function api_item_get_user(App $a, $item) {
|
||||
|
||||
$status_user = api_get_user($a, $item["author-link"]);
|
||||
|
||||
|
@ -2344,6 +2344,9 @@
|
|||
* dislikes => int count
|
||||
*/
|
||||
function api_format_items_activities(&$item, $type = "json") {
|
||||
|
||||
$a = get_app();
|
||||
|
||||
$activities = array(
|
||||
'like' => array(),
|
||||
'dislike' => array(),
|
||||
|
@ -2451,7 +2454,7 @@
|
|||
'homepage' => $profile['homepage'],
|
||||
'users' => null);
|
||||
return $profile;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2521,9 +2524,9 @@
|
|||
|
||||
// Retweets are only valid for top postings
|
||||
// It doesn't work reliable with the link if its a feed
|
||||
#$IsRetweet = ($item['owner-link'] != $item['author-link']);
|
||||
#if ($IsRetweet)
|
||||
# $IsRetweet = (($item['owner-name'] != $item['author-name']) OR ($item['owner-avatar'] != $item['author-avatar']));
|
||||
//$IsRetweet = ($item['owner-link'] != $item['author-link']);
|
||||
//if ($IsRetweet)
|
||||
// $IsRetweet = (($item['owner-name'] != $item['author-name']) OR ($item['owner-avatar'] != $item['author-avatar']));
|
||||
|
||||
|
||||
if ($item["id"] == $item["parent"]) {
|
||||
|
@ -2874,14 +2877,14 @@
|
|||
// BadRequestException if no id specified (for clients using Twitter API)
|
||||
if ($id == 0) throw new BadRequestException('Message id not specified');
|
||||
|
||||
// add parent-uri to sql command if specified by calling app
|
||||
// add parent-uri to sql command if specified by calling app
|
||||
$sql_extra = ($parenturi != "" ? " AND `parent-uri` = '" . dbesc($parenturi) . "'" : "");
|
||||
|
||||
// get data of the specified message id
|
||||
$r = q("SELECT `id` FROM `mail` WHERE `uid` = %d AND `id` = %d" . $sql_extra,
|
||||
intval($uid),
|
||||
intval($uid),
|
||||
intval($id));
|
||||
|
||||
|
||||
// error message if specified id is not in database
|
||||
if (!dbm::is_result($r)) {
|
||||
if ($verbose == "true") {
|
||||
|
@ -2893,8 +2896,8 @@
|
|||
}
|
||||
|
||||
// delete message
|
||||
$result = q("DELETE FROM `mail` WHERE `uid` = %d AND `id` = %d" . $sql_extra,
|
||||
intval($uid),
|
||||
$result = q("DELETE FROM `mail` WHERE `uid` = %d AND `id` = %d" . $sql_extra,
|
||||
intval($uid),
|
||||
intval($id));
|
||||
|
||||
if ($verbose == "true") {
|
||||
|
@ -3860,7 +3863,7 @@
|
|||
|
||||
// get data of the specified message id
|
||||
$r = q("SELECT `id` FROM `mail` WHERE `id` = %d AND `uid` = %d",
|
||||
intval($id),
|
||||
intval($id),
|
||||
intval($uid));
|
||||
// error message if specified id is not in database
|
||||
if (!dbm::is_result($r)) {
|
||||
|
@ -3869,8 +3872,8 @@
|
|||
}
|
||||
|
||||
// update seen indicator
|
||||
$result = q("UPDATE `mail` SET `seen` = 1 WHERE `id` = %d AND `uid` = %d",
|
||||
intval($id),
|
||||
$result = q("UPDATE `mail` SET `seen` = 1 WHERE `id` = %d AND `uid` = %d",
|
||||
intval($id),
|
||||
intval($uid));
|
||||
|
||||
if ($result) {
|
||||
|
@ -3921,7 +3924,7 @@
|
|||
// message if nothing was found
|
||||
if (!dbm::is_result($r))
|
||||
$success = array('success' => false, 'search_results' => 'problem with query');
|
||||
else if (count($r) == 0)
|
||||
else if (count($r) == 0)
|
||||
$success = array('success' => false, 'search_results' => 'nothing found');
|
||||
else {
|
||||
$ret = Array();
|
||||
|
|
|
@ -466,7 +466,7 @@ function item_condition() {
|
|||
*/
|
||||
|
||||
if(!function_exists('conversation')) {
|
||||
function conversation(&$a, $items, $mode, $update, $preview = false) {
|
||||
function conversation(App $a, $items, $mode, $update, $preview = false) {
|
||||
|
||||
require_once('include/bbcode.php');
|
||||
require_once('include/Contact.php');
|
||||
|
|
|
@ -128,7 +128,7 @@ function cron_run(&$argv, &$argc){
|
|||
|
||||
proc_run(PRIORITY_LOW, 'include/expire.php');
|
||||
|
||||
proc_run(PRIORITY_LOW, 'include/dbclean.php');
|
||||
proc_run(PRIORITY_MEDIUM, 'include/dbclean.php');
|
||||
|
||||
cron_update_photo_albums();
|
||||
}
|
||||
|
@ -264,8 +264,9 @@ function cron_poll_contacts($argc, $argv) {
|
|||
intval($c['id'])
|
||||
);
|
||||
|
||||
if (dbm::is_result($res))
|
||||
if (!dbm::is_result($res)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach($res as $contact) {
|
||||
|
||||
|
@ -343,7 +344,7 @@ function cron_poll_contacts($argc, $argv) {
|
|||
*
|
||||
* @param App $a
|
||||
*/
|
||||
function cron_clear_cache(App &$a) {
|
||||
function cron_clear_cache(App $a) {
|
||||
|
||||
$last = get_config('system','cache_last_cleared');
|
||||
|
||||
|
@ -430,7 +431,7 @@ function cron_clear_cache(App &$a) {
|
|||
*
|
||||
* @param App $a
|
||||
*/
|
||||
function cron_repair_diaspora(App &$a) {
|
||||
function cron_repair_diaspora(App $a) {
|
||||
$r = q("SELECT `id`, `url` FROM `contact`
|
||||
WHERE `network` = '%s' AND (`batch` = '' OR `notify` = '' OR `poll` = '' OR pubkey = '')
|
||||
ORDER BY RAND() LIMIT 50", dbesc(NETWORK_DIASPORA));
|
||||
|
|
|
@ -3,13 +3,18 @@
|
|||
* @file include/dbclean.php
|
||||
* @brief The script is called from time to time to clean the database entries and remove orphaned data.
|
||||
*/
|
||||
|
||||
use \Friendica\Core\Config;
|
||||
use \Friendica\Core\PConfig;
|
||||
|
||||
require_once("boot.php");
|
||||
|
||||
function dbclean_run(&$argv, &$argc) {
|
||||
global $a, $db;
|
||||
|
||||
if (is_null($a))
|
||||
if (is_null($a)) {
|
||||
$a = new App;
|
||||
}
|
||||
|
||||
if (is_null($db)) {
|
||||
@include(".htconfig.php");
|
||||
|
@ -18,8 +23,12 @@ function dbclean_run(&$argv, &$argc) {
|
|||
unset($db_host, $db_user, $db_pass, $db_data);
|
||||
}
|
||||
|
||||
load_config('config');
|
||||
load_config('system');
|
||||
Config::load('config');
|
||||
Config::load('system');
|
||||
|
||||
if (!Config::get('system', 'dbclean', false)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($argc == 2) {
|
||||
$stage = intval($argv[1]);
|
||||
|
@ -27,7 +36,7 @@ function dbclean_run(&$argv, &$argc) {
|
|||
$stage = 0;
|
||||
}
|
||||
|
||||
if (get_config("system", "worker") AND ($stage == 0)) {
|
||||
if (Config::get("system", "worker") AND ($stage == 0)) {
|
||||
proc_run(PRIORITY_LOW, 'include/dbclean.php', 1);
|
||||
proc_run(PRIORITY_LOW, 'include/dbclean.php', 2);
|
||||
proc_run(PRIORITY_LOW, 'include/dbclean.php', 3);
|
||||
|
@ -48,11 +57,18 @@ function remove_orphans($stage = 0) {
|
|||
|
||||
$count = 0;
|
||||
|
||||
// With activated worker we split the deletion in many small tasks
|
||||
if (Config::get("system", "worker")) {
|
||||
$limit = 1000;
|
||||
} else {
|
||||
$limit = 10000;
|
||||
}
|
||||
|
||||
if (($stage == 1) OR ($stage == 0)) {
|
||||
logger("Deleting old global item entries from item table without user copy");
|
||||
if ($db->q("SELECT `id` FROM `item` WHERE `uid` = 0
|
||||
AND NOT EXISTS (SELECT `guid` FROM `item` AS `i` WHERE `item`.`guid` = `i`.`guid` AND `i`.`uid` != 0)
|
||||
AND `received` < UTC_TIMESTAMP() - INTERVAL 90 DAY LIMIT 10000", true)) {
|
||||
AND `received` < UTC_TIMESTAMP() - INTERVAL 90 DAY LIMIT ".intval($limit), true)) {
|
||||
$count = $db->num_rows();
|
||||
logger("found global item orphans: ".$count);
|
||||
while ($orphan = $db->qfetch()) {
|
||||
|
@ -65,7 +81,7 @@ function remove_orphans($stage = 0) {
|
|||
|
||||
if (($stage == 2) OR ($stage == 0)) {
|
||||
logger("Deleting items without parents");
|
||||
if ($db->q("SELECT `id` FROM `item` WHERE NOT EXISTS (SELECT `id` FROM `item` AS `i` WHERE `item`.`parent` = `i`.`id`) LIMIT 10000", true)) {
|
||||
if ($db->q("SELECT `id` FROM `item` WHERE NOT EXISTS (SELECT `id` FROM `item` AS `i` WHERE `item`.`parent` = `i`.`id`) LIMIT ".intval($limit), true)) {
|
||||
$count = $db->num_rows();
|
||||
logger("found item orphans without parents: ".$count);
|
||||
while ($orphan = $db->qfetch()) {
|
||||
|
@ -78,7 +94,7 @@ function remove_orphans($stage = 0) {
|
|||
|
||||
if (($stage == 3) OR ($stage == 0)) {
|
||||
logger("Deleting orphaned data from thread table");
|
||||
if ($db->q("SELECT `iid` FROM `thread` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `thread`.`iid`)", true)) {
|
||||
if ($db->q("SELECT `iid` FROM `thread` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `thread`.`iid`) LIMIT ".intval($limit), true)) {
|
||||
$count = $db->num_rows();
|
||||
logger("found thread orphans: ".$count);
|
||||
while ($orphan = $db->qfetch()) {
|
||||
|
@ -91,7 +107,7 @@ function remove_orphans($stage = 0) {
|
|||
|
||||
if (($stage == 4) OR ($stage == 0)) {
|
||||
logger("Deleting orphaned data from notify table");
|
||||
if ($db->q("SELECT `iid` FROM `notify` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `notify`.`iid`)", true)) {
|
||||
if ($db->q("SELECT `iid` FROM `notify` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `notify`.`iid`) LIMIT ".intval($limit), true)) {
|
||||
$count = $db->num_rows();
|
||||
logger("found notify orphans: ".$count);
|
||||
while ($orphan = $db->qfetch()) {
|
||||
|
@ -104,7 +120,7 @@ function remove_orphans($stage = 0) {
|
|||
|
||||
if (($stage == 5) OR ($stage == 0)) {
|
||||
logger("Deleting orphaned data from notify-threads table");
|
||||
if ($db->q("SELECT `id` FROM `notify-threads` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `notify-threads`.`master-parent-item`)", true)) {
|
||||
if ($db->q("SELECT `id` FROM `notify-threads` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`parent` = `notify-threads`.`master-parent-item`) LIMIT ".intval($limit), true)) {
|
||||
$count = $db->num_rows();
|
||||
logger("found notify-threads orphans: ".$count);
|
||||
while ($orphan = $db->qfetch()) {
|
||||
|
@ -118,7 +134,7 @@ function remove_orphans($stage = 0) {
|
|||
|
||||
if (($stage == 6) OR ($stage == 0)) {
|
||||
logger("Deleting orphaned data from sign table");
|
||||
if ($db->q("SELECT `iid` FROM `sign` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `sign`.`iid`)", true)) {
|
||||
if ($db->q("SELECT `iid` FROM `sign` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `sign`.`iid`) LIMIT ".intval($limit), true)) {
|
||||
$count = $db->num_rows();
|
||||
logger("found sign orphans: ".$count);
|
||||
while ($orphan = $db->qfetch()) {
|
||||
|
@ -132,7 +148,7 @@ function remove_orphans($stage = 0) {
|
|||
|
||||
if (($stage == 7) OR ($stage == 0)) {
|
||||
logger("Deleting orphaned data from term table");
|
||||
if ($db->q("SELECT `oid` FROM `term` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `term`.`oid`)", true)) {
|
||||
if ($db->q("SELECT `oid` FROM `term` WHERE NOT EXISTS (SELECT `id` FROM `item` WHERE `item`.`id` = `term`.`oid`) LIMIT ".intval($limit), true)) {
|
||||
$count = $db->num_rows();
|
||||