Update more PHPDoc, including in include/
[friendica.git/.git] / src / Content / Feature.php
1 <?php
2 /**
3  * @file src/Content/Feature.php
4  * @brief Features management
5  */
6 namespace Friendica\Content;
7
8 use Friendica\Core\Config;
9 use Friendica\Core\Hook;
10 use Friendica\Core\L10n;
11 use Friendica\Core\PConfig;
12
13 class Feature
14 {
15         /**
16          * @brief check if feature is enabled
17          *
18          * @param integer $uid     user id
19          * @param string  $feature feature
20          * @return boolean
21          * @throws \Friendica\Network\HTTPException\InternalServerErrorException
22          */
23         public static function isEnabled($uid, $feature)
24         {
25                 $x = Config::get('feature_lock', $feature, false);
26
27                 if ($x === false) {
28                         $x = PConfig::get($uid, 'feature', $feature, false);
29                 }
30
31                 if ($x === false) {
32                         $x = Config::get('feature', $feature, false);
33                 }
34
35                 if ($x === false) {
36                         $x = self::getDefault($feature);
37                 }
38
39                 $arr = ['uid' => $uid, 'feature' => $feature, 'enabled' => $x];
40                 Hook::callAll('isEnabled', $arr);
41                 return($arr['enabled']);
42         }
43
44         /**
45          * @brief check if feature is enabled or disabled by default
46          *
47          * @param string $feature feature
48          * @return boolean
49          * @throws \Friendica\Network\HTTPException\InternalServerErrorException
50          */
51         private static function getDefault($feature)
52         {
53                 $f = self::get();
54                 foreach ($f as $cat) {
55                         foreach ($cat as $feat) {
56                                 if (is_array($feat) && $feat[0] === $feature) {
57                                         return $feat[3];
58                                 }
59                         }
60                 }
61                 return false;
62         }
63
64         /**
65          * @brief Get a list of all available features
66          *
67          * The array includes the setting group, the setting name,
68          * explainations for the setting and if it's enabled or disabled
69          * by default
70          *
71          * @param bool $filtered True removes any locked features
72          *
73          * @return array
74          * @throws \Friendica\Network\HTTPException\InternalServerErrorException
75          */
76         public static function get($filtered = true)
77         {
78                 $arr = [
79
80                         // General
81                         'general' => [
82                                 L10n::t('General Features'),
83                                 //array('expire',         L10n::t('Content Expiration'),                L10n::t('Remove old posts/comments after a period of time')),
84                                 ['multi_profiles',  L10n::t('Multiple Profiles'),      L10n::t('Ability to create multiple profiles'), false, Config::get('feature_lock', 'multi_profiles', false)],
85                                 ['photo_location',  L10n::t('Photo Location'),         L10n::t("Photo metadata is normally stripped. This extracts the location \x28if present\x29 prior to stripping metadata and links it to a map."), false, Config::get('feature_lock', 'photo_location', false)],
86                                 ['export_calendar', L10n::t('Export Public Calendar'), L10n::t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock', 'export_calendar', false)],
87                         ],
88
89                         // Post composition
90                         'composition' => [
91                                 L10n::t('Post Composition Features'),
92                                 ['aclautomention', L10n::t('Auto-mention Forums'), L10n::t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock', 'aclautomention', false)],
93                         ],
94
95                         // Network sidebar widgets
96                         'widgets' => [
97                                 L10n::t('Network Sidebar'),
98                                 ['archives',         L10n::t('Archives'), L10n::t('Ability to select posts by date ranges'), false, Config::get('feature_lock', 'archives', false)],
99                                 ['networks',         L10n::t('Protocol Filter'), L10n::t('Enable widget to display Network posts only from selected protocols'), false, Config::get('feature_lock', 'networks', false)],
100                         ],
101
102                         // Network tabs
103                         'net_tabs' => [
104                                 L10n::t('Network Tabs'),
105                                 ['new_tab',      L10n::t('Network New Tab'),          L10n::t("Enable tab to display only new Network posts \x28from the last 12 hours\x29"), false, Config::get('feature_lock', 'new_tab', false)],
106                                 ['link_tab',     L10n::t('Network Shared Links Tab'), L10n::t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock', 'link_tab', false)],
107                         ],
108
109                         // Item tools
110                         'tools' => [
111                                 L10n::t('Post/Comment Tools'),
112                                 ['categories',   L10n::t('Post Categories'),         L10n::t('Add categories to your posts'), false, Config::get('feature_lock', 'categories', false)],
113                         ],
114
115                         // Advanced Profile Settings
116                         'advanced_profile' => [
117                                 L10n::t('Advanced Profile Settings'),
118                                 ['forumlist_profile',   L10n::t('List Forums'),             L10n::t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock', 'forumlist_profile', false)],
119                                 ['tagadelic',           L10n::t('Tag Cloud'),               L10n::t('Provide a personal tag cloud on your profile page'), false, Config::get('feature_lock', 'tagadelic', false)],
120                                 ['profile_membersince', L10n::t('Display Membership Date'), L10n::t('Display membership date in profile'), false, Config::get('feature_lock', 'profile_membersince', false)],
121                         ],
122                 ];
123
124                 // removed any locked features and remove the entire category if this makes it empty
125
126                 if ($filtered) {
127                         foreach ($arr as $k => $x) {
128                                 $has_items = false;
129                                 $kquantity = count($arr[$k]);
130                                 for ($y = 0; $y < $kquantity; $y ++) {
131                                         if (is_array($arr[$k][$y])) {
132                                                 if ($arr[$k][$y][4] === false) {
133                                                         $has_items = true;
134                                                 } else {
135                                                         unset($arr[$k][$y]);
136                                                 }
137                                         }
138                                 }
139                                 if (! $has_items) {
140                                         unset($arr[$k]);
141                                 }
142                         }
143                 }
144
145                 Hook::callAll('get', $arr);
146                 return $arr;
147         }
148 }