X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FProfile.php;h=10bd3a1d7542843aaad239c512c4e892bba45b80;hb=c34204cf50ced68a14d220706c4dc6ef93eb94c9;hp=f78f42235938b47495ce8ee26c9cb2a9f52031d1;hpb=55e54bb9500f54bb075dcbc2054018de0969d9e7;p=friendica.git diff --git a/src/Model/Profile.php b/src/Model/Profile.php index f78f422359..10bd3a1d75 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -9,6 +9,7 @@ use Friendica\Content\Feature; use Friendica\Content\ForumManager; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\HTML; +use Friendica\Content\Widget\ContactBlock; use Friendica\Core\Cache; use Friendica\Core\Config; use Friendica\Core\Hook; @@ -17,10 +18,10 @@ use Friendica\Core\Logger; use Friendica\Core\PConfig; use Friendica\Core\Protocol; use Friendica\Core\Renderer; +use Friendica\Core\Session; use Friendica\Core\System; use Friendica\Core\Worker; use Friendica\Database\DBA; -use Friendica\Model\Contact; use Friendica\Protocol\Diaspora; use Friendica\Util\DateTimeFormat; use Friendica\Util\Network; @@ -36,6 +37,7 @@ class Profile * @param integer User ID * * @return array Profile data + * @throws \Exception */ public static function getByUID($uid) { @@ -102,6 +104,8 @@ class Profile * @param int $profile int * @param array $profiledata array * @param boolean $show_connect Show connect link + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException */ public static function load(App $a, $nickname, $profile = 0, array $profiledata = [], $show_connect = true) { @@ -109,14 +113,17 @@ class Profile if (!DBA::isResult($user) && empty($profiledata)) { Logger::log('profile error: ' . $a->query_string, Logger::DEBUG); - notice(L10n::t('Requested account is not available.') . EOL); - $a->error = 404; return; } if (count($profiledata) > 0) { + // Ensure to have a "nickname" field + if (empty($profiledata['nickname']) && !empty($profiledata['nick'])) { + $profiledata['nickname'] = $profiledata['nick']; + } + // Add profile data to sidebar - $a->page['aside'] .= self::sidebar($profiledata, true, $show_connect); + $a->page['aside'] .= self::sidebar($a, $profiledata, true, $show_connect); if (!DBA::isResult($user)) { return; @@ -127,8 +134,6 @@ class Profile if (empty($pdata) && empty($profiledata)) { Logger::log('profile error: ' . $a->query_string, Logger::DEBUG); - notice(L10n::t('Requested profile is not available.') . EOL); - $a->error = 404; return; } @@ -189,7 +194,7 @@ class Profile * But: When this profile was on the same server, then we could display the contacts */ if (!$profiledata) { - $a->page['aside'] .= self::sidebar($a->profile, $block, $show_connect); + $a->page['aside'] .= self::sidebar($a, $a->profile, $block, $show_connect); } return; @@ -206,10 +211,11 @@ class Profile * Includes all available profile data * * @brief Get all profile data of a local user - * @param string $nickname nick - * @param int $uid uid - * @param int $profile_id ID of the profile + * @param string $nickname nick + * @param int $uid uid + * @param int $profile_id ID of the profile * @return array + * @throws \Exception */ public static function getByNickname($nickname, $uid = 0, $profile_id = 0) { @@ -265,23 +271,23 @@ class Profile * because of all the conditional logic. * * @brief Formats a profile for display in the sidebar. - * @param array $profile - * @param int $block + * @param array $profile + * @param int $block * @param boolean $show_connect Show connect link * * @return string HTML sidebar module * - * @note Returns empty string if passed $profile is wrong type or not populated + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + * @note Returns empty string if passed $profile is wrong type or not populated * * @hooks 'profile_sidebar_enter' * array $profile - profile data * @hooks 'profile_sidebar' * array $arr */ - private static function sidebar($profile, $block = 0, $show_connect = true) + private static function sidebar(App $a, $profile, $block = 0, $show_connect = true) { - $a = \get_app(); - $o = ''; $location = false; @@ -302,127 +308,102 @@ class Profile Hook::callAll('profile_sidebar_enter', $profile); - - // don't show connect link to yourself - $connect = $profile['uid'] != local_user() ? L10n::t('Connect') : false; - - // don't show connect link to authenticated visitors either - if (remote_user() && !empty($_SESSION['remote'])) { - foreach ($_SESSION['remote'] as $visitor) { - if ($visitor['uid'] == $profile['uid']) { - $connect = false; - break; - } - } - } - - if (!$show_connect) { - $connect = false; + if (isset($profile['url'])) { + $profile_url = $profile['url']; + } else { + $profile_url = $a->getBaseURL() . '/profile/' . $profile['nickname']; } - $profile_url = ''; - - // Is the local user already connected to that user? - if ($connect && local_user()) { - if (isset($profile['url'])) { - $profile_url = Strings::normaliseLink($profile['url']); - } else { - $profile_url = Strings::normaliseLink(System::baseUrl() . '/profile/' . $profile['nickname']); - } - - if (DBA::exists('contact', ['pending' => false, 'uid' => local_user(), 'nurl' => $profile_url])) { - $connect = false; - } - } + $follow_link = null; + $unfollow_link = null; + $subscribe_feed_link = null; + $wallmessage_link = null; - // Is the remote user already connected to that user? - if ($connect && Contact::isFollower(remote_user(), $profile['uid'])) { - $connect = false; - } - if ($connect && ($profile['network'] != Protocol::DFRN) && !isset($profile['remoteconnect'])) { - $connect = false; - } - $remoteconnect = null; - if (isset($profile['remoteconnect'])) { - $remoteconnect = $profile['remoteconnect']; + $visitor_contact = []; + if (!empty($profile['uid']) && self::getMyURL()) { + $visitor_contact = Contact::selectFirst(['rel'], ['uid' => $profile['uid'], 'nurl' => Strings::normaliseLink(self::getMyURL())]); } - if ($connect && ($profile['network'] == Protocol::DFRN) && !isset($remoteconnect)) { - $subscribe_feed = L10n::t('Atom feed'); - } else { - $subscribe_feed = false; + $profile_contact = []; + if (!empty($profile['cid']) && self::getMyURL()) { + $profile_contact = Contact::selectFirst(['rel'], ['id' => $profile['cid']]); } - $wallmessage = false; - $wallmessage_link = false; - - // See issue https://github.com/friendica/friendica/issues/3838 - // Either we remove the message link for remote users or we enable creating messages from remote users - if (remote_user() || (self::getMyURL() && !empty($profile['unkmail']) && ($profile['uid'] != local_user()))) { - $wallmessage = L10n::t('Message'); + $profile_is_dfrn = $profile['network'] == Protocol::DFRN; + $profile_is_native = in_array($profile['network'], Protocol::NATIVE_SUPPORT); + $local_user_is_self = local_user() && local_user() == ($profile['profile_uid'] ?? 0); + $visitor_is_authenticated = (bool)self::getMyURL(); + $visitor_is_following = + in_array($visitor_contact['rel'] ?? 0, [Contact::FOLLOWER, Contact::FRIEND]) + || in_array($profile_contact['rel'] ?? 0, [Contact::SHARING, Contact::FRIEND]); + $visitor_is_followed = + in_array($visitor_contact['rel'] ?? 0, [Contact::SHARING, Contact::FRIEND]) + || in_array($profile_contact['rel'] ?? 0, [Contact::FOLLOWER, Contact::FRIEND]); + $visitor_base_path = self::getMyURL() ? preg_replace('=/profile/(.*)=ism', '', self::getMyURL()) : ''; + + if (!$local_user_is_self && $show_connect) { + if (!$visitor_is_authenticated) { + $follow_link = 'dfrn_request/' . $profile['nickname']; + } elseif ($profile_is_native) { + if ($visitor_is_following) { + $unfollow_link = $visitor_base_path . '/unfollow?url=' . urlencode($profile_url); + } else { + $follow_link = $visitor_base_path .'/follow?url=' . urlencode($profile_url); + } + } - if (remote_user()) { - $r = q( - "SELECT `url` FROM `contact` WHERE `uid` = %d AND `id` = '%s' AND `rel` = %d", - intval($profile['uid']), - intval(remote_user()), - intval(Contact::FRIEND) - ); - } else { - $r = q( - "SELECT `url` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `rel` = %d", - intval($profile['uid']), - DBA::escape(Strings::normaliseLink(self::getMyURL())), - intval(Contact::FRIEND) - ); + if ($profile_is_dfrn) { + $subscribe_feed_link = 'dfrn_poll/' . $profile['nickname']; } - if ($r) { - $remote_url = $r[0]['url']; - $message_path = preg_replace('=(.*)/profile/(.*)=ism', '$1/message/new/', $remote_url); - $wallmessage_link = $message_path . base64_encode(defaults($profile, 'addr', '')); - } else if (!empty($profile['nickname'])) { - $wallmessage_link = 'wallmessage/' . $profile['nickname']; + + if (Contact::canReceivePrivateMessages($profile)) { + if ($visitor_is_followed || $visitor_is_following) { + $wallmessage_link = $visitor_base_path . '/message/new/' . base64_encode(defaults($profile, 'addr', '')); + } elseif ($visitor_is_authenticated && !empty($profile['unkmail'])) { + $wallmessage_link = 'wallmessage/' . $profile['nickname']; + } } } // show edit profile to yourself - if (!$is_contact && $profile['uid'] == local_user() && Feature::isEnabled(local_user(), 'multi_profiles')) { - $profile['edit'] = [System::baseUrl() . '/profiles', L10n::t('Profiles'), '', L10n::t('Manage/edit profiles')]; - $r = q( - "SELECT * FROM `profile` WHERE `uid` = %d", - local_user() - ); + if (!$is_contact && $local_user_is_self) { + if (Feature::isEnabled(local_user(), 'multi_profiles')) { + $profile['edit'] = [System::baseUrl() . '/profiles', L10n::t('Profiles'), '', L10n::t('Manage/edit profiles')]; + $r = q( + "SELECT * FROM `profile` WHERE `uid` = %d", + local_user() + ); - $profile['menu'] = [ - 'chg_photo' => L10n::t('Change profile photo'), - 'cr_new' => L10n::t('Create New Profile'), - 'entries' => [], - ]; + $profile['menu'] = [ + 'chg_photo' => L10n::t('Change profile photo'), + 'cr_new' => L10n::t('Create New Profile'), + 'entries' => [], + ]; - if (DBA::isResult($r)) { - foreach ($r as $rr) { - $profile['menu']['entries'][] = [ - 'photo' => $rr['thumb'], - 'id' => $rr['id'], - 'alt' => L10n::t('Profile Image'), - 'profile_name' => $rr['profile-name'], - 'isdefault' => $rr['is-default'], - 'visibile_to_everybody' => L10n::t('visible to everybody'), - 'edit_visibility' => L10n::t('Edit visibility'), - ]; + if (DBA::isResult($r)) { + foreach ($r as $rr) { + $profile['menu']['entries'][] = [ + 'photo' => $rr['thumb'], + 'id' => $rr['id'], + 'alt' => L10n::t('Profile Image'), + 'profile_name' => $rr['profile-name'], + 'isdefault' => $rr['is-default'], + 'visibile_to_everybody' => L10n::t('visible to everybody'), + 'edit_visibility' => L10n::t('Edit visibility'), + ]; + } } + } else { + $profile['edit'] = [System::baseUrl() . '/profiles/' . $profile['id'], L10n::t('Edit profile'), '', L10n::t('Edit profile')]; + $profile['menu'] = [ + 'chg_photo' => L10n::t('Change profile photo'), + 'cr_new' => null, + 'entries' => [], + ]; } } - if (!$is_contact && $profile['uid'] == local_user() && !Feature::isEnabled(local_user(), 'multi_profiles')) { - $profile['edit'] = [System::baseUrl() . '/profiles/' . $profile['id'], L10n::t('Edit profile'), '', L10n::t('Edit profile')]; - $profile['menu'] = [ - 'chg_photo' => L10n::t('Change profile photo'), - 'cr_new' => null, - 'entries' => [], - ]; - } // Fetch the account type $account_type = Contact::getAccountType($profile); @@ -470,9 +451,9 @@ class Profile $contact_block = ''; $updated = ''; - $contacts = 0; + $contact_count = 0; if (!$block) { - $contact_block = HTML::contactBlock(); + $contact_block = ContactBlock::getHTML($a->profile); if (is_array($a->profile) && !$a->profile['hide-friends']) { $r = q( @@ -483,20 +464,15 @@ class Profile $updated = date('c', strtotime($r[0]['updated'])); } - $r = q( - "SELECT COUNT(*) AS `total` FROM `contact` - WHERE `uid` = %d - AND NOT `self` AND NOT `blocked` AND NOT `pending` - AND NOT `hidden` AND NOT `archive` - AND `network` IN ('%s', '%s', '%s', '')", - intval($profile['uid']), - DBA::escape(Protocol::DFRN), - DBA::escape(Protocol::DIASPORA), - DBA::escape(Protocol::OSTATUS) - ); - if (DBA::isResult($r)) { - $contacts = intval($r[0]['total']); - } + $contact_count = DBA::count('contact', [ + 'uid' => $profile['uid'], + 'self' => false, + 'blocked' => false, + 'pending' => false, + 'hidden' => false, + 'archive' => false, + 'network' => Protocol::FEDERATED, + ]); } } @@ -528,10 +504,13 @@ class Profile $o .= Renderer::replaceMacros($tpl, [ '$profile' => $p, '$xmpp' => $xmpp, - '$connect' => $connect, - '$remoteconnect' => $remoteconnect, - '$subscribe_feed' => $subscribe_feed, - '$wallmessage' => $wallmessage, + '$follow' => L10n::t('Follow'), + '$follow_link' => $follow_link, + '$unfollow' => L10n::t('Unfollow'), + '$unfollow_link' => $unfollow_link, + '$subscribe_feed' => L10n::t('Atom feed'), + '$subscribe_feed_link' => $subscribe_feed_link, + '$wallmessage' => L10n::t('Message'), '$wallmessage_link' => $wallmessage_link, '$account_type' => $account_type, '$location' => $location, @@ -540,7 +519,7 @@ class Profile '$homepage' => $homepage, '$about' => $about, '$network' => L10n::t('Network:'), - '$contacts' => $contacts, + '$contacts' => $contact_count, '$updated' => $updated, '$diaspora' => $diaspora, '$contact_block' => $contact_block, @@ -640,7 +619,6 @@ class Profile } $tpl = Renderer::getMarkupTemplate('birthdays_reminder.tpl'); return Renderer::replaceMacros($tpl, [ - '$baseurl' => System::baseUrl(), '$classtoday' => $classtoday, '$count' => $total, '$event_reminders' => L10n::t('Birthday Reminders'), @@ -729,7 +707,6 @@ class Profile } $tpl = Renderer::getMarkupTemplate('events_reminder.tpl'); return Renderer::replaceMacros($tpl, [ - '$baseurl' => System::baseUrl(), '$classtoday' => $classtoday, '$count' => count($r), '$event_reminders' => L10n::t('Event Reminders'), @@ -740,14 +717,8 @@ class Profile public static function getAdvanced(App $a) { - $o = ''; $uid = $a->profile['uid']; - $o .= Renderer::replaceMacros( - Renderer::getMarkupTemplate('section_title.tpl'), - ['$title' => L10n::t('Profile')] - ); - if ($a->profile['name']) { $tpl = Renderer::getMarkupTemplate('profile_advanced.tpl'); @@ -792,7 +763,7 @@ class Profile $profile['marital']['with'] = $a->profile['with']; } - if (strlen($a->profile['howlong']) && $a->profile['howlong'] >= DBA::NULL_DATETIME) { + if (strlen($a->profile['howlong']) && $a->profile['howlong'] > DBA::NULL_DATETIME) { $profile['howlong'] = Temporal::getRelativeDate($a->profile['howlong'], L10n::t('for %1$d %2$s')); } @@ -888,32 +859,35 @@ class Profile return ''; } - public static function getTabs($a, $is_owner = false, $nickname = null) + /** + * @param App $a + * @param string $current + * @param bool $is_owner + * @param string $nickname + * @return string + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public static function getTabs(App $a, string $current, bool $is_owner, string $nickname = null) { if (is_null($nickname)) { $nickname = $a->user['nickname']; } - $tab = false; - if (!empty($_GET['tab'])) { - $tab = Strings::escapeTags(trim($_GET['tab'])); - } - - $url = System::baseUrl() . '/profile/' . $nickname; + $baseProfileUrl = System::baseUrl() . '/profile/' . $nickname; $tabs = [ [ 'label' => L10n::t('Status'), - 'url' => $url, - 'sel' => !$tab && $a->argv[0] == 'profile' ? 'active' : '', + 'url' => $baseProfileUrl, + 'sel' => !$current ? 'active' : '', 'title' => L10n::t('Status Messages and Posts'), 'id' => 'status-tab', 'accesskey' => 'm', ], [ 'label' => L10n::t('Profile'), - 'url' => $url . '/?tab=profile', - 'sel' => $tab == 'profile' ? 'active' : '', + 'url' => $baseProfileUrl . '/?tab=profile', + 'sel' => $current == 'profile' ? 'active' : '', 'title' => L10n::t('Profile Details'), 'id' => 'profile-tab', 'accesskey' => 'r', @@ -921,7 +895,7 @@ class Profile [ 'label' => L10n::t('Photos'), 'url' => System::baseUrl() . '/photos/' . $nickname, - 'sel' => !$tab && $a->argv[0] == 'photos' ? 'active' : '', + 'sel' => $current == 'photos' ? 'active' : '', 'title' => L10n::t('Photo Albums'), 'id' => 'photo-tab', 'accesskey' => 'h', @@ -929,7 +903,7 @@ class Profile [ 'label' => L10n::t('Videos'), 'url' => System::baseUrl() . '/videos/' . $nickname, - 'sel' => !$tab && $a->argv[0] == 'videos' ? 'active' : '', + 'sel' => $current == 'videos' ? 'active' : '', 'title' => L10n::t('Videos'), 'id' => 'video-tab', 'accesskey' => 'v', @@ -941,7 +915,7 @@ class Profile $tabs[] = [ 'label' => L10n::t('Events'), 'url' => System::baseUrl() . '/events', - 'sel' => !$tab && $a->argv[0] == 'events' ? 'active' : '', + 'sel' => $current == 'events' ? 'active' : '', 'title' => L10n::t('Events and Calendar'), 'id' => 'events-tab', 'accesskey' => 'e', @@ -952,7 +926,7 @@ class Profile $tabs[] = [ 'label' => L10n::t('Events'), 'url' => System::baseUrl() . '/cal/' . $nickname, - 'sel' => !$tab && $a->argv[0] == 'cal' ? 'active' : '', + 'sel' => $current == 'cal' ? 'active' : '', 'title' => L10n::t('Events and Calendar'), 'id' => 'events-tab', 'accesskey' => 'e', @@ -963,7 +937,7 @@ class Profile $tabs[] = [ 'label' => L10n::t('Personal Notes'), 'url' => System::baseUrl() . '/notes', - 'sel' => !$tab && $a->argv[0] == 'notes' ? 'active' : '', + 'sel' => $current == 'notes' ? 'active' : '', 'title' => L10n::t('Only You Can See This'), 'id' => 'notes-tab', 'accesskey' => 't', @@ -980,18 +954,18 @@ class Profile ]; } - if (!$is_owner && empty($a->profile['hide-friends'])) { + if ($is_owner || empty($a->profile['hide-friends'])) { $tabs[] = [ 'label' => L10n::t('Contacts'), - 'url' => System::baseUrl() . '/viewcontacts/' . $nickname, - 'sel' => !$tab && $a->argv[0] == 'viewcontacts' ? 'active' : '', + 'url' => $baseProfileUrl . '/contacts', + 'sel' => $current == 'contacts' ? 'active' : '', 'title' => L10n::t('Contacts'), 'id' => 'viewcontacts-tab', 'accesskey' => 'k', ]; } - $arr = ['is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => $tab, 'tabs' => $tabs]; + $arr = ['is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => $current, 'tabs' => $tabs]; Hook::callAll('profile_tabs', $arr); $tpl = Renderer::getMarkupTemplate('common_tabs.tpl'); @@ -1006,10 +980,7 @@ class Profile */ public static function getMyURL() { - if (!empty($_SESSION['my_url'])) { - return $_SESSION['my_url']; - } - return null; + return Session::get('my_url'); } /** @@ -1022,6 +993,8 @@ class Profile * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/channel.php * * @param App $a Application instance. + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException */ public static function zrlInit(App $a) { @@ -1086,32 +1059,20 @@ class Profile } /** - * OpenWebAuth authentication. - * - * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/zid.php + * Set the visitor cookies (see remote_user()) for the given handle * - * @param string $token + * @param string $handle Visitor handle + * @return array Visitor contact array */ - public static function openWebAuthInit($token) + public static function addVisitorCookieForHandle($handle) { $a = \get_app(); - // Clean old OpenWebAuthToken entries. - OpenWebAuthToken::purge('owt', '3 MINUTE'); - - // Check if the token we got is the same one - // we have stored in the database. - $visitor_handle = OpenWebAuthToken::getMeta('owt', 0, $token); - - if($visitor_handle === false) { - return; - } - // Try to find the public contact entry of the visitor. - $cid = Contact::getIdForURL($visitor_handle); - if(!$cid) { - Logger::log('owt: unable to finger ' . $visitor_handle, Logger::DEBUG); - return; + $cid = Contact::getIdForURL($handle); + if (!$cid) { + Logger::log('unable to finger ' . $handle, Logger::DEBUG); + return []; } $visitor = DBA::selectFirst('contact', [], ['id' => $cid]); @@ -1134,6 +1095,43 @@ class Profile $_SESSION['remote'][] = ['cid' => $contact['id'], 'uid' => $contact['uid'], 'url' => $visitor['url']]; } + + $a->contact = $visitor; + + Logger::info('Authenticated visitor', ['url' => $visitor['url']]); + + return $visitor; + } + + /** + * OpenWebAuth authentication. + * + * Ported from Hubzilla: https://framagit.org/hubzilla/core/blob/master/include/zid.php + * + * @param string $token + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + public static function openWebAuthInit($token) + { + $a = \get_app(); + + // Clean old OpenWebAuthToken entries. + OpenWebAuthToken::purge('owt', '3 MINUTE'); + + // Check if the token we got is the same one + // we have stored in the database. + $visitor_handle = OpenWebAuthToken::getMeta('owt', 0, $token); + + if ($visitor_handle === false) { + return; + } + + $visitor = self::addVisitorCookieForHandle($visitor_handle); + if (empty($visitor)) { + return; + } + $arr = [ 'visitor' => $visitor, 'url' => $a->query_string @@ -1184,6 +1182,7 @@ class Profile * @brief Get the user ID of the page owner * @return int user ID * + * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @note Returns local_user instead of user ID if "always_my_theme" is set to true */ public static function getThemeUid(App $a) @@ -1208,13 +1207,125 @@ class Profile } /** - * Stip query parameter from a string. - * - * @param string $s The input string. - * @return string The query parameter. - */ + * Strip query parameter from a string. + * + * @param string $s The input string. + * @param $param + * @return string The query parameter. + */ public static function stripQueryParam($s, $param) { return preg_replace('/[\?&]' . $param . '=(.*?)(&|$)/ism', '$2', $s); } + + /** + * search for Profiles + * + * @param int $start + * @param int $count + * @param null $search + * + * @return array [ 'total' => 123, 'entries' => [...] ]; + * + * @throws \Exception + */ + public static function searchProfiles($start = 0, $count = 100, $search = null) + { + $publish = (Config::get('system', 'publish_all') ? '' : " AND `publish` = 1 "); + $total = 0; + + if (!empty($search)) { + $searchTerm = '%' . $search . '%'; + $cnt = DBA::fetchFirst("SELECT COUNT(*) AS `total` + FROM `profile` + LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` + WHERE `is-default` $publish AND NOT `user`.`blocked` AND NOT `user`.`account_removed` + AND ((`profile`.`name` LIKE ?) OR + (`user`.`nickname` LIKE ?) OR + (`profile`.`pdesc` LIKE ?) OR + (`profile`.`locality` LIKE ?) OR + (`profile`.`region` LIKE ?) OR + (`profile`.`country-name` LIKE ?) OR + (`profile`.`gender` LIKE ?) OR + (`profile`.`marital` LIKE ?) OR + (`profile`.`sexual` LIKE ?) OR + (`profile`.`about` LIKE ?) OR + (`profile`.`romance` LIKE ?) OR + (`profile`.`work` LIKE ?) OR + (`profile`.`education` LIKE ?) OR + (`profile`.`pub_keywords` LIKE ?) OR + (`profile`.`prv_keywords` LIKE ?))", + $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, + $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm); + } else { + $cnt = DBA::fetchFirst("SELECT COUNT(*) AS `total` + FROM `profile` + LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` + WHERE `is-default` $publish AND NOT `user`.`blocked` AND NOT `user`.`account_removed`"); + } + + if (DBA::isResult($cnt)) { + $total = $cnt['total']; + } + + $order = " ORDER BY `name` ASC "; + $profiles = []; + + // If nothing found, don't try to select details + if ($total > 0) { + if (!empty($search)) { + $searchTerm = '%' . $search . '%'; + + $profiles = DBA::p("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`, + `contact`.`addr`, `contact`.`url` AS `profile_url` + FROM `profile` + LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` + LEFT JOIN `contact` ON `contact`.`uid` = `user`.`uid` + WHERE `is-default` $publish AND NOT `user`.`blocked` AND NOT `user`.`account_removed` AND `contact`.`self` + AND ((`profile`.`name` LIKE ?) OR + (`user`.`nickname` LIKE ?) OR + (`profile`.`pdesc` LIKE ?) OR + (`profile`.`locality` LIKE ?) OR + (`profile`.`region` LIKE ?) OR + (`profile`.`country-name` LIKE ?) OR + (`profile`.`gender` LIKE ?) OR + (`profile`.`marital` LIKE ?) OR + (`profile`.`sexual` LIKE ?) OR + (`profile`.`about` LIKE ?) OR + (`profile`.`romance` LIKE ?) OR + (`profile`.`work` LIKE ?) OR + (`profile`.`education` LIKE ?) OR + (`profile`.`pub_keywords` LIKE ?) OR + (`profile`.`prv_keywords` LIKE ?)) + $order LIMIT ?,?", + $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, + $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, $searchTerm, + $start, $count + ); + } else { + $profiles = DBA::p("SELECT `profile`.*, `profile`.`uid` AS `profile_uid`, `user`.`nickname`, `user`.`timezone` , `user`.`page-flags`, + `contact`.`addr`, `contact`.`url` AS `profile_url` + FROM `profile` + LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` + LEFT JOIN `contact` ON `contact`.`uid` = `user`.`uid` + WHERE `is-default` $publish AND NOT `user`.`blocked` AND NOT `user`.`account_removed` AND `contact`.`self` + $order LIMIT ?,?", + $start, $count + ); + } + } + + if (DBA::isResult($profiles) && $total > 0) { + return [ + 'total' => $total, + 'entries' => DBA::toArray($profiles), + ]; + + } else { + return [ + 'total' => $total, + 'entries' => [], + ]; + } + } }