function directory_content(&$a) { if (get_config('system', 'block_public') && !local_channel() && !remote_channel()) { notice(t('Public access denied.') . EOL); return; } $observer = get_observer_hash(); $globaldir = get_globaldir_setting($observer); $safe_mode = get_safemode_setting($observer); $pubforums = null; if (array_key_exists('pubforums', $_REQUEST)) { $pubforums = intval($_REQUEST['pubforums']); } if (!$pubforums) { $pubforums = null; } $o = ''; nav_set_selected('directory'); if (x($_POST, 'search')) { $search = notags(trim($_POST['search'])); } else { $search = x($_GET, 'search') ? notags(trim(rawurldecode($_GET['search']))) : ''; } if (strpos($search, '=') && local_channel() && get_pconfig(local_channel(), 'feature', 'expert')) { $advanced = $search; } $keywords = $_GET['keywords'] ? $_GET['keywords'] : ''; // Suggest channels if no search terms or keywords are given $suggest = local_channel() && x($_REQUEST, 'suggest') ? $_REQUEST['suggest'] : ''; if ($suggest) { $r = suggestion_query(local_channel(), get_observer_hash()); // Remember in which order the suggestions were $addresses = array(); $index = 0; foreach ($r as $rr) { $addresses[$rr['xchan_addr']] = $index++; } // Build query to get info about suggested people $advanced = ''; foreach (array_keys($addresses) as $address) { $advanced .= "address=\"{$address}\" "; } // Remove last space in the advanced query $advanced = rtrim($advanced); } $tpl = get_markup_template('directory_header.tpl'); $dirmode = intval(get_config('system', 'directory_mode')); if ($dirmode == DIRECTORY_MODE_PRIMARY || $dirmode == DIRECTORY_MODE_STANDALONE) { $url = z_root() . '/dirsearch'; } if (!$url) { $directory = find_upstream_directory($dirmode); $url = $directory['url'] . '/dirsearch'; } $token = get_config('system', 'realm_token'); logger('mod_directory: URL = ' . $url, LOGGER_DEBUG); $contacts = array(); if (local_channel()) { $x = q("select abook_xchan from abook where abook_channel = %d", intval(local_channel())); if ($x) { foreach ($x as $xx) { $contacts[] = $xx['abook_xchan']; } } } if ($url) { // We might want to make the tagadelic count (&kw=) configurable or turn it off completely. $numtags = get_config('system', 'directorytags'); $kw = intval($numtags) ? $numtags : 50; $query = $url . '?f=&kw=' . $kw . ($safe_mode != 1 ? '&safe=' . $safe_mode : ''); if ($token) { $query .= '&t=' . $token; } if (!$globaldir) { $query .= '&hub=' . get_app()->get_hostname(); } if ($search) { $query .= '&name=' . urlencode($search) . '&keywords=' . urlencode($search); } if (strpos($search, '@')) { $query .= '&address=' . urlencode($search); } if ($keywords) { $query .= '&keywords=' . urlencode($keywords); } if ($advanced) { $query .= '&query=' . urlencode($advanced); } if (!is_null($pubforums)) { $query .= '&pubforums=' . intval($pubforums); } $sort_order = x($_REQUEST, 'order') ? $_REQUEST['order'] : 'date'; if ($sort_order) { $query .= '&order=' . urlencode($sort_order); } if ($a->pager['page'] != 1) { $query .= '&p=' . $a->pager['page']; } logger('mod_directory: query: ' . $query); $x = z_fetch_url($query); logger('directory: return from upstream: ' . print_r($x, true), LOGGER_DATA); if ($x['success']) { $t = 0; $j = json_decode($x['body'], true); if ($j) { if ($j['results']) { $entries = array(); $photo = 'thumb'; foreach ($j['results'] as $rr) { $profile_link = chanlink_url($rr['url']); $pdesc = $rr['description'] ? $rr['description'] . '<br />' : ''; $connect_link = local_channel() ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : ''; // Checking status is disabled ATM until someone checks the performance impact more carefully //$online = remote_online_status($rr['address']); $online = ''; if (in_array($rr['hash'], $contacts)) { $connect_link = ''; } $details = ''; if (strlen($rr['locale'])) { $details .= $rr['locale']; } if (strlen($rr['region'])) { if (strlen($rr['locale'])) { $details .= ', '; } $details .= $rr['region']; } if (strlen($rr['country'])) { if (strlen($details)) { $details .= ', '; } $details .= $rr['country']; } if (strlen($rr['birthday'])) { if (($years = age($rr['birthday'], 'UTC', '')) != 0) { $details .= '<br />' . t('Age: ') . $years; } } $page_type = ''; if ($rr['total_ratings']) { $total_ratings = sprintf(tt("%d rating", "%d ratings", $rr['total_ratings']), $rr['total_ratings']); } else { $total_ratings = ''; } $profile = $rr; if (x($profile, 'locale') == 1 || x($profile, 'region') == 1 || x($profile, 'postcode') == 1 || x($profile, 'country') == 1) { $location = t('Location:'); } $gender = x($profile, 'gender') == 1 ? t('Gender: ') . $profile['gender'] : False; $marital = x($profile, 'marital') == 1 ? t('Status: ') . $profile['marital'] : False; $homepage = x($profile, 'homepage') == 1 ? t('Homepage: ') : False; $homepageurl = x($profile, 'homepage') == 1 ? $profile['homepage'] : ''; $hometown = x($profile, 'hometown') == 1 ? t('Hometown: ') . $profile['hometown'] : False; $about = x($profile, 'about') == 1 ? t('About: ') . bbcode($profile['about']) : False; $keywords = x($profile, 'keywords') ? $profile['keywords'] : ''; $out = ''; if ($keywords) { $keywords = str_replace(',', ' ', $keywords); $keywords = str_replace(' ', ' ', $keywords); $karr = explode(' ', $keywords); if ($karr) { if (local_channel()) { $r = q("select keywords from profile where uid = %d and is_default = 1 limit 1", intval(local_channel())); if ($r) { $keywords = str_replace(',', ' ', $r[0]['keywords']); $keywords = str_replace(' ', ' ', $keywords); $marr = explode(' ', $keywords); } } foreach ($karr as $k) { if (strlen($out)) { $out .= ', '; } if ($marr && in_arrayi($k, $marr)) { $out .= '<strong>' . $k . '</strong>'; } else { $out .= $k; } } } } $entry = array('id' => ++$t, 'profile_link' => $profile_link, 'public_forum' => $rr['public_forum'], 'photo' => $rr['photo'], 'hash' => $rr['hash'], 'alttext' => $rr['name'] . (local_channel() || remote_channel() ? ' ' . $rr['address'] : ''), 'name' => $rr['name'], 'details' => $pdesc . $details, 'profile' => $profile, 'address' => $rr['address'], 'nickname' => substr($rr['address'], 0, strpos($rr['address'], '@')), 'location' => $location, 'gender' => $gender, 'total_ratings' => $total_ratings, 'viewrate' => true, 'canrate' => local_channel() ? true : false, 'pdesc' => $pdesc, 'marital' => $marital, 'homepage' => $homepage, 'homepageurl' => linkify($homepageurl), 'hometown' => $hometown, 'about' => $about, 'conn_label' => t('Connect'), 'forum_label' => t('Public Forum:'), 'connect' => $connect_link, 'online' => $online, 'kw' => $out ? t('Keywords: ') : '', 'keywords' => $out, 'ignlink' => $suggest ? $a->get_baseurl() . '/directory?ignore=' . $rr['hash'] : '', 'ignore_label' => "Don't suggest", 'safe' => $safe_mode); $arr = array('contact' => $rr, 'entry' => $entry); call_hooks('directory_item', $arr); unset($profile); unset($location); if (!$arr['entry']) { continue; } if ($sort_order == '' && $suggest) { $entries[$addresses[$rr['address']]] = $arr['entry']; // Use the same indexes as originally to get the best suggestion first } else { $entries[] = $arr['entry']; } } ksort($entries); // Sort array by key so that foreach-constructs work as expected if ($j['keywords']) { $a->data['directory_keywords'] = $j['keywords']; } logger('mod_directory: entries: ' . print_r($entries, true), LOGGER_DATA); if ($_REQUEST['aj']) { if ($entries) { $o = replace_macros(get_markup_template('directajax.tpl'), array('$entries' => $entries)); } else { $o = '<div id="content-complete"></div>'; } echo $o; killme(); } else { $maxheight = 175; $o .= "<script> var page_query = '" . $_GET['q'] . "'; var extra_args = '" . extra_query_args() . "' ; divmore_height = " . intval($maxheight) . "; </script>"; $o .= replace_macros($tpl, array('$search' => $search, '$desc' => t('Find'), '$finddsc' => t('Finding:'), '$safetxt' => htmlspecialchars($search, ENT_QUOTES, 'UTF-8'), '$entries' => $entries, '$dirlbl' => $suggest ? t('Channel Suggestions') : t('Directory'), '$submit' => t('Find'), '$next' => alt_pager($a, $j['records'], t('next page'), t('previous page')))); } } else { if ($_REQUEST['aj']) { $o = '<div id="content-complete"></div>'; echo $o; killme(); } if ($a->pager['page'] == 1 && $j['records'] == 0 && strpos($search, '@')) { goaway(z_root() . '/chanview/?f=&address=' . $search); } info(t("No entries (some entries may be hidden).") . EOL); } } } } return $o; }
/** * @brief Called by the directory_sort widget. */ function dir_sort_links() { $safe_mode = 1; $observer = get_observer_hash(); $safe_mode = get_safemode_setting($observer); $globaldir = get_globaldir_setting($observer); // Build urls without order and pubforums so it's easy to tack on the changed value // Probably there's an easier way to do this $current_order = $_REQUEST['order'] ? $_REQUEST['order'] : 'date'; $url = 'directory?f='; $tmp = array_merge($_GET, $_POST); unset($tmp['order']); unset($tmp['q']); unset($tmp['f']); $sorturl = $url . http_build_query($tmp); $tmp = array_merge($_GET, $_POST); unset($tmp['pubforums']); unset($tmp['global']); unset($tmp['safe']); unset($tmp['q']); unset($tmp['f']); $forumsurl = $url . http_build_query($tmp); $o = replace_macros(get_markup_template('dir_sort_links.tpl'), array('$header' => t('Directory Options'), '$normal' => t('Alphabetic'), '$reverse' => t('Reverse Alphabetic'), '$date' => t('Newest to Oldest'), '$reversedate' => t('Oldest to Newest'), '$sort' => t('Sort'), '$selected_sort' => $current_order, '$sorturl' => $sorturl, '$forumsurl' => $forumsurl, '$safemode' => array('safemode', t('Safe Mode'), $safe_mode, '', '', ' onchange=\'window.location.href="' . $forumsurl . '&safe="+(this.checked ? 1 : 0)\''), '$pubforums' => array('pubforums', t('Public Forums Only'), x($_REQUEST, 'pubforums') ? $_REQUEST['pubforums'] : '', '', '', ' onchange=\'window.location.href="' . $forumsurl . '&pubforums="+(this.checked ? 1 : 0)\''), '$globaldir' => array('globaldir', t('This Website Only'), 1 - intval($globaldir), '', '', ' onchange=\'window.location.href="' . $forumsurl . '&global="+(this.checked ? 0 : 1)\''))); return $o; }