/** * list comments * * @param resource the SQL result * @return string the rendered text * * @see layouts/layout.php **/ function layout($result) { global $context; // empty list if (!SQL::count($result)) { $output = array(); return $output; } // we return an array of ($url => $attributes) $items = array(); // process all items in the list include_once $context['path_to_root'] . 'comments/comments.php'; while ($item = SQL::fetch($result)) { // url to view the comment $url = Comments::get_url($item['id']); // initialize variables $prefix = $label = $suffix = $icon = ''; // the title as the label if ($item['create_name']) { $label .= ucfirst($item['create_name']) . ' '; } // time of creation $label .= Skin::build_date($item['create_date']); // text beginning if ($text = Skin::strip($item['description'], 10, NULL, NULL)) { $suffix = ' - ' . $text; } // list all components for this item $items[$url] = array($prefix, $label, $suffix, 'comment', $icon); } // end of processing SQL::free($result); return $items; }
public function get_comment_notification($item) { global $context; // build a tease notification for simple members // sanity check if (!isset($item['anchor']) || !($anchor = Anchors::get($item['anchor']))) { throw new Exception('no anchor for this comment'); } // headline $headline = sprintf(i18n::c('%s has replied'), Surfer::get_link()); $content = BR; // shape these $tease = Skin::build_mail_content($headline, $content); // a set of links $menu = array(); // call for action $link = $context['url_to_home'] . $context['url_to_root'] . Comments::get_url($item['id'], 'view'); $menu[] = Skin::build_mail_button($link, i18n::c('View the reply'), TRUE); // link to the container $menu[] = Skin::build_mail_button($anchor->get_url(), $anchor->get_title(), FALSE); // finalize links $tease .= Skin::build_mail_menu($menu); // assemble all parts of the mail $mail = array(); $mail['subject'] = sprintf(i18n::c('%s: %s'), i18n::c('Reply in the discussion'), strip_tags($anchor->get_title())); $mail['notification'] = Comments::build_notification($item); // full notification $mail['tease'] = Mailer::build_notification($tease, 1); return $mail; }
/** * list comments as successive notes in a thread * * @param resource the SQL result * @return string the rendered text **/ function layout($result) { global $context; // we return formatted text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // build a list of comments while ($item = SQL::fetch($result)) { // automatic notification if ($item['type'] == 'notification') { $text = '<dd class="thread_other" style="font-style: italic;">' . ucfirst(trim($item['description'])) . '</dd>' . $text; } else { // link to user profile -- open links in separate window to enable side browsing of participant profiles if ($item['create_id']) { if ($user = Users::get($item['create_id']) && $user['full_name']) { $hover = $user['full_name']; } else { $hover = NULL; } $author = Users::get_link($item['create_name'], $item['create_address'], $item['create_id'], TRUE, $hover); } else { $author = Users::get_link($item['edit_name'], $item['edit_address'], $item['edit_id'], TRUE); } // differentiate my posts from others if (Surfer::get_id() && $item['create_id'] == Surfer::get_id()) { $style = ' class="thread_me"'; } else { $style = ' class="thread_other"'; } // a clickable label $stamp = '#'; // flag old items on same day if (!strncmp($item['edit_date'], gmstrftime('%Y-%m-%d %H:%M:%S', time()), 10)) { $stamp = Skin::build_time($item['edit_date']); } else { $stamp = Skin::build_date($item['edit_date']); } // append this at the end of the comment $stamp = ' <div style="float: right; font-size: x-small">' . Skin::build_link(Comments::get_url($item['id']), $stamp, 'basic', i18n::s('Edit')) . '</div>'; // package everything --change order to get oldest first $text = '<dt' . $style . '>' . $author . '</dt><dd' . $style . '>' . $stamp . ucfirst(trim($item['description'])) . '</dd>' . $text; } } // end of processing SQL::free($result); // finalize the returned definition list if ($text) { $text = '<dl>' . $text . '</dl>'; } // process yacs codes $text = Codes::beautify($text); return $text; }
/** * layout the newest articles * * caution: this function also updates page title directly, and this makes its call non-cacheable * * @param array the article * @return string the rendered text **/ function layout_newest($item) { global $context; // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // the url to view this item $url = Articles::get_permalink($item); // reset the rendering engine between items Codes::initialize($url); // build a title if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // title prefix & suffix $text = $prefix = $suffix = ''; // flag articles updated recently if ($context['site_revisit_after'] < 1) { $context['site_revisit_after'] = 2; } $context['fresh'] = gmstrftime('%Y-%m-%d %H:%M:%S', mktime(0, 0, 0, date("m"), date("d") - $context['site_revisit_after'], date("Y"))); // link to permalink if (Surfer::is_empowered()) { $title = Skin::build_box_title($title, $url, i18n::s('Permalink')); } // signal articles to be published if ($item['publish_date'] <= NULL_DATE) { $prefix .= DRAFT_FLAG; } else { if ($item['publish_date'] > NULL_DATE && $item['publish_date'] > $context['now']) { $prefix .= DRAFT_FLAG; } } // signal restricted and private articles if ($item['active'] == 'N') { $prefix .= PRIVATE_FLAG . ' '; } elseif ($item['active'] == 'R') { $prefix .= RESTRICTED_FLAG . ' '; } // signal locked articles if (isset($item['locked']) && $item['locked'] == 'Y' && Articles::is_owned($item, $anchor)) { $suffix .= LOCKED_FLAG; } // flag expired article if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) { $suffix .= EXPIRED_FLAG; } // update page title directly $text .= Skin::build_block($prefix . $title . $suffix, 'title'); // if this article has a specific icon, use it if ($item['icon_url']) { $icon = $item['icon_url']; } elseif ($item['anchor'] && ($anchor = Anchors::get($item['anchor']))) { $icon = $anchor->get_icon_url(); } // if we have a valid image if (preg_match('/(.gif|.jpg|.jpeg|.png)$/i', $icon)) { // fix relative path if (!preg_match('/^(\\/|http:|https:|ftp:)/', $icon)) { $icon = $context['url_to_root'] . $icon; } // flush the image on the right $text .= '<img src="' . $icon . '" class="right_image" alt="" />'; } // article rating, if the anchor allows for it if (!is_object($anchor) || !$anchor->has_option('without_rating')) { // report on current rating $label = ''; if ($item['rating_count']) { $label = Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])) . ' '; } $label .= i18n::s('Rate this page'); // allow for rating $text .= Skin::build_link(Articles::get_url($item['id'], 'like'), $label, 'basic'); } // the introduction text, if any if (is_object($overlay)) { $text .= Skin::build_block($overlay->get_text('introduction', $item), 'introduction'); } else { $text .= Skin::build_block($item['introduction'], 'introduction'); } // insert overlay data, if any if (is_object($overlay)) { $text .= $overlay->get_text('view', $item); } // the beautified description, which is the actual page body if ($item['description']) { // use adequate label if (is_object($overlay) && ($label = $overlay->get_label('description'))) { $text .= Skin::build_block($label, 'title'); } $text .= Skin::build_block($item['description'], 'description', '', $item['options']); } // // list related files // // if this surfer is an editor of this article, show hidden files as well if (Articles::is_assigned($item['id']) || is_object($anchor) && $anchor->is_assigned()) { Surfer::empower(); } // build a complete box $box['bar'] = array(); $box['text'] = ''; // count the number of files in this article if ($count = Files::count_for_anchor('article:' . $item['id'])) { if ($count > 20) { $box['bar'] += array('_count' => sprintf(i18n::ns('%d file', '%d files', $count), $count)); } // list files by date (default) or by title (option files_by_title) if (Articles::has_option('files_by', $anchor, $item) == 'title') { $items = Files::list_by_title_for_anchor('article:' . $item['id'], 0, FILES_PER_PAGE, 'article:' . $item['id']); } else { $items = Files::list_by_date_for_anchor('article:' . $item['id'], 0, FILES_PER_PAGE, 'article:' . $item['id']); } if (is_array($items)) { $box['text'] .= Skin::build_list($items, 'decorated'); } // navigation commands for files $prefix = Articles::get_url($item['id'], 'navigate', 'files'); $box['bar'] += Skin::navigate($url, $prefix, $count, FILES_PER_PAGE, 0); // the command to post a new file, if allowed if (Files::allow_creation($item, $anchor, 'article')) { $link = 'files/edit.php?anchor=' . urlencode('article:' . $item['id']); $box['bar'] += array($link => i18n::s('Add a file')); } if (is_array($box['bar'])) { $box['text'] .= Skin::build_list($box['bar'], 'menu_bar'); } } // actually render the html for this box if ($box['text']) { $text .= Skin::build_box(i18n::s('Files'), $box['text'], 'header1', 'files'); } // // bottom page menu // // discuss this page, if the index page can be commented, and comments are accepted at the article level if (Comments::allow_creation($item, $anchor)) { $this->menu[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'comment'), i18n::s('Post a comment'), 'span'); } // info on related comments if ($count = Comments::count_for_anchor('article:' . $item['id'])) { $this->menu[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'list'), sprintf(i18n::ns('%d comment', '%d comments', $count), $count), 'span'); } // new links are accepted at the index page and at the article level if (Links::allow_trackback()) { $this->menu[] = Skin::build_link('links/trackback.php?anchor=' . urlencode('article:' . $item['id']), i18n::s('Reference this page'), 'span'); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'])) { $this->menu[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d link', '%d links', $count), $count), 'span'); } // new files are accepted at the index page and at the article level if (is_object($anchor) && $anchor->has_option('with_files') && !($anchor->has_option('no_files') || preg_match('/\\bno_files\\b/i', $item['options']))) { // add a file if (Files::allow_creation($item, $anchor, 'article')) { if ($context['with_friendly_urls'] == 'Y') { $link = 'files/edit.php/article/' . $item['id']; } else { $link = 'files/edit.php?anchor=' . urlencode('article:' . $item['id']); } $this->menu[] = Skin::build_link($link, i18n::s('Add a file'), 'span'); } } // modify this page if (Surfer::is_empowered()) { $this->menu[] = Skin::build_link(Articles::get_url($item['id'], 'edit'), i18n::s('Edit'), 'span'); } // view permalink if (Surfer::is_empowered()) { $this->menu[] = Skin::build_link($url, i18n::s('Permalink'), 'span'); } // insert overlay data, if any if (is_object($overlay)) { $text .= $overlay->get_text('trailer', $item); } // add trailer information from this item, if any if (isset($item['trailer']) && trim($item['trailer'])) { $text .= Codes::beautify($item['trailer']); } // returned the formatted content return $text; }
/** * list articles as topics in a forum * * @param resource the SQL result * @return string the rendered text **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // allow for complete styling $text = '<div class="last_articles">'; // build a list of articles include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; while ($item = SQL::fetch($result)) { // get the related overlay $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // the url to view this item $url = Articles::get_permalink($item); // build a title if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // reset everything $prefix = $label = $suffix = $icon = ''; // signal articles to be published if (!isset($item['publish_date']) || $item['publish_date'] <= NULL_DATE || $item['publish_date'] > gmstrftime('%Y-%m-%d %H:%M:%S')) { $prefix .= DRAFT_FLAG; } // signal restricted and private articles if ($item['active'] == 'N') { $prefix .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $prefix .= RESTRICTED_FLAG; } // flag expired articles if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) { $prefix .= EXPIRED_FLAG . ' '; } elseif ($item['create_date'] >= $context['fresh']) { $suffix .= NEW_FLAG; } elseif ($item['edit_date'] >= $context['fresh']) { $suffix .= UPDATED_FLAG; } // signal locked articles if (isset($item['locked']) && $item['locked'] == 'Y' && Articles::is_owned($item, $anchor)) { $suffix .= ' ' . LOCKED_FLAG; } // rating if ($item['rating_count'] && !(is_object($anchor) && $anchor->has_option('without_rating'))) { $suffix .= ' ' . Skin::build_link(Articles::get_url($item['id'], 'like'), Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])), 'basic'); } // indicate the id in the hovering popup $hover = i18n::s('View the page'); if (Surfer::is_member()) { $hover .= ' [article=' . $item['id'] . ']'; } // one box per update $text .= '<div class="last_article" >'; // use the title as a link to the page $text .= Skin::build_block($prefix . ucfirst($title) . $suffix, 'header1'); // some details about this page $details = array(); // page starter and date if ($item['create_name']) { $details[] = sprintf(i18n::s('Started by %s'), Users::get_link($item['create_name'], $item['create_address'], $item['create_id'])) . ' ' . Skin::build_date($item['create_date']); } // page last modification if ($item['edit_date'] && $item['edit_action'] == 'article:update' && $item['edit_name']) { $details[] = Anchors::get_action_label($item['edit_action']) . ' ' . sprintf(i18n::s('by %s'), Users::get_link($item['edit_name'], $item['edit_address'], $item['edit_id'])) . ' ' . Skin::build_date($item['edit_date']); } // friends if ($friends =& Members::list_users_by_posts_for_anchor('article:' . $item['id'], 0, USERS_LIST_SIZE, 'comma5', $item['create_id'])) { $details[] = sprintf(i18n::s('with %s'), $friends); } // people details if ($details) { $text .= '<p class="details">' . join(', ', $details) . "</p>\n"; } // the introductory text $introduction = ''; if (is_object($overlay)) { $introduction = $overlay->get_text('introduction', $item); } elseif ($item['introduction']) { $introduction = $item['introduction']; } if ($introduction) { $text .= '<div style="margin: 1em 0;">' . Codes::beautify_introduction($introduction) . '</div>'; } // insert overlay data, if any if (is_object($overlay)) { $text .= $overlay->get_text('list', $item); } // info on related comments if (($count = Comments::count_for_anchor('article:' . $item['id'])) > 1) { $text .= '<div style="margin-top: 1em;"><p class="details">' . sprintf(i18n::s('%d contributions, including:'), $count) . '</p></div>'; } // avoid first file if mentioned in last contribution $file_offset = 0; // get last contribution for this page if ($comment = Comments::get_newest_for_anchor('article:' . $item['id'])) { if (preg_match('/\\[(download|file)=/', $comment['description'])) { $file_offset++; } // bars around the last contribution $bottom_menu = array(); // last contributor $contributor = Users::get_link($comment['create_name'], $comment['create_address'], $comment['create_id']); $flag = ''; if ($comment['create_date'] >= $context['fresh']) { $flag = NEW_FLAG; } elseif ($comment['edit_date'] >= $context['fresh']) { $flag = UPDATED_FLAG; } $bottom_menu[] = sprintf(i18n::s('By %s'), $contributor) . ' ' . Skin::build_date($comment['create_date']) . $flag; // offer to reply if (Comments::allow_creation($item, $anchor)) { $link = Comments::get_url($comment['id'], 'reply'); $bottom_menu[] = Skin::build_link($link, i18n::s('Reply'), 'basic'); } // gather pieces $pieces = array(); // last contribution, and user signature $pieces[] = ucfirst(trim($comment['description'])) . Users::get_signature($comment['create_id']); // bottom if ($bottom_menu) { $pieces[] = '<div style="margin-top: 1em;">' . ucfirst(trim(Skin::finalize_list($bottom_menu, 'menu'))) . '</div>'; } // put all pieces together $text .= '<div class="last_comment">' . "\n" . join("\n", $pieces) . '</div>' . "\n"; } // list more recent files if ($items = Files::list_by_date_for_anchor('article:' . $item['id'], $file_offset, 3, 'dates')) { // more files than listed $more = ''; if (($count = Files::count_for_anchor('article:' . $item['id'])) > 3) { $more = '<span class="details">' . sprintf(i18n::s('%d files, including:'), $count) . '</span>'; } if (is_array($items)) { $items = Skin::build_list($items, 'compact'); } $text .= '<div style="margin: 1em 0;">' . $more . $items . '</div>'; } // display all tags if ($item['tags']) { $text .= ' <p class="tags">' . Skin::build_tags($item['tags'], 'article:' . $item['id']) . '</p>'; } // navigation links $menu = array(); // permalink $menu[] = Skin::build_link($url, i18n::s('View the page'), 'span'); // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { $menu[] = sprintf(i18n::ns('%d link', '%d links', $count), $count); } // the main anchor link if (is_object($anchor) && (!isset($this->focus) || $item['anchor'] != $this->focus)) { $menu[] = Skin::build_link($anchor->get_url(), sprintf(i18n::s('in %s'), ucfirst($anchor->get_title())), 'span', i18n::s('View the section')); } // actually insert details $text .= Skin::finalize_list($menu, 'menu_bar'); // bottom of the box $text .= '</div>'; } // close the list of articles $text .= '</div>'; // beautify everything at once $text = Codes::beautify($text); // end of processing SQL::free($result); // done return $text; }
/** * list articles * * @param resource the SQL result * @return array * * @see layouts/layout.php **/ function layout($result) { global $context; // we return an array of ($url => $attributes) $items = array(); // empty list if (!SQL::count($result)) { return $items; } // process all items in the list include_once $context['path_to_root'] . 'articles/article.php'; include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'locations/locations.php'; while ($item = SQL::fetch($result)) { // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // provide an absolute link $url = Articles::get_permalink($item); // build a title if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // time of last update $time = SQL::strtotime($item['edit_date']); // the section $section = ''; if ($item['anchor'] && ($anchor = Anchors::get($item['anchor']))) { $section = ucfirst(trim(strip_tags(Codes::beautify_title($anchor->get_title())))); } // the icon to use $icon = ''; if ($item['thumbnail_url']) { $icon = $item['thumbnail_url']; } elseif ($item['anchor'] && ($anchor = Anchors::get($item['anchor'])) && is_callable($anchor, 'get_bullet_url')) { $icon = $anchor->get_bullet_url(); } if ($icon) { $icon = $context['url_to_home'] . $context['url_to_root'] . $icon; } // the author(s) is an e-mail address, according to rss 2.0 spec $author = ''; if (isset($item['create_address'])) { $author .= $item['create_address']; } if (isset($item['create_name']) && trim($item['create_name'])) { $author .= ' (' . $item['create_name'] . ')'; } if (isset($item['edit_address']) && trim($item['edit_address']) && $item['create_address'] != $item['edit_address']) { if ($author) { $author .= ', '; } $author .= $item['edit_address']; if (isset($item['edit_name']) && trim($item['edit_name'])) { $author .= ' (' . $item['edit_name'] . ')'; } } // some introductory text for this article $article = new Article(); $article->load_by_content($item); $introduction = $article->get_teaser('teaser'); // warns on restricted access if (isset($item['active']) && $item['active'] != 'Y') { $introduction = '[' . i18n::c('Restricted to members') . '] ' . $introduction; } // fix references $introduction = preg_replace('/"\\//', '"' . $context['url_to_home'] . '/', $introduction); // the article content $description = ''; // other rss fields $extensions = array(); // the geolocation for this page, if any if ($location = Locations::locate_anchor('article:' . $item['id'])) { $extensions[] = '<georss:point>' . str_replace(',', ' ', $location) . '</georss:point>'; } // url for comments if (is_object($anchor)) { $extensions[] = '<comments>' . encode_link($context['url_to_home'] . $context['url_to_root'] . $anchor->get_url('comments')) . '</comments>'; } // count comments $comment_count = Comments::count_for_anchor('article:' . $item['id']); $extensions[] = '<slash:comments>' . $comment_count . "</slash:comments>"; // the comment post url $extensions[] = '<wfw:comment>' . encode_link($context['url_to_home'] . $context['url_to_root'] . Comments::get_url('article:' . $item['id'], 'service.comment')) . "</wfw:comment>"; // the comment Rss url $extensions[] = '<wfw:commentRss>' . encode_link($context['url_to_home'] . $context['url_to_root'] . Comments::get_url('article:' . $item['id'], 'feed')) . "</wfw:commentRss>"; // the trackback url $extensions[] = '<trackback:ping>' . encode_link($context['url_to_home'] . $context['url_to_root'] . 'links/trackback.php?anchor=' . urlencode('article:' . $item['id'])) . "</trackback:ping>"; // no trackback:about; // list all components for this item $items[$url] = array($time, $title, $author, $section, $icon, $introduction, $description, $extensions); } // end of processing SQL::free($result); return $items; }
$label = i18n::s('Edit the comment'); } if (Surfer::is_logged()) { $menu = array_merge($menu, array(Comments::get_url($_REQUEST['id'], 'edit') => $label)); } $follow_up .= Skin::build_list($menu, 'menu_bar'); $context['text'] .= Skin::build_block($follow_up, 'bottom'); // comment author if ($author = Surfer::get_name()) { $author = sprintf(i18n::c('Comment by %s'), $author); } else { $author = i18n::c('Anonymous comment'); } // log the submission of a new comment $label = sprintf(i18n::c('%s: %s'), $author, strip_tags($anchor->get_title())); $link = $context['url_to_home'] . $context['url_to_root'] . Comments::get_url($_REQUEST['id']); $description = '<a href="' . $link . '">' . $link . '</a>'; // notify sysops Logger::notify('comments/edit.php: ' . $label, $description); // forward to the updated thread if (!isset($_REQUEST['follow_up'])) { // redirect Safe::redirect($anchor->get_url('comments')); } elseif ($_REQUEST['follow_up'] === 'json') { // provide a json version of the new comment. Comments::render_json($_REQUEST['id'], $anchor); } // update of an existing comment } else { // remember the previous version if ($item['id']) {
/** * list articles as rows in a table * * @param resource the SQL result * @return string the rendered text **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // build a list of articles $rows = array(); include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; while ($item = SQL::fetch($result)) { // get the related overlay $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // the url to view this item $url = Articles::get_permalink($item); // reset everything $id = $summary = $owner = $type = $status = $update = $progress = ''; // link to the page $id = Skin::build_link($url, $item['id'], 'basic'); // signal articles to be published if (!isset($item['publish_date']) || $item['publish_date'] <= NULL_DATE || $item['publish_date'] > gmstrftime('%Y-%m-%d %H:%M:%S')) { $summary .= DRAFT_FLAG; } // signal restricted and private articles if ($item['active'] == 'N') { $summary .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $summary .= RESTRICTED_FLAG; } // indicate the id in the hovering popup $hover = i18n::s('View the page'); if (Surfer::is_member()) { $hover .= ' [article=' . $item['id'] . ']'; } // use the title to label the link if (is_object($overlay)) { $label = Codes::beautify_title($overlay->get_text('title', $item)); } else { $label = Codes::beautify_title($item['title']); } // use the title as a link to the page $summary .= Skin::build_link($url, $label, 'basic', $hover); // signal locked articles if (isset($item['locked']) && $item['locked'] == 'Y' && Articles::is_owned($item, $anchor)) { $summary .= ' ' . LOCKED_FLAG; } // flag articles updated recently if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) { $summary .= ' ' . EXPIRED_FLAG; } elseif ($item['create_date'] >= $context['fresh']) { $summary .= ' ' . NEW_FLAG; } elseif ($item['edit_date'] >= $context['fresh']) { $summary .= ' ' . UPDATED_FLAG; } // attachment details $details = array(); // info on related files if ($count = Files::count_for_anchor('article:' . $item['id'])) { Skin::define_img('FILES_LIST_IMG', 'files/list.gif'); $details[] = FILES_LIST_IMG . sprintf(i18n::ns('%d file', '%d files', $count), $count); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { Skin::define_img('LINKS_LIST_IMG', 'links/list.gif'); $details[] = LINKS_LIST_IMG . sprintf(i18n::ns('%d link', '%d links', $count), $count); } // comments if ($count = Comments::count_for_anchor('article:' . $item['id'], TRUE)) { Skin::define_img('COMMENTS_LIST_IMG', 'comments/list.gif'); $details[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'list'), COMMENTS_LIST_IMG . sprintf(i18n::ns('%d comment', '%d comments', $count), $count)); } // combine in-line details if (count($details)) { $summary .= ' <span class="details">' . trim(implode(' ', $details)) . '</span>'; } // dates $summary .= BR . '<span class="details">' . join(BR, Articles::build_dates($anchor, $item)) . '</span>'; // display all tags if ($item['tags']) { $summary .= BR . '<span class="tags">' . Skin::build_tags($item['tags'], 'article:' . $item['id']) . '</span>'; } // page owner if (isset($item['owner_id']) && ($owner = Users::get($item['owner_id']))) { $owner = Users::get_link($owner['full_name'], $owner['email'], $owner['id']); } // type is provided by the overlay if (is_object($overlay)) { $type = $overlay->get_value('type', ''); } // status value if (is_object($overlay)) { $status = $overlay->get_value('status', ''); } // progress value if (is_object($overlay)) { $progress = $overlay->get_value('progress', ''); } // this is another row of the output $cells = array($id, $summary, $owner, $type, $status, $progress); // append this row $rows[] = $cells; } // end of processing SQL::free($result); // headers $headers = array(i18n::s('Number'), i18n::s('Information'), i18n::s('Owner'), i18n::s('Type'), i18n::s('Status'), i18n::s('Progress')); // return a sortable table $text .= Skin::table($headers, $rows, 'grid'); return $text; }
?> </div> <?php } ?> </div> <div class="linkbox"> <?php echo $Pages; ?> </div> <?php if ($Count > 0) { $DB->set_query_id($Comments); while (list($AuthorID, $Page, $PageID, $Name, $PostID, $Body, $AddedTime, $EditedTime, $EditedUserID) = $DB->next_record()) { $Link = Comments::get_url($Page, $PageID, $PostID); switch ($Page) { case 'artist': $Header = " on <a href=\"artist.php?id={$PageID}\">{$Name}</a>"; break; case 'collages': $Header = " on <a href=\"collages.php?id={$PageID}\">{$Name}</a>"; break; case 'requests': $Header = ' on ' . Artists::display_artists($Artists[$PageID]) . " <a href=\"requests.php?action=view&id={$PageID}\">{$Name}</a>"; break; case 'torrents': $Header = ' on ' . Artists::display_artists($Artists[$PageID]) . " <a href=\"torrents.php?id={$PageID}\">{$Name}</a>"; break; } CommentsView::render_comment($AuthorID, $PostID, $Body, $AddedTime, $EditedUserID, $EditedTime, $Link, false, $Header, false);
/** * list articles as slashdot do * * @param resource the SQL result * @return string the rendered text * * @see layouts/layout.php **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // layout in a table $text = Skin::table_prefix('wide'); // 'even' is used for title rows, 'odd' for detail rows $class_title = 'odd'; $class_detail = 'even'; // build a list of sections $family = ''; include_once $context['path_to_root'] . 'articles/article.php'; include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; while ($item = SQL::fetch($result)) { // change the family if ($item['family'] != $family) { $family = $item['family']; // show the family $text .= Skin::table_suffix() . '<h2><span>' . $family . ' </span></h2>' . "\n" . Skin::table_prefix('wide'); } // document this section $content = $prefix = $title = $suffix = $icon = ''; $menu = array(); // permalink $url = Sections::get_permalink($item); // get the anchor $anchor = Anchors::get($item['anchor']); // get the related overlay, if any $overlay = Overlay::load($item, 'section:' . $item['id']); // use the title to label the link if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // signal restricted and private sections if ($item['active'] == 'N') { $prefix .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $prefix .= RESTRICTED_FLAG; } // this is another row of the output $text .= '<tr class="' . $class_title . '"><th>' . $prefix . Skin::build_link($url, $title, 'basic', i18n::s('View the section')) . $suffix . '</th></tr>' . "\n"; // document most recent page here $content = $prefix = $title = $suffix = $icon = ''; $menu = array(); // branches of this tree $anchors = Sections::get_branch_at_anchor('section:' . $item['id']); // get last post $article =& Articles::get_newest_for_anchor($anchors, TRUE); if ($article['id']) { // permalink $url = Articles::get_permalink($article); // get the anchor $anchor = Anchors::get($article['anchor']); // get the related overlay, if any $overlay = Overlay::load($item, 'section:' . $item['id']); // use the title to label the link if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $article)); } else { $title = Codes::beautify_title($article['title']); } // signal restricted and private articles if ($article['active'] == 'N') { $prefix .= PRIVATE_FLAG; } elseif ($article['active'] == 'R') { $prefix .= RESTRICTED_FLAG; } // the icon to put aside if ($article['thumbnail_url']) { $icon = $article['thumbnail_url']; } // the icon to put aside if (!$icon && is_callable(array($anchor, 'get_bullet_url'))) { $icon = $anchor->get_bullet_url(); } if ($icon) { $icon = '<a href="' . $context['url_to_root'] . $url . '"><img src="' . $icon . '" class="right_image" alt="" title="' . encode_field(i18n::s('View the page')) . '" /></a>'; } // the introductory text if ($article['introduction']) { $content .= Codes::beautify_introduction($article['introduction']); } elseif (!is_object($overlay)) { $handle = new Article(); $handle->load_by_content($article); $content .= $handle->get_teaser('teaser'); } // insert overlay data, if any if (is_object($overlay)) { $content .= $overlay->get_text('list', $article); } // link to description, if any if (trim($article['description'])) { $menu[] = Skin::build_link($url, i18n::s('Read more') . MORE_IMG, 'span', i18n::s('View the page')); } // info on related files if ($count = Files::count_for_anchor('article:' . $article['id'])) { $menu[] = sprintf(i18n::ns('%d file', '%d files', $count), $count); } // info on related comments if ($count = Comments::count_for_anchor('article:' . $article['id'])) { $menu[] = sprintf(i18n::ns('%d comment', '%d comments', $count), $count); } // discuss if (Comments::allow_creation($article, $anchor)) { $menu[] = Skin::build_link(Comments::get_url('article:' . $article['id'], 'comment'), i18n::s('Discuss'), 'span'); } // the main anchor link if (is_object($anchor) && (!isset($this->focus) || $article['anchor'] != $this->focus)) { $menu[] = Skin::build_link($anchor->get_url(), ucfirst($anchor->get_title()), 'span', i18n::s('View the section')); } // list up to three categories by title, if any if ($items =& Members::list_categories_by_title_for_member('article:' . $article['id'], 0, 3, 'raw')) { foreach ($items as $id => $attributes) { $menu[] = Skin::build_link(Categories::get_permalink($attributes), $attributes['title'], 'span'); } } // append a menu $content .= '<p>' . Skin::finalize_list($menu, 'menu') . '</p>'; // this is another row of the output $text .= '<tr class="' . $class_detail . '"><td>' . '<h3 class="top"><span>' . Skin::build_link($url, $prefix . $title . $suffix, 'basic', i18n::s('View the page')) . '</span></h3>' . '<div class="content">' . $icon . $content . '</div>' . '</td></tr>' . "\n"; } } // end of processing SQL::free($result); $text .= Skin::table_suffix(); return $text; }
// deletion has to be confirmed } elseif (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') { Logger::error(i18n::s('The action has not been confirmed.')); } else { // commands $menu = array(); $delete_label = ''; if (is_object($overlay)) { $delete_label = $overlay->get_label('delete_confirmation', 'comments'); } if (!$delete_label) { $delete_label = i18n::s('Yes, I want to delete this comment'); } $menu[] = Skin::build_submit_button($delete_label, NULL, NULL, 'confirmed', $render_overlaid ? 'button submit-overlaid' : 'button'); if (isset($item['id']) && !$render_overlaid) { $menu[] = Skin::build_link(Comments::get_url($item['id']), i18n::s('Cancel'), 'span'); } elseif ($render_overlaid) { $menu[] = '<a href="javascript:;" onclick="Yacs.closeModalBox()">' . i18n::s('Cancel') . '</a>' . "\n"; } // the submit button $context['text'] .= '<form method="post" action="' . $context['script_url'] . '" id="main_form">' . "\n" . Skin::finalize_list($menu, 'menu_bar') . '<input type="hidden" name="id" value="' . $item['id'] . '" />' . "\n" . '<input type="hidden" name="confirm" value="yes" />' . "\n" . (isset($_REQUEST['follow_up']) ? '<input type="hidden" name="follow_up" value="' . $_REQUEST['follow_up'] . '" />' . "\n" : '') . '</form>' . "\n"; // set the focus Page::insert_script('$("#confirmed").focus();'); // display the full comment $context['text'] .= '<div style="padding: 1em; background-color:#CCC;">' . Codes::beautify($item['description']) . '</div>' . "\n"; // details $details = array(); // the poster of this comment $details[] = sprintf(i18n::s('by %s %s'), Users::get_link($item['create_name'], $item['create_address'], $item['create_id']), Skin::build_date($item['create_date'])); // the last edition of this comment if ($item['create_name'] != $item['edit_name']) {
<?php authorize(); if (!isset($_REQUEST['page']) || !in_array($_REQUEST['page'], array('artist', 'collages', 'requests', 'torrents')) || !isset($_POST['pageid']) || !is_number($_POST['pageid']) || !isset($_POST['body']) || trim($_POST['body']) === '') { error(0); } if ($LoggedUser['DisablePosting']) { error('Your posting privileges have been removed.'); } $Page = $_REQUEST['page']; $PageID = (int) $_POST['pageid']; if (!$PageID) { error(404); } if (isset($_POST['subscribe']) && Subscriptions::has_subscribed_comments($Page, $PageID) === false) { Subscriptions::subscribe_comments($Page, $PageID); } $PostID = Comments::post($Page, $PageID, $_POST['body']); header("Location: " . Comments::get_url($Page, $PageID, $PostID)); die;
/** * list articles as a daily weblog do * * @param resource the SQL result * @return string the rendered text * * @see layouts/layout.php **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { if (Surfer::is_associate()) { $text .= '<p>' . sprintf(i18n::s('Use the %s to populate this server.'), Skin::build_link('help/populate.php', i18n::s('Content Assistant'), 'shortcut')) . '</p>'; } return $text; } // build a list of articles include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; while ($item = SQL::fetch($result)) { // three components per box $box = array(); $box['date'] = ''; $box['title'] = ''; $box['content'] = ''; // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // permalink $url = Articles::get_permalink($item); // make a live title if (is_object($overlay)) { $box['title'] .= Codes::beautify_title($overlay->get_text('title', $item)); } else { $box['title'] .= Codes::beautify_title($item['title']); } // make a clickable title $box['title'] = Skin::build_link($url, $box['title'], 'basic'); // signal restricted and private articles if ($item['active'] == 'N') { $box['title'] = PRIVATE_FLAG . $box['title']; } elseif ($item['active'] == 'R') { $box['title'] = RESTRICTED_FLAG . $box['title']; } // flag articles updated recently if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) { $box['title'] .= EXPIRED_FLAG; } elseif ($item['create_date'] >= $context['fresh']) { $box['title'] .= NEW_FLAG; } elseif ($item['edit_date'] >= $context['fresh']) { $box['title'] .= UPDATED_FLAG; } // what's the date of publication? if (isset($item['publish_date']) && $item['publish_date'] > NULL_DATE) { $box['date'] .= Skin::build_date($item['publish_date'], 'publishing'); } // the icon to put aside - never use anchor images if ($item['icon_url']) { $box['content'] .= '<a href="' . $context['url_to_root'] . $url . '"><img src="' . $item['icon_url'] . '" class="left_image" alt="" /></a>'; } // details $details = array(); // rating if ($item['rating_count'] && !(is_object($anchor) && $anchor->has_option('without_rating'))) { $details[] = Skin::build_link(Articles::get_url($item['id'], 'like'), Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])), 'basic'); } // show details if (count($details)) { $box['content'] .= '<p class="details">' . implode(' ~ ', $details) . '</p>' . "\n"; } // list categories by title, if any if ($items = Members::list_categories_by_title_for_member('article:' . $item['id'], 0, 7, 'raw')) { $tags = array(); foreach ($items as $id => $attributes) { // add background color to distinguish this category against others if (isset($attributes['background_color']) && $attributes['background_color']) { $attributes['title'] = '<span style="background-color: ' . $attributes['background_color'] . '; padding: 0 3px 0 3px;">' . $attributes['title'] . '</span>'; } $tags[] = Skin::build_link(Categories::get_permalink($attributes), $attributes['title'], 'basic'); } $box['content'] .= '<p class="tags">' . implode(' ', $tags) . '</p>'; } // the introduction text, if any if (is_object($overlay)) { $box['content'] .= Skin::build_block($overlay->get_text('introduction', $item), 'introduction'); } else { $box['content'] .= Skin::build_block($item['introduction'], 'introduction'); } // insert overlay data, if any if (is_object($overlay)) { $box['content'] .= $overlay->get_text('list', $item); } // the description $box['content'] .= Skin::build_block($item['description'], 'description', '', $item['options']); // a compact list of attached files if ($count = Files::count_for_anchor('article:' . $item['id'])) { // list files by date (default) or by title (option files_by_title) if (Articles::has_option('files_by', $anchor, $item) == 'title') { $items = Files::list_by_title_for_anchor('article:' . $item['id'], 0, FILES_PER_PAGE, 'compact'); } else { $items = Files::list_by_date_for_anchor('article:' . $item['id'], 0, FILES_PER_PAGE, 'compact'); } if (is_array($items)) { $items = Skin::build_list($items, 'compact'); } if ($items) { $box['content'] .= Skin::build_box(i18n::s('Files'), $items, 'header2'); } } // build a menu $menu = array(); // read the article $menu[] = Skin::build_link($url, i18n::s('Permalink'), 'span'); // info on related files if ($count) { $menu[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d file', '%d files', $count), $count), 'span'); } // info on related comments if ($count = Comments::count_for_anchor('article:' . $item['id'])) { $menu[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'list'), sprintf(i18n::ns('%d comment', '%d comments', $count), $count), 'span'); } // comment if (Comments::allow_creation($item, $anchor)) { $menu[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'comment'), i18n::s('Discuss'), 'span'); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { $menu[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d link', '%d links', $count), $count), 'span'); } // trackback if (Links::allow_trackback()) { $menu[] = Skin::build_link('links/trackback.php?anchor=' . urlencode('article:' . $item['id']), i18n::s('Reference this page'), 'span'); } // a menu bar if (count($menu)) { $box['content'] .= '<div class="menu_bar" style="clear: left;">' . MENU_PREFIX . implode(MENU_SEPARATOR, $menu) . MENU_SUFFIX . "</div>\n"; } // build a simple box for this post $text .= '<div class="post">' . '<div class="date">' . $box['date'] . '</div>' . '<h2><span>' . $box['title'] . '</span></h2>' . '<div class="content">' . $box['content'] . '</div>' . '</div>'; } // end of processing SQL::free($result); return $text; }
Skin::define_img('FILES_UPLOAD_IMG', 'files/upload.gif'); $menu[] = '<a href="#" onclick="$(\'#comment_upload\').slideDown(600);$(\'body\').delegate(\'#upload\', \'change\', function(event){if(/\\.zip$/i.test($(\'#upload\').val())){$(\'#upload_option\').slideDown();}else{$(\'#upload_option\').slideUp();}});return false;"><span>' . FILES_UPLOAD_IMG . i18n::s('Add a file') . '</span></a>'; } // the submit button $menu[] = Skin::build_submit_button(i18n::s('Submit'), i18n::s('Press [s] to submit data'), 's', 'submit'); // go to smileys // $menu[] = Skin::build_link('smileys/', i18n::s('Smileys'), 'open'); // display all commands $context['text'] .= Skin::finalize_list($menu, 'menu_bar'); // end the form $context['text'] .= '</form>' . "\n"; } // end of the wrapper $context['text'] .= '</div>' . "\n"; // the AJAX part $js_script = 'var Comments = {' . "\n" . "\n" . ' url: "' . $context['url_to_home'] . $context['url_to_root'] . Comments::get_url($item['id'], 'thread') . '",' . "\n" . ' timestamp: 0,' . "\n" . "\n" . ' initialize: function() { },' . "\n" . "\n" . ' contribute: function() {' . "\n" . ' Yacs.startWorking();' . "\n" . ' $("#upload_frame").load(Comments.contributed);' . "\n" . ' return true;' . "\n" . ' },' . "\n" . "\n" . ' contributed: function() {' . "\n" . ' $("#upload_frame").unbind("load");' . "\n" . ' $("#comment_upload").slideUp(600);' . "\n" . ' $("#upload_option").slideUp();' . "\n" . ' $("#upload").replaceWith(\'<input type="file" id="upload" name="upload" size="30" />\');' . "\n" . ' $("#description").val("").trigger("change").focus();' . "\n" . ' setTimeout(function() {Comments.subscribe(); Yacs.stopWorking();}, 500);' . "\n" . ' if((typeof OpenTok == "object") && OpenTok.session)' . "\n" . ' OpenTok.signal();' . "\n" . ' },' . "\n" . "\n" . ' keypress: function(event) {' . "\n" . ' if(event.which == 13) {' . "\n" . ' $("#submit").trigger("click");' . "\n" . ' return false;' . "\n" . ' }' . "\n" . ' },' . "\n" . "\n" . ' showMore: function() {' . "\n" . ' var options = {};' . "\n" . ' var newHeight = $("#thread_text_panel").clientHeight + 200;' . "\n" . ' options.height = newHeight + "px";' . "\n" . ' options.maxHeight = newHeight + "px";' . "\n" . ' $("#thread_text_panel").css(options);' . "\n" . ' },' . "\n" . "\n" . ' subscribe: function() {' . "\n" . ' $.ajax(Comments.url, {' . "\n" . ' type: "get",' . "\n" . ' dataType: "json",' . "\n" . ' data: { "timestamp" : Comments.timestamp },' . "\n" . ' success: Comments.updateOnSuccess' . "\n" . ' });' . "\n" . "\n" . ' },' . "\n" . "\n" . ' subscribeToExtraUpdates: function() {' . "\n" . ' $.ajax("' . $context['url_to_home'] . $context['url_to_root'] . Users::get_url($item['id'], 'visit') . '", {' . "\n" . ' type: "get",' . "\n" . ' dataType: "html",' . "\n" . ' success: function(data) { $("#thread_roster_panel").html(data); }' . "\n" . ' });' . "\n" . "\n" . ' $.ajax("' . $context['url_to_home'] . $context['url_to_root'] . Files::get_url($item['id'], 'thread') . '", {' . "\n" . ' type: "get",' . "\n" . ' dataType: "html",' . "\n" . ' success: function(data) { $("#thread_files_panel").html(data); }' . "\n" . ' });' . "\n" . "\n" . ' },' . "\n" . "\n" . ' updateOnSuccess: function(response) {' . "\n" . ' if(!response) return;' . "\n" . ' if(response["status"] != "started")' . "\n" . ' window.location.reload(true);' . "\n" . ' $("#thread_text_panel").html("<div>" + response["items"] + "</div>");' . "\n" . ' var div = $("#thread_text_panel")[0];' . "\n" . ' var scrollHeight = Math.max(div.scrollHeight, div.clientHeight);' . "\n" . ' div.scrollTop = scrollHeight - div.clientHeight;' . "\n" . ' if(typeof Comments.windowOriginalTitle != "string")' . "\n" . ' Comments.windowOriginalTitle = document.title;' . "\n" . ' document.title = "[" + response["name"] + "] " + Comments.windowOriginalTitle;' . "\n" . ' Comments.timestamp = response["timestamp"];' . "\n" . ' }' . "\n" . "\n" . '}' . "\n" . "\n" . '// wait for new comments and for other updates' . "\n" . 'Comments.subscribeTimer = setInterval("Comments.subscribe()", 5000);' . "\n" . 'Comments.subscribeTimer = setInterval("Comments.subscribeToExtraUpdates()", 59999);' . "\n" . "\n" . '// load past contributions asynchronously' . "\n" . '$(function() {' . 'Comments.subscribe();' . 'location.hash="#thread_text_panel";' . '$("#description").tipsy({gravity: "s", fade: true, title: function () {return "' . i18n::s('Contribute here') . '";}, trigger: "manual"});' . '$("#description").tipsy("show");' . 'setTimeout("$(\'#description\').tipsy(\'hide\');", 10000);' . '$("textarea#description").autogrow();' . '});' . "\n"; // only authenticated surfers can contribute if (Surfer::is_logged() && Comments::allow_creation($item, $anchor)) { $js_script .= '$(function() {' . '$("#description").focus();' . '});' . "\n" . '$(\'#description\').keypress( Comments.keypress );' . "\n"; } break; Page::insert_script($js_script); case 'excluded': // surfer is not $context['text'] .= Skin::build_block(i18n::s('You have not been enrolled into this interactive chat.'), 'caution'); break; } // // trailer information // // add trailer information from the overlay, if any --opentok videos come from here
$box['text'] .= Skin::build_list($items, 'rows'); } elseif (is_string($items)) { $box['text'] .= $items; } } // the command to post a new comment, if this is allowed if (Comments::allow_creation($anchor)) { Skin::define_img('COMMENTS_ADD_IMG', 'comments/add.gif'); $label = ''; if (is_object($anchor->overlay)) { $label = $anchor->overlay->get_label('new_command', 'comments'); } if (!$label) { $label = i18n::s('Add a comment'); } $box['bar'] = array_merge($box['bar'], array(Comments::get_url($anchor->get_reference(), 'comment') => COMMENTS_ADD_IMG . $label)); } // show commands if (@count($box['bar'])) { // append the menu bar at the end if (strlen($box['text']) > 10 && $count) { $box['text'] .= Skin::build_list($box['bar'], 'menu_bar'); } // shortcut to last comment in page if (is_object($layout) && $count > 3) { $box['bar'] += array('#last_comment' => i18n::s('Page bottom')); $box['text'] .= '<span id="last_comment" />'; } // insert the menu bar at the beginning $box['text'] = Skin::build_list($box['bar'], 'menu_bar') . $box['text']; }
/** * list articles as slashdot do * * @param resource the SQL result * @return string the rendered text **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // build a list of articles include_once $context['path_to_root'] . 'articles/article.php'; include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; $class = 'even'; while ($item = SQL::fetch($result)) { // get the related overlay $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // the url to view this item $url = Articles::get_permalink($item); // use the title to label the link if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // reset everything $content = $prefix = $label = $suffix = $icon = ''; // the icon to put aside if ($item['thumbnail_url']) { $icon = $item['thumbnail_url']; } if ($icon) { $icon = '<a href="' . $context['url_to_root'] . $url . '"><img src="' . $icon . '" class="right_image" alt="" title="' . encode_field(i18n::s('More')) . '" /></a>'; } // flag sticky pages if ($item['rank'] < 10000) { $prefix .= STICKY_FLAG; } // signal articles to be published if ($item['publish_date'] <= NULL_DATE || $item['publish_date'] > $context['now']) { $prefix .= DRAFT_FLAG; } // signal restricted and private articles if ($item['active'] == 'N') { $prefix .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $prefix .= RESTRICTED_FLAG; } // signal locked articles if (isset($item['locked']) && $item['locked'] == 'Y' && Articles::is_owned($item, $anchor)) { $suffix .= ' ' . LOCKED_FLAG; } // flag articles updated recently if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) { $suffix .= ' ' . EXPIRED_FLAG; } elseif ($item['create_date'] >= $context['fresh']) { $suffix .= ' ' . NEW_FLAG; } elseif ($item['edit_date'] >= $context['fresh']) { $suffix .= ' ' . UPDATED_FLAG; } // rating if ($item['rating_count'] && !(is_object($anchor) && $anchor->has_option('without_rating'))) { $suffix .= Skin::build_link(Articles::get_url($item['id'], 'like'), Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])), 'basic'); } // the full introductory text if ($item['introduction']) { $content .= Codes::beautify_introduction($item['introduction']); } elseif (!is_object($overlay)) { $article = new Article(); $article->load_by_content($item); $content .= $article->get_teaser('teaser'); } // insert overlay data, if any if (is_object($overlay)) { $content .= $overlay->get_text('list', $item); } // add details $details = array(); // the author if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { if ($item['edit_name'] == $item['create_name']) { $details[] = sprintf(i18n::s('by %s'), ucfirst($item['create_name'])); } else { $details[] = sprintf(i18n::s('by %s, %s'), ucfirst($item['create_name']), ucfirst($item['edit_name'])); } } // the modification date if ($item['edit_date'] > NULL_DATE) { $details[] = Skin::build_date($item['edit_date']); } // read the article $details[] = Skin::build_link($url, i18n::s('More'), 'basic'); // info on related files if ($count = Files::count_for_anchor('article:' . $item['id'], TRUE)) { $details[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d file', '%d files', $count), $count), 'basic'); } // info on related comments if ($count = Comments::count_for_anchor('article:' . $item['id'], TRUE)) { $link = Comments::get_url('article:' . $item['id'], 'list'); $details[] = Skin::build_link($link, sprintf(i18n::ns('%d comment', '%d comments', $count), $count), 'basic'); } // discuss if (Comments::allow_creation($item, $anchor)) { $details[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'comment'), i18n::s('Discuss'), 'basic'); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { $details[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d link', '%d links', $count), $count), 'basic'); } // list categories by title, if any if ($items =& Members::list_categories_by_title_for_member('article:' . $item['id'], 0, 7, 'raw')) { foreach ($items as $id => $attributes) { // add background color to distinguish this category against others if (isset($attributes['background_color']) && $attributes['background_color']) { $attributes['title'] = '<span style="background-color: ' . $attributes['background_color'] . '; padding: 0 3px 0 3px;">' . $attributes['title'] . '</span>'; } $details[] = Skin::build_link(Categories::get_permalink($attributes), $attributes['title'], 'basic'); } } // details if (count($details)) { $content .= '<div><span class="details">' . ucfirst(implode(' - ', $details)) . '</span></div>'; } // insert a complete box $text .= Skin::build_box(Skin::build_link($url, $prefix . $title . $suffix, 'basic', i18n::s('View the page')), $icon . $content, 'header1 ' . $class, 'article_' . $item['id']); // stack boxes if ($class == 'even') { $class = 'odd'; } else { $class = 'even'; } } // end of processing SQL::free($result); return $text; }
/** * list articles as rows in a table * * @param resource the SQL result * @return string the rendered text **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // build a list of articles $rows = array(); include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; while ($item = SQL::fetch($result)) { // get the related overlay $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // the url to view this item $url = Articles::get_permalink($item); // reset everything $title = $abstract = $author = ''; // signal articles to be published if (!isset($item['publish_date']) || $item['publish_date'] <= NULL_DATE || $item['publish_date'] > gmstrftime('%Y-%m-%d %H:%M:%S')) { $title .= DRAFT_FLAG; } // signal restricted and private articles if ($item['active'] == 'N') { $title .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $title .= RESTRICTED_FLAG; } // indicate the id in the hovering popup $hover = i18n::s('View the page'); if (Surfer::is_member()) { $hover .= ' [article=' . $item['id'] . ']'; } // use the title to label the link if (is_object($overlay)) { $label = Codes::beautify_title($overlay->get_text('title', $item)); } else { $label = Codes::beautify_title($item['title']); } // use the title as a link to the page $title .= Skin::build_link($url, $label, 'basic', $hover); // signal locked articles if (isset($item['locked']) && $item['locked'] == 'Y' && Articles::is_owned($item, $anchor)) { $title .= ' ' . LOCKED_FLAG; } // flag articles updated recently if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) { $title .= ' ' . EXPIRED_FLAG; } elseif ($item['create_date'] >= $context['fresh']) { $title .= ' ' . NEW_FLAG; } elseif ($item['edit_date'] >= $context['fresh']) { $title .= ' ' . UPDATED_FLAG; } // the icon if ($item['thumbnail_url']) { $abstract .= '<a href="' . $context['url_to_root'] . $url . '"><img src="' . $item['thumbnail_url'] . '" class="right_image" alt="" /></a>'; } // the introductory text if (is_object($overlay)) { $abstract .= Codes::beautify_introduction($overlay->get_text('introduction', $item)); } elseif ($item['introduction']) { $abstract .= Codes::beautify_introduction($item['introduction']); } // insert overlay data, if any if (is_object($overlay)) { $abstract .= $overlay->get_text('list', $item); } // make some abstract out of main text if (!$item['introduction'] && $context['skins_with_details'] == 'Y') { $abstract .= Skin::cap(Codes::beautify($item['description'], $item['options']), 50); } // attachment details $details = array(); // info on related files if ($count = Files::count_for_anchor('article:' . $item['id'], TRUE)) { Skin::define_img('FILES_LIST_IMG', 'files/list.gif'); $details[] = FILES_LIST_IMG . sprintf(i18n::ns('%d file', '%d files', $count), $count); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { Skin::define_img('LINKS_LIST_IMG', 'links/list.gif'); $details[] = LINKS_LIST_IMG . sprintf(i18n::ns('%d link', '%d links', $count), $count); } // comments if ($count = Comments::count_for_anchor('article:' . $item['id'], TRUE)) { Skin::define_img('COMMENTS_LIST_IMG', 'comments/list.gif'); $details[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'list'), COMMENTS_LIST_IMG . sprintf(i18n::ns('%d comment', '%d comments', $count), $count)); } // describe attachments if (count($details)) { $abstract .= '<p style="margin: 3px 0;">' . join(', ', $details) . '</p>'; } // anchors $anchors = array(); if ($members =& Members::list_categories_by_title_for_member('article:' . $item['id'], 0, 7, 'raw')) { foreach ($members as $category_id => $attributes) { // add background color to distinguish this category against others if (isset($attributes['background_color']) && $attributes['background_color']) { $attributes['title'] = '<span style="background-color: ' . $attributes['background_color'] . '; padding: 0 3px 0 3px;">' . $attributes['title'] . '</span>'; } $anchors[] = Skin::build_link(Categories::get_permalink($attributes), $attributes['title'], 'basic'); } } if (@count($anchors)) { $abstract .= '<p class="tags" style="margin: 3px 0">' . implode(' ', $anchors) . '</p>'; } // poster name if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { if ($item['create_name']) { $author = Users::get_link($item['create_name'], $item['create_address'], $item['create_id']); } else { $author = Users::get_link($item['edit_name'], $item['edit_address'], $item['edit_id']); } } // more details $details =& Articles::build_dates($anchor, $item); // rating if ($item['rating_count'] && !(is_object($anchor) && $anchor->has_option('without_rating'))) { $details[] = Skin::build_link(Articles::get_url($item['id'], 'like'), Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])), 'basic'); } // page details if (count($details)) { $details = '<p class="details">' . join(', ', $details) . '</p>'; } // this is another row of the output -- title, abstract, (author,) details if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { $cells = array($title, $abstract, $author, $details); } else { $cells = array($title, $abstract, $details); } // append this row $rows[] = $cells; } // end of processing SQL::free($result); // headers if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { $headers = array(i18n::s('Topic'), i18n::s('Abstract'), i18n::s('Poster'), i18n::s('Details')); } else { $headers = array(i18n::s('Topic'), i18n::s('Abstract'), i18n::s('Details')); } // return a sortable table $text .= Skin::table($headers, $rows, 'grid'); return $text; }
/** * list comments * * @param resource the SQL result * @return string the rendered text * * @see layouts/layout.php **/ function layout($result) { global $context; // empty list if (!SQL::count($result)) { $output = array(); return $output; } // sanity check if (!isset($this->layout_variant)) { $this->layout_variant = 'full'; } // we return an array of ($url => $attributes) $items = array(); // process all items in the list include_once $context['path_to_root'] . 'comments/comments.php'; while ($item = SQL::fetch($result)) { // get the anchor $anchor = Anchors::get($item['anchor']); // initialize variables $prefix = $suffix = ''; // there is no zoom page for comments $label = '_'; // the icon is a link to comment permalink $suffix .= Skin::build_link(Comments::get_url($item['id']), Comments::get_img($item['type']), 'basic', i18n::s('View this comment')); // a link to the user profile if ($item['create_name']) { $suffix .= ' ' . Users::get_link($item['create_name'], $item['create_address'], $item['create_id']); } else { $suffix .= ' ' . Users::get_link($item['edit_name'], $item['edit_address'], $item['edit_id']); } $menu = array(); // the edition date if ($item['create_date']) { $menu[] = Skin::build_date($item['create_date']); } else { $menu[] = Skin::build_date($item['edit_date']); } // the menu bar for associates, editors and poster if (Comments::allow_modification($anchor, $item)) { $menu[] = Skin::build_link(Comments::get_url($item['id'], 'edit'), i18n::s('edit'), 'span'); $menu[] = Skin::build_link(Comments::get_url($item['id'], 'delete'), i18n::s('delete'), 'span'); } if ($menu) { $suffix .= ' -' . Skin::finalize_list($menu, 'menu'); } // new line $suffix .= BR; // description if ($description = ucfirst(trim(Codes::beautify($item['description'] . Users::get_signature($item['create_id']))))) { $suffix .= ' ' . $description; } // url to view the comment $url = Comments::get_url($item['id']); // list all components for this item $items[$url] = array($prefix, $label, $suffix, 'comment', NULL); } // end of processing SQL::free($result); return $items; }
/** * list articles as topics in a forum * * @param resource the SQL result * @return string the rendered text **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // start a table $text .= Skin::table_prefix('jive'); // headers $text .= Skin::table_row(array(i18n::s('Topic'), i18n::s('Content')), 'header'); // build a list of articles $odd = FALSE; include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; while ($item = SQL::fetch($result)) { // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // the url to view this item $url = Articles::get_permalink($item); // use the title to label the link if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // one row per article $text .= '<tr class="' . ($odd ? 'odd' : 'even') . '"><td>'; $odd = !$odd; // signal articles to be published if (!isset($item['publish_date']) || $item['publish_date'] <= NULL_DATE || $item['publish_date'] > gmstrftime('%Y-%m-%d %H:%M:%S')) { $text .= DRAFT_FLAG; } // signal restricted and private articles if ($item['active'] == 'N') { $text .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $text .= RESTRICTED_FLAG; } // use the title as a link to the page $text .= Skin::build_link($url, '<strong>' . $title . '</strong>', 'basic'); // signal locked articles if (isset($item['locked']) && $item['locked'] == 'Y' && Articles::is_owned($item, $anchor)) { $text .= ' ' . LOCKED_FLAG; } // flag articles updated recently if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) { $text .= ' ' . EXPIRED_FLAG; } elseif ($item['create_date'] >= $context['fresh']) { $text .= ' ' . NEW_FLAG; } elseif ($item['edit_date'] >= $context['fresh']) { $text .= ' ' . UPDATED_FLAG; } // add details, if any $details = array(); // poster name if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { if ($item['create_name']) { $details[] = sprintf(i18n::s('posted by %s %s'), Users::get_link($item['create_name'], $item['create_address'], $item['create_id']), Skin::build_date($item['create_date'])); } } // last update $details[] = sprintf(i18n::s('Updated %s'), Skin::build_date($item['edit_date'])); // add details to the title if (count($details)) { $text .= '<p class="details" style="margin: 3px 0">' . join(', ', $details) . '</p>'; } // display all tags if ($item['tags']) { $text .= '<p class="tags">' . Skin::build_tags($item['tags'], 'article:' . $item['id']) . '</p>'; } // next cell for the content $text .= '</td><td width="70%">'; // the content to be displayed $content = ''; // rating if ($item['rating_count'] && !(is_object($anchor) && $anchor->has_option('without_rating'))) { $content .= Skin::build_link(Articles::get_url($item['id'], 'like'), Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])), 'basic'); } // the introductory text if (is_object($overlay)) { $content .= Codes::beautify_introduction($overlay->get_text('introduction', $item)); } else { $content .= Codes::beautify_introduction($item['introduction']); } // insert overlay data, if any if (is_object($overlay)) { $content .= $overlay->get_text('list', $item); } // the description $content .= Skin::build_block($item['description'], 'description', '', $item['options']); // attachment details $details = array(); // info on related files if ($count = Files::count_for_anchor('article:' . $item['id'])) { Skin::define_img('FILES_LIST_IMG', 'files/list.gif'); $details[] = Skin::build_link($url . '#_attachments', FILES_LIST_IMG . sprintf(i18n::ns('%d file', '%d files', $count), $count), 'span'); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { Skin::define_img('LINKS_LIST_IMG', 'links/list.gif'); $details[] = LINKS_LIST_IMG . sprintf(i18n::ns('%d link', '%d links', $count), $count); } // count replies if ($count = Comments::count_for_anchor('article:' . $item['id'])) { $details[] = Skin::build_link($url . '#_discussion', sprintf(i18n::ns('%d comment', '%d comments', $count), $count), 'span'); } // the command to reply if (Comments::allow_creation($item, $anchor)) { Skin::define_img('COMMENTS_ADD_IMG', 'comments/add.gif'); $details[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'comment'), COMMENTS_ADD_IMG . i18n::s('Post a comment'), 'span'); } // describe attachments $content .= Skin::finalize_list($details, 'menu_bar'); // end the row $text .= $content . '</td></tr>'; } // end of processing SQL::free($result); // return the table $text .= Skin::table_suffix(); return $text; }
/** * list comments as successive reader notes * * @param resource the SQL result * @return string the rendered text * * @see layouts/layout.php **/ function layout($result) { global $context; // empty list if (!SQL::count($result)) { $output = array(); return $output; } // return some formatted text $text = '<dl class="wiki_comments">'; // build a list of comments $index = 0; include_once $context['path_to_root'] . 'comments/comments.php'; while ($item = SQL::fetch($result)) { // odd or even $index++; if ($index % 2) { $class = 'odd'; } else { $class = 'even'; } // get the anchor $anchor = Anchors::get($item['anchor']); // include a link to comment permalink $text .= '<dt class="' . $class . ' details">'; // a link to the user profile $text .= Users::get_link($item['create_name'], $item['create_address'], $item['create_id']); $menu = array(); // the creation date $label = Skin::build_date($item['create_date']); // flag new comments if ($item['create_date'] >= $context['fresh']) { $label .= NEW_FLAG; } $menu[] = $label; // the menu bar for associates and poster if (Comments::allow_modification($anchor, $item)) { $menu[] = Skin::build_link(Comments::get_url($item['id'], 'edit'), i18n::s('edit'), 'basic'); $menu[] = Skin::build_link(Comments::get_url($item['id'], 'delete'), i18n::s('delete'), 'basic'); } $text .= ' - ' . Skin::finalize_list($menu, 'menu'); $text .= '</dt>'; // each comment has an id $text .= '<dd class="' . $class . '" id="comment_' . $item['id'] . '">'; // the comment itself $text .= ucfirst(trim($item['description'] . Users::get_signature($item['create_id']))); // comment has been modified if ($item['create_name'] && $item['edit_name'] != $item['create_name']) { $text .= BR . '<span class="details">(' . sprintf(i18n::s('modified by %s'), $item['edit_name']) . ')</span>'; } // end of this note $text .= '</dd>'; } // end of the list $text .= '</dl>'; // process yacs codes $text = Codes::beautify($text); // end of processing SQL::free($result); return $text; }
/** * get the url to display the main page for this anchor * * @see shared/anchor.php * * @param string the targeted action ('view', 'print', 'edit', 'delete', ...) * @return an anchor to the viewing script, or NULL on error */ function get_url($action = 'view') { // sanity check if (!isset($this->item['id'])) { return NULL; } switch ($action) { // view comments case 'comments': // variants that start at the article page if ($this->has_option('view_as_chat')) { return $this->get_url() . '#comments'; } // start threads on a separate page if ($this->has_layout('alistapart')) { return Comments::get_url($this->get_reference(), 'list'); } // layouts that start at the article page --assume we have at least one comment, on a tab return Articles::get_permalink($this->item) . '#_discussion'; // list of files // list of files case 'files': return $this->get_url() . '#_attachments'; // list of links // list of links case 'links': return $this->get_url() . '#_attachments'; // jump to parent page // jump to parent page case 'parent': if (!isset($this->anchor)) { $this->anchor = Anchors::get($this->item['anchor']); } return $this->anchor->get_url(); // the permalink page // the permalink page case 'view': return Articles::get_permalink($this->item); // another action // another action default: return Articles::get_url($this->item['id'], $action, $this->item['title'], $this->item['nick_name']); } }
/** * list articles as digg do * * @param resource the SQL result * @return string the rendered text * * @see layouts/layout.php **/ function layout($result) { global $context; // empty list if (!SQL::count($result)) { $label = i18n::s('No page to display.'); if (Surfer::is_associate()) { $label .= ' ' . sprintf(i18n::s('Use the %s to populate this server.'), Skin::build_link('help/populate.php', i18n::s('Content Assistant'), 'shortcut')); } $output = '<p>' . $label . '</p>'; return $output; } // build a list of articles $text = ''; $item_count = 0; include_once $context['path_to_root'] . 'comments/comments.php'; include_once $context['path_to_root'] . 'links/links.php'; while ($item = SQL::fetch($result)) { // permalink $url = Articles::get_permalink($item); // get the anchor $anchor = Anchors::get($item['anchor']); // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // next item $item_count += 1; // section opening if ($item_count == 1) { $text .= '<div class="newest">' . "\n"; } // reset everything $content = $prefix = $label = $suffix = $icon = ''; // the icon to put aside if ($item['thumbnail_url']) { $icon = $item['thumbnail_url']; } elseif (is_callable(array($anchor, 'get_bullet_url'))) { $icon = $anchor->get_bullet_url(); } if ($icon) { $icon = '<a href="' . $context['url_to_root'] . $url . '"><img src="' . $icon . '" class="right_image" alt="' . encode_field(i18n::s('View the page')) . '" title="' . encode_field(i18n::s('View the page')) . '" /></a>'; } // signal restricted and private articles if ($item['active'] == 'N') { $prefix .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $prefix .= RESTRICTED_FLAG; } // flag articles updated recently if ($item['create_date'] >= $context['fresh']) { $suffix .= ' ' . NEW_FLAG; } elseif ($item['edit_date'] >= $context['fresh']) { $suffix .= ' ' . UPDATED_FLAG; } // add details $details = array(); // the author if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { if ($item['edit_name'] == $item['create_name']) { $details[] = sprintf(i18n::s('by %s'), ucfirst($item['create_name'])); } else { $details[] = sprintf(i18n::s('by %s, %s'), ucfirst($item['create_name']), ucfirst($item['edit_name'])); } } // the publish date $details[] = Skin::build_date($item['publish_date']); // rating $rating_label = ''; if ($item['rating_count']) { $rating_label = Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])) . ' ' . sprintf(i18n::ns('%d rating', '%d ratings', $item['rating_count']), $item['rating_count']) . ' '; } // add a link to let surfer rate this item if (is_object($anchor) && !$anchor->has_option('without_rating')) { if (!$item['rating_count']) { $rating_label .= i18n::s('Rate this page'); } $rating_label = Skin::build_link(Articles::get_url($item['id'], 'like'), $rating_label, 'basic', i18n::s('Rate this page')); } // display current rating, and allow for rating $details[] = $rating_label; // details if (count($details)) { $content .= '<p class="details">' . ucfirst(implode(', ', $details)) . '</p>'; } // the full introductory text if ($item['introduction']) { $content .= Codes::beautify($item['introduction'], $item['options']); } elseif (!is_object($overlay)) { include_once $context['path_to_root'] . 'articles/article.php'; $article = new Article(); $article->load_by_content($item); $content .= $article->get_teaser('teaser'); } // insert overlay data, if any if (is_object($overlay)) { $content .= $overlay->get_text('list', $item); } // an array of links $menu = array(); // rate the article $menu = array_merge($menu, array(Articles::get_url($item['id'], 'like') => i18n::s('Rate this page'))); // read the article $menu = array_merge($menu, array($url => i18n::s('Read more'))); // info on related files if ($count = Files::count_for_anchor('article:' . $item['id'], TRUE)) { $details[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d file', '%d files', $count), $count), 'basic'); } // info on related comments if ($count = Comments::count_for_anchor('article:' . $item['id'], TRUE)) { $link = Comments::get_url('article:' . $item['id'], 'list'); $menu = array_merge($menu, array($link => sprintf(i18n::ns('%d comment', '%d comments', $count), $count))); } // discuss if (Comments::allow_creation($item, $anchor)) { $menu = array_merge($menu, array(Comments::get_url('article:' . $item['id'], 'comment') => i18n::s('Discuss'))); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { $menu = array_merge($menu, array($url . '#_attachments' => sprintf(i18n::ns('%d link', '%d links', $count), $count))); } // trackback if (Links::allow_trackback()) { $menu = array_merge($menu, array('links/trackback.php?anchor=' . urlencode('article:' . $item['id']) => i18n::s('Reference this page'))); } // link to the anchor page if (is_object($anchor)) { $menu = array_merge($menu, array($anchor->get_url() => $anchor->get_title())); } // list up to three categories by title, if any if ($items = Members::list_categories_by_title_for_member('article:' . $item['id'], 0, 3, 'raw')) { foreach ($items as $id => $attributes) { $menu = array_merge($menu, array(Categories::get_permalink($attributes) => $attributes['title'])); } } // append a menu $content .= Skin::build_list($menu, 'menu_bar'); // insert a complete box $text .= Skin::build_box($icon . $prefix . Codes::beautify_title($item['title']) . $suffix, $content, 'header1', 'article_' . $item['id']); // section closing if ($item_count == 1) { $text .= '</div>' . "\n"; } } // end of processing SQL::free($result); // add links to archives $anchor = Categories::get(i18n::c('monthly')); if (isset($anchor['id']) && ($items = Categories::list_by_date_for_anchor('category:' . $anchor['id'], 0, COMPACT_LIST_SIZE, 'compact'))) { $text .= Skin::build_box(i18n::s('Previous pages'), Skin::build_list($items, 'menu_bar')); } return $text; }
// the command to create a new poll, if no overlay nor template has been defined for content of this section if ((!isset($item['content_overlay']) || !trim($item['content_overlay'])) && (!isset($item['articles_templates']) || !trim($item['articles_templates'])) && (!is_object($anchor) || !$anchor->get_templates_for('article'))) { Skin::define_img('ARTICLES_POLL_IMG', 'articles/poll.gif'); $url = 'articles/edit.php?anchor=' . urlencode('section:' . $item['id']) . '&variant=poll'; $context['page_tools'][] = Skin::build_link($url, ARTICLES_POLL_IMG . i18n::s('Add a poll'), 'basic', i18n::s('Add new content to this section')); } } // add a section if (Sections::allow_creation($item, $anchor)) { Skin::define_img('SECTIONS_ADD_IMG', 'sections/add.gif'); $context['page_tools'][] = Skin::build_link('sections/edit.php?anchor=' . urlencode('section:' . $item['id']), SECTIONS_ADD_IMG . i18n::s('Add a section'), 'basic', i18n::s('Add a section')); } // comment this page if anchor does not prevent it if (Comments::allow_creation($item, $anchor, 'section')) { Skin::define_img('COMMENTS_ADD_IMG', 'comments/add.gif'); $context['page_tools'][] = Skin::build_link(Comments::get_url('section:' . $item['id'], 'comment'), COMMENTS_ADD_IMG . i18n::s('Post a comment'), 'basic', i18n::s('Express yourself, and say what you think.')); } // add a file, if upload is allowed if (Files::allow_creation($item, $anchor, 'section')) { Skin::define_img('FILES_UPLOAD_IMG', 'files/upload.gif'); $context['page_tools'][] = Skin::build_link('files/edit.php?anchor=' . urlencode('section:' . $item['id']), FILES_UPLOAD_IMG . i18n::s('Add a file'), 'basic', i18n::s('Attach related files.')); } // add a link if (Links::allow_creation($item, $anchor, 'section')) { Skin::define_img('LINKS_ADD_IMG', 'links/add.gif'); $context['page_tools'][] = Skin::build_link('links/edit.php?anchor=' . urlencode('section:' . $item['id']), LINKS_ADD_IMG . i18n::s('Add a link'), 'basic', i18n::s('Contribute to the web and link to relevant pages.')); } // post an image, if upload is allowed if (Images::allow_creation($item, $anchor, 'section')) { Skin::define_img('IMAGES_ADD_IMG', 'images/add.gif'); $context['page_tools'][] = Skin::build_link('images/edit.php?anchor=' . urlencode('section:' . $item['id']), IMAGES_ADD_IMG . i18n::s('Add an image'), 'basic', i18n::s('You can upload a camera shot, a drawing, or another image file.'));
/** * list comments as successive notes in a thread * * @param resource the SQL result * @return string the rendered text **/ function layout($result) { global $context; // we return some text $output = ''; // empty list if (!SQL::count($result)) { return $output; } // build a list of comments $rows = array(); include_once $context['path_to_root'] . 'comments/comments.php'; while ($item = SQL::fetch($result)) { // get the anchor $anchor = Anchors::get($item['anchor']); // get poster information $poster = array(); if ($item['create_name']) { if (!($poster = Users::get($item['create_id']))) { $poster['id'] = 0; $poster['full_name'] = $item['create_name']; $poster['email'] = $item['create_address']; } } else { if (!($poster = Users::get($item['edit_id']))) { $poster['id'] = 0; $poster['full_name'] = $item['edit_name']; $poster['email'] = $item['edit_address']; } } // author description $author = ''; // avatar, but not for notifications if ($item['type'] != 'notification' && isset($poster['avatar_url']) && $poster['avatar_url']) { $author .= '<img src="' . $poster['avatar_url'] . '" alt="" title="avatar" class="avatar" />' . BR; } // link to poster, if possible if (isset($poster['id'])) { $author .= Users::get_link($poster['full_name'], $poster['email'], $poster['id']); } // commands to handle this comment $menu = array(); // get an icon for this comment $icon = Comments::get_img($item['type']); // link to comment permalink $label = Skin::build_link(Comments::get_url($item['id']), $icon, 'basic', i18n::s('View this comment')) . ' '; // the creation date if ($item['create_date']) { $label .= Skin::build_date($item['create_date'], 'with_hour'); } else { $label .= Skin::build_date($item['edit_date'], 'with_hour'); } // flag new comments if ($item['create_date'] >= $context['fresh']) { $label .= NEW_FLAG; } $menu[] = $label; // an approval -- can be modified, but not deleted if ($item['type'] == 'approval') { // additional commands for associates and poster and editor if ($anchor->is_owned()) { Skin::define_img('COMMENTS_EDIT_IMG', 'comments/edit.gif'); $menu[] = Skin::build_link(Comments::get_url($item['id'], 'edit'), COMMENTS_EDIT_IMG . i18n::s('Edit'), 'basic'); } // an automatic notification -- can be deleted, but not modified } elseif ($item['type'] == 'notification') { // additional commands for associates and poster and editor if ($anchor->is_owned()) { Skin::define_img('COMMENTS_DELETE_IMG', 'comments/delete.gif'); $menu[] = Skin::build_link(Comments::get_url($item['id'], 'delete'), COMMENTS_DELETE_IMG . i18n::s('Delete'), 'basic'); } // regular case } else { // additional commands for associates and poster and editor if (Comments::allow_modification($anchor, $item)) { Skin::define_img('COMMENTS_EDIT_IMG', 'comments/edit.gif'); $menu[] = Skin::build_link(Comments::get_url($item['id'], 'edit'), COMMENTS_EDIT_IMG . i18n::s('Edit'), 'basic'); Skin::define_img('COMMENTS_DELETE_IMG', 'comments/delete.gif'); $menu[] = Skin::build_link(Comments::get_url($item['id'], 'delete'), COMMENTS_DELETE_IMG . i18n::s('Delete'), 'basic'); } } // comment main text $text = ''; // state clearly that this is an approval if ($item['type'] == 'approval' && isset($poster['id'])) { $text .= '<p>' . sprintf(i18n::s('%s has provided his approval'), Users::get_link($poster['full_name'], $poster['email'], $poster['id'])) . '</p>'; } // display comment main text $text .= $item['description']; // display signature, but not for notifications if ($item['type'] != 'notification') { $text .= Users::get_signature($item['create_id']); } // format and display $text = ucfirst(trim($text)); // float the menu on the right if (count($menu)) { $text = '<div style="text-align: right">' . Skin::finalize_list($menu, 'menu') . '</div>' . $text; } // comment has been modified if ($item['create_name'] && $item['edit_name'] != $item['create_name']) { $text .= '<p class="details">' . ucfirst(sprintf(i18n::s('edited by %s %s'), $item['edit_name'], Skin::build_date($item['edit_date']))) . '</p>'; } // potential replies to this comment if ($item['type'] != 'notification') { // look for replies if ($replies = Comments::list_next($item['id'], 'replies')) { if (is_array($replies)) { $replies = Skin::build_list($replies, 'compact'); } $text .= '<div>' . $replies . '</div>'; } // allow to reply to this comment if (Comments::allow_creation($anchor)) { // the form to edit a comment $text .= '<form method="post" action="' . $context['url_to_root'] . Comments::get_url($item['id'], 'reply') . '" onsubmit="return validateDocumentPost(this)" enctype="multipart/form-data"><div style="margin-top: 1em;">'; // reference the anchor page $text .= '<input type="hidden" name="anchor" value="' . $item['anchor'] . '" />'; // remember the id of the replied comment $text .= '<input type="hidden" name="previous_id" value="' . $item['id'] . '" />'; // notify watchers $text .= '<input type="hidden" name="notify_watchers" value="Y" />'; // ensure id uniqueness static $fuse_id; if (!isset($fuse_id)) { $fuse_id = 1; } else { $fuse_id++; } // a textarea that grow on focus Page::insert_script('var reply' . $fuse_id . '=1;'); $text .= '<textarea name="description" id="reply' . $fuse_id . '"' . ' rows="1" cols="50"' . ' onfocus="if(reply' . $fuse_id . '){$(\'div#submit' . $fuse_id . '\').slideDown(600);reply' . $fuse_id . '=0;}">' . '</textarea>' . "\n"; // fix number of rows in firefox Page::insert_script('$(function(){' . '$("textarea#reply' . $fuse_id . '")' . '.each(function(){' . 'var lineHeight = parseFloat($(this).css("line-height"));' . 'var lines = $(this).attr("rows")*1 || $(this).prop("rows")*1;' . '$(this).css("height", lines*lineHeight);' . '})' . '.autogrow();' . '});' . "\n"); // the submit button $text .= '<div class="menu_bar" style="display: none;" id="submit' . $fuse_id . '">' . Skin::build_submit_button(i18n::s('Submit'), i18n::s('Press [s] to submit data'), 's') . '</div>'; // end of the form $text .= '</div></form>'; } } // the main part of the comment, with an id $text = '<td class="comment ' . $item['type'] . '" id="comment_' . $item['id'] . '">' . $text . '</td>'; // this is another row of the output $rows[] = '<td class="author ' . $item['type'] . '">' . $author . '</td>' . $text; } // end of processing SQL::free($result); // sanity check if (!count($rows)) { return ''; } // return a table $output = Skin::table_prefix('yabb'); $count = 1; foreach ($rows as $row) { if ($count % 2) { $output .= '<tr class="odd">' . $row . '</tr>'; } else { $output .= '<tr class="even">' . $row . '</tr>'; } $count++; } $output .= '</table>'; // process yacs codes $output = Codes::beautify($output); return $output; }
/** * text to come after page description * * @param array the hosting record, if any * @return some HTML to be inserted into the resulting page */ function &get_trailer_text($host = NULL) { global $context; // the text $text = ''; // actually, a menu of commands $menu = array(); // no end date if (!isset($this->attributes['end_date']) || $this->attributes['end_date'] <= NULL_DATE) { $open = TRUE; } elseif ($this->attributes['end_date'] > gmstrftime('%Y-%m-%d %H:%M:%S')) { $open = TRUE; } else { $open = FALSE; } // different for each surfer Cache::poison(); // link to vote if ($open && Surfer::get_id() && Surfer::get_id() && !Comments::count_approvals_for_anchor($this->anchor->get_reference(), Surfer::get_id())) { $menu[] = Skin::build_link(Comments::get_url($this->anchor->get_reference(), 'approve'), i18n::s('Sign this petition'), 'shortcut'); } $text = Skin::finalize_list($menu, 'menu_bar'); return $text; }
/** * layout one of the newest articles * * @param array the article * @return string the rendered text */ function layout_newest($item) { global $context; // permalink $url = Articles::get_permalink($item); // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // the icon to put aside $icon = ''; if ($item['thumbnail_url']) { $icon = $item['thumbnail_url']; } elseif (is_callable(array($anchor, 'get_bullet_url'))) { $icon = $anchor->get_bullet_url(); } if ($icon) { $icon = '<img src="' . $icon . '" class="left_image" alt="" />'; } // use the title to label the link if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // rating if ($item['rating_count'] && !(is_object($anchor) && $anchor->has_option('without_rating'))) { $title .= ' ' . Skin::build_link(Articles::get_url($item['id'], 'like'), Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])), 'basic'); } // pack in a block $text = '<h3>' . Skin::build_link($url, $icon . $title, 'basic') . '</h3>'; // the introduction $text .= '<p style="margin-top: 0;">'; // signal restricted and private articles if ($item['active'] == 'N') { $text .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $text .= RESTRICTED_FLAG; } // the author $author = ''; if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { $author = sprintf(i18n::s('by %s'), $item['create_name']) . ' '; } // date $text .= '<span class="details">' . $author . Skin::build_date($item['publish_date']) . '</span>'; // the introductory text if ($item['introduction']) { $text .= ' - ' . Codes::beautify_introduction($item['introduction']); } elseif (!is_object($overlay) && $item['description']) { $text .= ' - ' . Skin::cap(Codes::beautify($item['description'], $item['options']), 25, $url); } // end of the introduction $text .= '</p>' . "\n"; // insert overlay data, if any if (is_object($overlay)) { $text .= $overlay->get_text('list', $item); } // read this article $text .= '<p class="details right">' . Skin::build_link($url, i18n::s('View the page'), 'basic'); // discuss if (Comments::allow_creation($item, $anchor)) { $text .= BR . Skin::build_link(Comments::get_url('article:' . $item['id'], 'comment'), i18n::s('Discuss'), 'basic'); } // info on related comments if ($count = Comments::count_for_anchor('article:' . $item['id'], TRUE)) { $link = Comments::get_url('article:' . $item['id'], 'list'); $text .= ' - ' . Skin::build_link($link, sprintf(i18n::ns('%d comment', '%d comments', $count), $count), 'basic'); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { $text .= ' - ' . Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d link', '%d links', $count), $count), 'basic'); } // end of details $text .= '</p>'; return $text; }
if (!($result = SQL::query($query))) { return; } else { // fetch one anchor and the linked member $errors_count = 0; while ($row = SQL::fetch($result)) { // animate user screen and take care of time $count++; if (!($count % 500)) { $context['text'] .= sprintf(i18n::s('%d records have been processed'), $count) . BR . "\n"; // ensure enough execution time Safe::set_time_limit(30); } // check that the anchor exists, if any if ($row['anchor'] && !Anchors::get($row['anchor'])) { $context['text'] .= sprintf(i18n::s('Orphan: %s'), 'comment ' . Skin::build_link(Comments::get_url($row['id']), $row['id'])) . BR . "\n"; if (++$errors_count >= 5) { $context['text'] .= i18n::s('Too many successive errors. Aborted') . BR . "\n"; break; } } else { $errors_count = 0; } } } // ending message $context['text'] .= sprintf(i18n::s('%d records have been processed'), $count) . BR . "\n"; // display the execution time $time = round(get_micro_time() - $context['start_time'], 2); $context['text'] .= '<p>' . sprintf(i18n::s('Script terminated in %.2f seconds.'), $time) . '</p>'; // forward to the index page
/** * list articles * * @param resource the SQL result * @return a string to be displayed * * @see layouts/layout.php **/ function layout($result) { global $context; // we return some text $text = ''; // empty list if (!SQL::count($result)) { return $text; } // no hovering label $href_title = ''; // we build an array for the skin::build_tabs() function $panels = array(); // process all items in the list while ($item = SQL::fetch($result)) { // get the main anchor $anchor = Anchors::get($item['anchor']); // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // panel content $text = ''; // insert anchor prefix if (is_object($anchor)) { $text .= $anchor->get_prefix(); } // the introduction text, if any if (is_object($overlay)) { $text .= Skin::build_block($overlay->get_text('introduction', $item), 'introduction'); } elseif (isset($item['introduction']) && trim($item['introduction'])) { $text .= Skin::build_block($item['introduction'], 'introduction'); } // get text related to the overlay, if any if (is_object($overlay)) { $text .= $overlay->get_text('view', $item); } // filter description, if necessary if (is_object($overlay)) { $description = $overlay->get_text('description', $item); } else { $description = $item['description']; } // the beautified description, which is the actual page body if ($description) { // use adequate label if (is_object($overlay) && ($label = $overlay->get_label('description'))) { $text .= Skin::build_block($label, 'title'); } // beautify the target page $text .= Skin::build_block($description, 'description', '', $item['options']); } // list files only to people able to change the page if (Articles::allow_modification($item, $anchor)) { $embedded = NULL; } else { $embedded = Codes::list_embedded($item['description']); } // build a complete box $box = array('bar' => array(), 'text' => ''); // count the number of files in this article if ($count = Files::count_for_anchor('article:' . $item['id'], FALSE, $embedded)) { if ($count > 20) { $box['bar'] += array('_count' => sprintf(i18n::ns('%d file', '%d files', $count), $count)); } // list files by date (default) or by title (option files_by_title) $offset = ($zoom_index - 1) * FILES_PER_PAGE; if (Articles::has_option('files_by', $anchor, $item) == 'title') { $items = Files::list_by_title_for_anchor('article:' . $item['id'], 0, 300, 'article:' . $item['id'], $embedded); } else { $items = Files::list_by_date_for_anchor('article:' . $item['id'], 0, 300, 'article:' . $item['id'], $embedded); } // actually render the html if (is_array($items)) { $box['text'] .= Skin::build_list($items, 'decorated'); } elseif (is_string($items)) { $box['text'] .= $items; } // the command to post a new file if (Files::allow_creation($item, $anchor, 'article')) { Skin::define_img('FILES_UPLOAD_IMG', 'files/upload.gif'); $box['bar'] += array('files/edit.php?anchor=' . urlencode('article:' . $item['id']) => FILES_UPLOAD_IMG . i18n::s('Add a file')); } } // some files have been attached to this page if ($page == 1 && $count > 1) { // the command to download all files $link = 'files/fetch_all.php?anchor=' . urlencode('article:' . $item['id']); if ($count > 20) { $label = i18n::s('Zip 20 first files'); } else { $label = i18n::s('Zip all files'); } $box['bar'] += array($link => $label); } // there is some box content if ($box['text']) { $text .= Skin::build_content('files', i18n::s('Files'), $box['text'], $box['bar']); } // list of comments $title_label = ''; if (is_object($anchor)) { $title_label = ucfirst($overlay->get_label('list_title', 'comments')); } if (!$title_label) { $title_label = i18n::s('Comments'); } // no layout yet $layout = NULL; // label to create a comment $add_label = ''; if (is_object($overlay)) { $add_label = $overlay->get_label('new_command', 'comments'); } if (!$add_label) { $add_label = i18n::s('Post a comment'); } // get a layout from anchor $layout =& Comments::get_layout($anchor, $item); // provide author information to layout if (is_object($layout) && isset($item['create_id']) && $item['create_id']) { $layout->set_focus('user:'******'create_id']); } // the maximum number of comments per page if (is_object($layout)) { $items_per_page = $layout->items_per_page(); } else { $items_per_page = COMMENTS_PER_PAGE; } // the first comment to list $offset = 0; if (is_object($layout) && method_exists($layout, 'set_offset')) { $layout->set_offset($offset); } // build a complete box $box = array('bar' => array(), 'prefix_bar' => array(), 'text' => ''); // feed the wall if (Comments::allow_creation($item, $anchor)) { $box['text'] .= Comments::get_form('article:' . $item['id']); } // a navigation bar for these comments if ($count = Comments::count_for_anchor('article:' . $item['id'])) { if ($count > 20) { $box['bar'] += array('_count' => sprintf(i18n::ns('%d comment', '%d comments', $count), $count)); } // list comments by date $items = Comments::list_by_date_for_anchor('article:' . $item['id'], $offset, $items_per_page, $layout, TRUE); // actually render the html if (is_array($items)) { $box['text'] .= Skin::build_list($items, 'rows'); } elseif (is_string($items)) { $box['text'] .= $items; } // navigation commands for comments $prefix = Comments::get_url('article:' . $item['id'], 'navigate'); $box['bar'] = array_merge($box['bar'], Skin::navigate(NULL, $prefix, $count, $items_per_page, $zoom_index)); } // ensure that the surfer can change content if (Articles::allow_modification($item, $anchor)) { // view or modify this section $menu = array(); $box['bar'] += array(Articles::get_permalink($item) => i18n::s('View the page')); if (!is_object($overlay) || !($label = $overlay->get_label('edit_command', 'articles'))) { $label = i18n::s('Edit this page'); } $box['bar'] += array(Articles::get_url($item['id'], 'edit') => $label); } // show commands if (count($box['bar'])) { // commands before the box $box['text'] = Skin::build_list($box['prefix_bar'], 'menu_bar') . $box['text']; // append the menu bar at the end $box['text'] .= Skin::build_list($box['bar'], 'menu_bar'); } // build a box if ($box['text']) { // put a title if there are other titles or if more than 2048 chars $title = ''; if (preg_match('/(<h1|<h2|<h3|<table|\\[title|\\[subtitle)/i', $context['text'] . $text) || strlen($context['text'] . $text) > 2048) { $title = $title_label; } // insert a full box $text .= Skin::build_box($title, $box['text'], 'header1', 'comments'); } // assemble the full panel $panels[] = array('att' . $item['id'], ucfirst(Skin::strip($item['title'], 30)), 'atc' . $item['id'], $text); } // there is some box content if (trim($box['text'])) { $text .= $box['text']; } // format tabs $text = Skin::build_tabs($panels); // end of processing SQL::free($result); return $text; }
/** * layout one recent article * * @param array the article * @return an array ($prefix, $label, $suffix) **/ function layout_recent($item) { global $context; // permalink $url = Articles::get_permalink($item); // get the related overlay, if any $overlay = Overlay::load($item, 'article:' . $item['id']); // get the anchor $anchor = Anchors::get($item['anchor']); // use the title to label the link if (is_object($overlay)) { $title = Codes::beautify_title($overlay->get_text('title', $item)); } else { $title = Codes::beautify_title($item['title']); } // reset everything $prefix = $suffix = ''; // signal restricted and private articles if ($item['active'] == 'N') { $prefix .= PRIVATE_FLAG; } elseif ($item['active'] == 'R') { $prefix .= RESTRICTED_FLAG; } // rating if ($item['rating_count']) { $suffix .= Skin::build_link(Articles::get_url($item['id'], 'like'), Skin::build_rating_img((int) round($item['rating_sum'] / $item['rating_count'])), 'basic'); } // the introductory text $introduction = ''; if (is_object($overlay)) { $introduction = $overlay->get_text('introduction', $item); } elseif ($item['introduction']) { $introduction = $item['introduction']; } if ($introduction) { $suffix .= ' - ' . Codes::beautify_introduction($introduction); } // other details $details = array(); // the author $author = ''; if (isset($context['with_author_information']) && $context['with_author_information'] == 'Y') { $author = sprintf(i18n::s('by %s'), $item['create_name']) . ' '; } // date $details[] = $author . Skin::build_date($item['publish_date']); // info on related files if ($count = Files::count_for_anchor('article:' . $item['id'], TRUE)) { $details[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d file', '%d files', $count), $count), 'basic'); } // info on related comments $link = Comments::get_url('article:' . $item['id'], 'list'); if ($count = Comments::count_for_anchor('article:' . $item['id'], TRUE)) { $details[] = Skin::build_link($link, sprintf(i18n::ns('%d comment', '%d comments', $count), $count), 'basic'); } // discuss if (Comments::allow_creation($item, $anchor)) { $details[] = Skin::build_link(Comments::get_url('article:' . $item['id'], 'comment'), i18n::s('Discuss'), 'basic'); } // info on related links if ($count = Links::count_for_anchor('article:' . $item['id'], TRUE)) { $details[] = Skin::build_link($url . '#_attachments', sprintf(i18n::ns('%d link', '%d links', $count), $count), 'basic'); } // append a menu $suffix .= Skin::finalize_list($details, 'menu'); // display all tags if ($item['tags']) { $suffix .= ' <p class="tags" style="margin-top: 3px;">' . Skin::build_tags($item['tags'], 'article:' . $item['id']) . '</p>'; } // insert an array of links return array($prefix, $title, $suffix); }
/** * get id of previous comment * * This function is used to build navigation bars. * * @param array the current item * @param string the anchor of the current item * @param string the order, either 'date' or 'reverse' * @return some text * * @see articles/article.php * @see users/user.php */ public static function get_previous_url($item, $anchor, $order = 'date') { global $context; // sanity check if (!is_array($item)) { return $item; } // depending on selected sequence if ($order == 'date') { $match = "comments.create_date < '" . SQL::escape($item['create_date']) . "'"; $order = 'comments.create_date DESC'; } elseif ($order == 'reverse') { $match = "comments.create_date > '" . SQL::escape($item['create_date']) . "'"; $order = 'comments.create_date'; } else { return "unknown order '" . $order . "'"; } // query the database $query = "SELECT id FROM " . SQL::table_name('comments') . " AS comments " . " WHERE (comments.anchor LIKE '" . SQL::escape($anchor) . "') AND (" . $match . ")" . " ORDER BY " . $order . " LIMIT 0, 1"; if (!($previous = SQL::query_first($query))) { return NULL; } // return url of the first item of the list return Comments::get_url($previous['id']); }