/** * build linked tags * * @param string the full list of tags * @return string HTML tags to be put in the resulting page */ public static function &build_tags($tags) { global $context; $text = ''; // list existing tags $tags = explode(',', $tags); foreach ($tags as $tag) { if (!($tag = trim($tag))) { continue; } if ($category = Categories::get_by_keyword($tag)) { // get category visibility and check surfer rights $active = $category['active']; if ($active == 'Y' || $active == 'R' && Surfer::is_member() || $active == 'N' && Surfer::is_associate()) { // add background color to distinguish this category against others if (isset($category['background_color']) && $category['background_color']) { $tag = '<span style="background-color: ' . $category['background_color'] . '; padding: 0 3px 0 3px;">' . $tag . '</span>'; } $text .= Skin::build_link(Categories::get_permalink($category), $tag, 'basic') . ' '; } else { // do not show the tag for this category $text .= ''; } } else { $text .= $tag . ' '; } } $text = rtrim($text, ' '); // a link to add a tag return $text; }
// short link to some section } elseif (!strncmp($id, 's~', 2) && ($item = Sections::get(restore_number(substr($id, 2))))) { Safe::redirect(Sections::get_permalink($item)); // look in sections } elseif ($items =& Sections::list_for_name($id, NULL, 'full')) { // only one section has this name if (count($items) == 1) { list($url, $attributes) = each($items); Safe::redirect($url); } // splash $context['text'] .= '<p>' . i18n::s('Select below among available sections.') . '</p>'; // several pages $context['text'] .= Skin::build_list($items, 'decorated'); // look in categories } elseif (($item = Categories::get($id)) || ($item =& Categories::get_by_keyword($id))) { Safe::redirect(Categories::get_permalink($item)); // look in articles } elseif ($items =& Articles::list_for_name($id, NULL, 'full')) { // only one page has this name if (count($items) == 1) { list($url, $attributes) = each($items); Safe::redirect($url); } // splash $context['text'] .= '<p>' . i18n::s('Select below among available pages.') . '</p>'; // several pages $context['text'] .= Skin::build_list($items, 'decorated'); // look in user profiles } elseif ($item = Users::get($id)) { Safe::redirect(Users::get_permalink($item));
if (Surfer::is_crawler()) { Safe::header('Status: 401 Unauthorized', TRUE, 401); Logger::error(i18n::s('You are not allowed to perform this operation.')); // ensure we have a valid category to host keywords } elseif (!$root_category) { Logger::error(i18n::s('No item has been found.')); } elseif (!Surfer::is_member()) { Safe::header('Status: 401 Unauthorized', TRUE, 401); Logger::error(i18n::s('You are not allowed to perform this operation.')); // ensure we have a keyword } elseif (!$search) { Logger::error(i18n::s('No keyword to search for.')); } elseif (!($articles = Articles::search($search, 1.0, 50, 'raw'))) { Logger::error(i18n::s('No item has been found.')); // create a category for this keyword if none exists yet } elseif (!($category =& Categories::get_by_keyword($search))) { $fields = array(); $fields['keywords'] = $search; $fields['anchor'] = $root_category; $fields['title'] = ucfirst($search); if ($fields['id'] = Categories::post($fields)) { Categories::clear($fields); $category = Categories::get($fields['id']); } } // ensure we have a valid category for found articles if (isset($articles) && (!isset($category) || !$category)) { Logger::error(i18n::s('No item has been found.')); } elseif (isset($articles) && is_array($articles)) { foreach ($articles as $id => $not_used) { if (!Members::assign('category:' . $category['id'], 'article:' . $id)) {
/** * remember publications and tags * * This function links the provided reference to categories, based * on publication time and tags. * * The reference is linked to weekly and monthly categories, except if the * global parameter 'users_without_archiving' has been set to 'Y'. * * @see users/configure.php * * Tags can be provided either as a string of keywords separated by commas, * or as an array of strings. * * @param string a reference to the published material (e.g., 'article:12') * @param string the publication date and time, if any * @param mixed a list of related tags, if any * * @see articles/articles.php * @see categories/check.php * @see services/blog.php */ public static function remember($reference, $stamp = NULL, $tags = NULL) { global $context; // if automatic archiving has not been disabled if (!isset($context['users_without_archiving']) || $context['users_without_archiving'] != 'Y') { // if the stamp has a value, this is a valid publication if (is_string($stamp) && $stamp > NULL_DATE && ($stamp = strtotime($stamp)) && ($stamp = getdate($stamp))) { // weeks are starting on Monday $week = mktime(0, 0, 0, $stamp['mon'], $stamp['mday'] - $stamp['wday'] + 1, $stamp['year']); // create the category for this week if it does not exist if (!($category = Categories::lookup('week ' . date('y/m/d', $week))) && ($anchor = Categories::get(i18n::c('weekly')))) { $fields = array(); $fields['anchor'] = 'category:' . $anchor['id']; $fields['nick_name'] = 'week ' . date('y/m/d', $week); $fields['create_date'] = gmstrftime('%Y-%m-%d %H:%M:%S', $week); $fields['edit_date'] = gmstrftime('%Y-%m-%d %H:%M:%S', $week); $fields['title'] = sprintf(i18n::c('Week of %s'), date(i18n::c('m/d/y'), $week)); $fields['options'] = 'no_links'; if ($fields['id'] = Categories::post($fields)) { Categories::clear($fields); $category = 'category:' . $fields['id']; } } // link the reference to this weekly category if ($category) { Members::assign($category, $reference); } // months are starting on day 1 $month = mktime(0, 0, 0, $stamp['mon'], 1, $stamp['year']); // create the category for this month if it does not exist if (!($category = Categories::lookup('month ' . date('M Y', $month))) && ($anchor = Categories::get(i18n::c('monthly')))) { $fields = array(); $fields['anchor'] = 'category:' . $anchor['id']; $fields['nick_name'] = 'month ' . date('M Y', $month); $fields['create_date'] = gmstrftime('%Y-%m-%d %H:%M:%S', $month); $fields['edit_date'] = gmstrftime('%Y-%m-%d %H:%M:%S', $month); $fields['title'] = Skin::build_date($month, 'month', $context['preferred_language']); $fields['options'] = 'no_links'; if ($fields['id'] = Categories::post($fields)) { Categories::clear($fields); $category = 'category:' . $fields['id']; } } // link the reference to this monthly category if ($category) { Members::assign($category, $reference); } } } // link to selected categories --do not accept ; as separator, because this conflicts with UTF-8 encoding if (is_string($tags) && $tags) { $tags = preg_split('/[ \\t]*,\\s*/', $tags); } if (is_array($tags) && count($tags)) { // create a category to host keywords, if none exists if (!($root_category = Categories::lookup('keywords'))) { $fields = array(); $fields['nick_name'] = 'keywords'; $fields['title'] = i18n::c('Keywords'); $fields['introduction'] = i18n::c('Classified pages'); $fields['description'] = i18n::c('This category is a specialized glossary of terms, made out of tags added to pages, and out of search requests.'); $fields['rank'] = 29000; $fields['options'] = 'no_links'; if ($fields['id'] = Categories::post($fields)) { Categories::clear($fields); $root_category = 'category:' . $fields['id']; } } // one category per tag $assigned = array(); foreach ($tags as $title) { // create a category if tag is unknown if (!($category =& Categories::get_by_keyword($title))) { $fields = array(); $fields['title'] = ucfirst($title); $fields['keywords'] = $title; if ($root_category) { $fields['anchor'] = $root_category; } if ($fields['id'] = Categories::post($fields)) { Categories::clear($fields); $category = 'category:' . $fields['id']; } } else { $category = 'category:' . $category['id']; } // link page to the category if ($category) { Members::assign($category, $reference); $assigned[] = $category; } } // back to a string representation $tags = join(', ', $tags); // clean assignments for removed tags // the list of members $query = "SELECT anchor FROM " . SQL::table_name('members') . " WHERE (member LIKE '" . SQL::escape($reference) . "') AND (anchor LIKE 'category:%')" . " LIMIT 0, 500"; if ($result = SQL::query($query)) { while ($row = SQL::fetch($result)) { if (in_array($row['anchor'], $assigned)) { continue; } // assigned, and a keyword exists, but not in the string of tags if (($category = Anchors::get($row['anchor'])) && ($keywords = $category->get_value('keywords')) && stripos($tags, $keywords) === FALSE) { Members::free($row['anchor'], $reference); } } } } }