X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FContent%2FWidget.php;h=86339928702dadadd879f02e1dbef365d6785d8d;hb=70392df68d4e5e0881c1184e7d368593ccfa7068;hp=8f88a0d836f30fac17812fbca7e58d38493c8de4;hpb=c8a322baf0b95ea15bfa8031d77a555b2a13f0bf;p=friendica.git diff --git a/src/Content/Widget.php b/src/Content/Widget.php index 8f88a0d836..8633992870 100644 --- a/src/Content/Widget.php +++ b/src/Content/Widget.php @@ -1,26 +1,37 @@ . + * */ + namespace Friendica\Content; use Friendica\Core\Addon; -use Friendica\Core\Config; -use Friendica\Core\L10n; -use Friendica\Core\PConfig; +use Friendica\Core\Cache\Enum\Duration; use Friendica\Core\Protocol; use Friendica\Core\Renderer; -use Friendica\Core\Session; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; -use Friendica\Model\FileTag; -use Friendica\Model\GContact; +use Friendica\Model\Group; use Friendica\Model\Item; -use Friendica\Model\Profile; +use Friendica\Model\Post; use Friendica\Util\DateTimeFormat; -use Friendica\Util\Proxy as ProxyUtils; -use Friendica\Util\Strings; use Friendica\Util\Temporal; class Widget @@ -35,11 +46,11 @@ class Widget public static function follow($value = "") { return Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/follow.tpl'), array( - '$connect' => L10n::t('Add New Contact'), - '$desc' => L10n::t('Enter address or web location'), - '$hint' => L10n::t('Example: bob@example.com, http://example.com/barbara'), + '$connect' => DI::l10n()->t('Add New Contact'), + '$desc' => DI::l10n()->t('Enter address or web location'), + '$hint' => DI::l10n()->t('Example: bob@example.com, http://example.com/barbara'), '$value' => $value, - '$follow' => L10n::t('Connect') + '$follow' => DI::l10n()->t('Connect') )); } @@ -48,30 +59,30 @@ class Widget */ public static function findPeople() { - $global_dir = Config::get('system', 'directory'); + $global_dir = DI::config()->get('system', 'directory'); - if (Config::get('system', 'invitation_only')) { - $x = intval(PConfig::get(local_user(), 'system', 'invites_remaining')); - if ($x || is_site_admin()) { + if (DI::config()->get('system', 'invitation_only')) { + $x = intval(DI::pConfig()->get(local_user(), 'system', 'invites_remaining')); + if ($x || DI::app()->isSiteAdmin()) { DI::page()['aside'] .= ''; } } $nv = []; - $nv['findpeople'] = L10n::t('Find People'); - $nv['desc'] = L10n::t('Enter name or interest'); - $nv['label'] = L10n::t('Connect/Follow'); - $nv['hint'] = L10n::t('Examples: Robert Morgenstein, Fishing'); - $nv['findthem'] = L10n::t('Find'); - $nv['suggest'] = L10n::t('Friend Suggestions'); - $nv['similar'] = L10n::t('Similar Interests'); - $nv['random'] = L10n::t('Random Profile'); - $nv['inv'] = L10n::t('Invite Friends'); - $nv['directory'] = L10n::t('Global Directory'); + $nv['findpeople'] = DI::l10n()->t('Find People'); + $nv['desc'] = DI::l10n()->t('Enter name or interest'); + $nv['label'] = DI::l10n()->t('Connect/Follow'); + $nv['hint'] = DI::l10n()->t('Examples: Robert Morgenstein, Fishing'); + $nv['findthem'] = DI::l10n()->t('Find'); + $nv['suggest'] = DI::l10n()->t('Friend Suggestions'); + $nv['similar'] = DI::l10n()->t('Similar Interests'); + $nv['random'] = DI::l10n()->t('Random Profile'); + $nv['inv'] = DI::l10n()->t('Invite Friends'); + $nv['directory'] = DI::l10n()->t('Global Directory'); $nv['global_dir'] = $global_dir; - $nv['local_directory'] = L10n::t('Local Directory'); + $nv['local_directory'] = DI::l10n()->t('Local Directory'); $aside = []; $aside['$nv'] = $nv; @@ -80,12 +91,14 @@ class Widget } /** - * Return unavailable networks + * Return unavailable networks as array + * + * @return array Unsupported networks */ public static function unavailableNetworks() { // Always hide content from these networks - $networks = ['face', 'apdn']; + $networks = [Protocol::PHANTOM, Protocol::FACEBOOK, Protocol::APPNET, Protocol::ZOT]; if (!Addon::isEnabled("discourse")) { $networks[] = Protocol::DISCOURSE; @@ -103,27 +116,18 @@ class Widget $networks[] = Protocol::TWITTER; } - if (Config::get("system", "ostatus_disabled")) { + if (DI::config()->get("system", "ostatus_disabled")) { $networks[] = Protocol::OSTATUS; } - if (!Config::get("system", "diaspora_enabled")) { + if (!DI::config()->get("system", "diaspora_enabled")) { $networks[] = Protocol::DIASPORA; } if (!Addon::isEnabled("pnut")) { $networks[] = Protocol::PNUT; } - - if (!sizeof($networks)) { - return ""; - } - - $network_filter = implode("','", $networks); - - $network_filter = "AND `network` NOT IN ('$network_filter')"; - - return $network_filter; + return $networks; } /** @@ -178,7 +182,39 @@ class Widget } /** - * Return networks widget + * Return group membership widget + * + * @param string $baseurl + * @param string $selected + * @return string + * @throws \Exception + */ + public static function groups($baseurl, $selected = '') + { + if (!local_user()) { + return ''; + } + + $options = array_map(function ($group) { + return [ + 'ref' => $group['id'], + 'name' => $group['name'] + ]; + }, Group::getByUserId(local_user())); + + return self::filter( + 'group', + DI::l10n()->t('Groups'), + '', + DI::l10n()->t('Everyone'), + $baseurl, + $options, + $selected + ); + } + + /** + * Return contact relationship widget * * @param string $baseurl baseurl * @param string $selected optional, default empty @@ -192,16 +228,16 @@ class Widget } $options = [ - ['ref' => 'followers', 'name' => L10n::t('Followers')], - ['ref' => 'following', 'name' => L10n::t('Following')], - ['ref' => 'mutuals', 'name' => L10n::t('Mutual friends')], + ['ref' => 'followers', 'name' => DI::l10n()->t('Followers')], + ['ref' => 'following', 'name' => DI::l10n()->t('Following')], + ['ref' => 'mutuals', 'name' => DI::l10n()->t('Mutual friends')], ]; return self::filter( 'rel', - L10n::t('Relationships'), + DI::l10n()->t('Relationships'), '', - L10n::t('All Contacts'), + DI::l10n()->t('All Contacts'), $baseurl, $options, $selected @@ -222,15 +258,11 @@ class Widget return ''; } - if (!Feature::isEnabled(local_user(), 'networks')) { - return ''; - } - - $extra_sql = self::unavailableNetworks(); + $networks = self::unavailableNetworks(); + $query = "`uid` = ? AND NOT `deleted` AND `network` != '' AND NOT `network` IN (" . substr(str_repeat("?, ", count($networks)), 0, -2) . ")"; + $condition = array_merge([$query], array_merge([local_user()], $networks)); - $r = DBA::p("SELECT DISTINCT(`network`) FROM `contact` WHERE `uid` = ? AND NOT `deleted` AND `network` != '' $extra_sql ORDER BY `network`", - local_user() - ); + $r = DBA::select('contact', ['network'], $condition, ['group_by' => ['network'], 'order' => ['network']]); $nets = array(); while ($rr = DBA::fetch($r)) { @@ -244,9 +276,9 @@ class Widget return self::filter( 'nets', - L10n::t('Protocols'), + DI::l10n()->t('Protocols'), '', - L10n::t('All Protocols'), + DI::l10n()->t('All Protocols'), $baseurl, $nets, $selected @@ -267,25 +299,16 @@ class Widget return ''; } - $saved = PConfig::get(local_user(), 'system', 'filetags'); - if (!strlen($saved)) { - return; - } - $terms = []; - foreach (FileTag::fileToArray($saved) as $savedFolderName) { + foreach (Post\Category::getArray(local_user(), Post\Category::FILE) as $savedFolderName) { $terms[] = ['ref' => $savedFolderName, 'name' => $savedFolderName]; } - - usort($terms, function ($a, $b) { - return strcmp($a['name'], $b['name']); - }); return self::filter( 'file', - L10n::t('Saved Folders'), + DI::l10n()->t('Saved Folders'), '', - L10n::t('Everything'), + DI::l10n()->t('Everything'), $baseurl, $terms, $selected @@ -295,36 +318,28 @@ class Widget /** * Return categories widget * - * @param string $baseurl baseurl - * @param string $selected optional, default empty + * @param int $uid Id of the user owning the categories + * @param string $baseurl Base page URL + * @param string $selected Selected category * @return string|void * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function categories($baseurl, $selected = '') + public static function categories(int $uid, string $baseurl, string $selected = '') { - $a = DI::app(); - - $uid = intval($a->profile['profile_uid']); - if (!Feature::isEnabled($uid, 'categories')) { return ''; } - $saved = PConfig::get($uid, 'system', 'filetags'); - if (!strlen($saved)) { - return; - } - $terms = array(); - foreach (FileTag::fileToArray($saved, 'category') as $savedFolderName) { + foreach (Post\Category::getArray($uid, Post\Category::CATEGORY) as $savedFolderName) { $terms[] = ['ref' => $savedFolderName, 'name' => $savedFolderName]; } return self::filter( 'category', - L10n::t('Categories'), + DI::l10n()->t('Categories'), '', - L10n::t('Everything'), + DI::l10n()->t('Everything'), $baseurl, $terms, $selected @@ -332,104 +347,79 @@ class Widget } /** - * Return common friends visitor widget + * Show a random selection of five common contacts between the visitor and the viewed profile user. * - * @param string $profile_uid uid + * @param int $uid Viewed profile user ID + * @param string $nickname Viewed profile user nickname * @return string|void * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException */ - public static function commonFriendsVisitor($profile_uid) + public static function commonFriendsVisitor(int $uid, string $nickname) { - if (local_user() == $profile_uid) { - return; - } - - $zcid = 0; - - $cid = Session::getRemoteContactID($profile_uid); - - if (!$cid) { - if (Profile::getMyURL()) { - $contact = DBA::selectFirst('contact', ['id'], - ['nurl' => Strings::normaliseLink(Profile::getMyURL()), 'uid' => $profile_uid]); - if (DBA::isResult($contact)) { - $cid = $contact['id']; - } else { - $gcontact = DBA::selectFirst('gcontact', ['id'], ['nurl' => Strings::normaliseLink(Profile::getMyURL())]); - if (DBA::isResult($gcontact)) { - $zcid = $gcontact['id']; - } - } - } + if (local_user() == $uid) { + return ''; } - if ($cid == 0 && $zcid == 0) { - return; + $visitorPCid = local_user() ? Contact::getPublicIdByUserId(local_user()) : remote_user(); + if (!$visitorPCid) { + return ''; } - if ($cid) { - $t = GContact::countCommonFriends($profile_uid, $cid); - } else { - $t = GContact::countCommonFriendsZcid($profile_uid, $zcid); - } + $localPCid = Contact::getPublicIdByUserId($uid); - if (!$t) { - return; - } + $condition = [ + 'NOT `self` AND NOT `blocked` AND NOT `hidden` AND `id` != ?', + $localPCid, + ]; - if ($cid) { - $r = GContact::commonFriends($profile_uid, $cid, 0, 5, true); - } else { - $r = GContact::commonFriendsZcid($profile_uid, $zcid, 0, 5, true); + $total = Contact\Relation::countCommon($localPCid, $visitorPCid, $condition); + if (!$total) { + return ''; } - if (!DBA::isResult($r)) { - return; + $commonContacts = Contact\Relation::listCommon($localPCid, $visitorPCid, $condition, 0, 5, true); + if (!DBA::isResult($commonContacts)) { + return ''; } $entries = []; - foreach ($r as $rr) { - $entry = [ - 'url' => Contact::magicLink($rr['url']), - 'name' => $rr['name'], - 'photo' => ProxyUtils::proxifyUrl($rr['photo'], false, ProxyUtils::SIZE_THUMB), + foreach ($commonContacts as $contact) { + $entries[] = [ + 'url' => Contact::magicLinkByContact($contact), + 'name' => $contact['name'], + 'photo' => Contact::getThumb($contact), ]; - $entries[] = $entry; } $tpl = Renderer::getMarkupTemplate('widget/remote_friends_common.tpl'); return Renderer::replaceMacros($tpl, [ - '$desc' => L10n::tt("%d contact in common", "%d contacts in common", $t), + '$desc' => DI::l10n()->tt("%d contact in common", "%d contacts in common", $total), '$base' => DI::baseUrl(), - '$uid' => $profile_uid, - '$cid' => (($cid) ? $cid : '0'), - '$linkmore' => (($t > 5) ? 'true' : ''), - '$more' => L10n::t('show more'), - '$items' => $entries + '$nickname' => $nickname, + '$linkmore' => $total > 5 ? 'true' : '', + '$more' => DI::l10n()->t('show more'), + '$contacts' => $entries ]); } /** * Insert a tag cloud widget for the present profile. * - * @brief Insert a tag cloud widget for the present profile. + * @param int $uid User ID * @param int $limit Max number of displayed tags. * @return string HTML formatted output. * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - public static function tagCloud($limit = 50) + public static function tagCloud(int $uid, int $limit = 50) { - $a = DI::app(); - - $uid = intval($a->profile['profile_uid']); - - if (!$uid || !$a->profile['url']) { + if (empty($uid)) { return ''; } if (Feature::isEnabled($uid, 'tagadelic')) { - $owner_id = Contact::getIdForURL($a->profile['url'], 0, true); + $owner_id = Contact::getPublicIdByUserId($uid); if (!$owner_id) { return ''; @@ -451,18 +441,20 @@ class Widget { $o = ''; - if (!Feature::isEnabled($uid, 'archives')) { - return $o; - } - - $visible_years = PConfig::get($uid, 'system', 'archive_visible_years', 5); + $visible_years = DI::pConfig()->get($uid, 'system', 'archive_visible_years', 5); /* arrange the list in years */ $dnow = DateTimeFormat::localNow('Y-m-d'); $ret = []; - $dthen = Item::firstPostDate($uid, $wall); + $cachekey = 'Widget::postedByYear' . $uid . '-' . (int)$wall; + $dthen = DI::cache()->get($cachekey); + if (empty($dthen)) { + $dthen = Item::firstPostDate($uid, $wall); + DI::cache()->set($cachekey, $dthen, Duration::HOUR); + } + if ($dthen) { // Set the start and end date to the beginning of the month $dnow = substr($dnow, 0, 8) . '01'; @@ -478,7 +470,7 @@ class Widget $dend = substr($dnow, 0, 8) . Temporal::getDaysInMonth(intval($dnow), intval(substr($dnow, 5))); $start_month = DateTimeFormat::utc($dstart, 'Y-m-d'); $end_month = DateTimeFormat::utc($dend, 'Y-m-d'); - $str = L10n::getDay(DateTimeFormat::utc($dnow, 'F')); + $str = DI::l10n()->getDay(DateTimeFormat::utc($dnow, 'F')); if (empty($ret[$dyear])) { $ret[$dyear] = []; @@ -498,15 +490,37 @@ class Widget $cutoff = array_key_exists($cutoff_year, $ret); $o = Renderer::replaceMacros(Renderer::getMarkupTemplate('widget/posted_date.tpl'),[ - '$title' => L10n::t('Archives'), + '$title' => DI::l10n()->t('Archives'), '$size' => $visible_years, '$cutoff_year' => $cutoff_year, '$cutoff' => $cutoff, '$url' => $url, '$dates' => $ret, - '$showmore' => L10n::t('show more') + '$showless' => DI::l10n()->t('show less'), + '$showmore' => DI::l10n()->t('show more') ]); return $o; } + + /** + * Display the account types sidebar + * The account type value is added as a parameter to the url + * + * @param string $base Basepath + * @param int $accounttype Acount type + * @return string + */ + public static function accounttypes(string $base, $accounttype) + { + $accounts = [ + ['ref' => 'person', 'name' => DI::l10n()->t('Persons')], + ['ref' => 'organisation', 'name' => DI::l10n()->t('Organisations')], + ['ref' => 'news', 'name' => DI::l10n()->t('News')], + ['ref' => 'community', 'name' => DI::l10n()->t('Forums')], + ]; + + return self::filter('accounttype', DI::l10n()->t('Account Types'), '', + DI::l10n()->t('All'), $base, $accounts, $accounttype); + } }