Пример #1
0
    // see also
    $lines = array();
    $lines[] = Skin::build_link('categories/', i18n::s('Categories'));
    $lines[] = Skin::build_link('search.php', i18n::s('Search'));
    $lines[] = Skin::build_link('help/', i18n::s('Help index'));
    $lines[] = Skin::build_link('query.php', i18n::s('Contact'));
    $text .= Skin::build_box(i18n::s('See also'), Skin::finalize_list($lines, 'compact'), 'boxes');
    // list monthly publications in an extra box
    $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($anchor['title'], Skin::build_list($items, 'compact'), 'boxes') . "\n";
    }
    // side boxes for related categories, if any
    if ($categories = Categories::list_by_date_for_display('section:index', 0, 7, 'raw')) {
        foreach ($categories as $id => $attributes) {
            // link to the category page from the box title
            $label =& Skin::build_box_title(Skin::strip($attributes['title']), Categories::get_permalink($attributes), i18n::s('View the category'));
            // box content
            if ($items =& Members::list_articles_by_date_for_anchor('category:' . $id, 0, COMPACT_LIST_SIZE, 'compact')) {
                $text .= Skin::build_box($label, Skin::build_list($items, 'compact'), 'boxes') . "\n";
            }
        }
    }
    // save, whatever change, for 5 minutes
    Cache::put($cache_id, $text, 'stable', 300);
}
$context['components']['boxes'] = $text;
// referrals, if any
$context['components']['referrals'] = Skin::build_referrals('sections/index.php');
// render the skin
render_skin();
Пример #2
0
    }
}
// save some database requests
$cache_id = 'index.php#extra_news';
if (!($text = Cache::get($cache_id))) {
    // show featured articles -- set in configure.php
    if (isset($context['root_featured_layout']) && $context['root_featured_layout'] != 'none') {
        // set in configure.php
        if (!isset($context['root_featured_count']) || $context['root_featured_count'] < 1) {
            $context['root_featured_count'] = 7;
        }
        // the category used to assign featured pages
        $anchor = Categories::get(i18n::c('featured'));
        if ($anchor['id'] && ($items =& Members::list_articles_by_date_for_anchor('category:' . $anchor['id'], 0, $context['root_featured_count'] + 1, 'news'))) {
            // link to the category page from the box title
            $title =& Skin::build_box_title($anchor['title'], Categories::get_permalink($anchor), i18n::s('Featured pages'));
            // limit to seven links only
            if (@count($items) > $context['root_featured_count']) {
                @array_splice($items, $context['root_featured_count']);
                // link to the category page
                $url = Categories::get_permalink($anchor);
                $items[$url] = i18n::s('Featured pages') . MORE_IMG;
            }
            // render html
            if (is_array($items)) {
                $items =& Skin::build_list($items, 'news');
            }
            // we do have something to display
            if ($items) {
                // animate the text if required to do so
                if ($context['root_featured_layout'] == 'scroll') {
Пример #3
0
 /**
  * build a box
  *
  * Accept following variants:
  * - 'extra' for a flashy box on page side
  * - 'floating' for a box floated to the left
  * - 'folded' for a folded box with content
  * - 'gadget' for additional content in the main part of the page
  * - 'header1' with a level 1 title
  * - 'header1 even'
  * - 'header1 odd'
  * - 'header2' with a level 2 title
  * - 'header3' with a level 3 title
  * - 'navigation' for additional navigational information on page side
  * - 'sidebar' for some extra information in the main part of the page
  * - 'sidecolumn' for some extra information in the main part of the page
  * - 'sliding' for sliding content
  * - 'toc' for a table of content
  * - 'toq' for a table of questions
  * - 'unfolded' for a folded box with content
  *
  * @param string the box title, if any
  * @param string the box content
  * @param string the box variant, if any
  * @param string a unique object id, if any
  * @param string a link to add to the title, if any
  * @param string the popup to display while hovering the link, if any
  * @return the HTML to display
  *
  */
 public static function &build_box($title, $content, $variant = 'header1', $id = '', $url = '', $popup = '')
 {
     global $context;
     $content = Codes::fix_tags($content);
     // accept line breaks in box titles
     $title = str_replace("\n", BR, $title);
     // append a link to the title, if any
     if ($url) {
         $title =& Skin::build_box_title($title, $url, $popup);
     }
     // depending on variant
     switch ($variant) {
         case 'extra':
             $output =& Skin::build_extra_box($title, $content, $id);
             break;
         case 'floating':
             $output =& Skin::build_floating_box($title, $content, $id);
             break;
         case 'folded':
         case 'folder':
             // obsoleted
             $output =& Skin::build_folded_box($title, $content, $id);
             break;
         case 'gadget':
             $output =& Skin::build_gadget_box($title, $content, $id);
             break;
         case 'header1':
         case 'header1 even':
         case 'header1 odd':
         case 'header2':
         case 'header3':
             $output =& Skin::build_header_box($title, $content, $id, $variant);
             break;
         case 'navigation':
             $output =& Skin::build_navigation_box($title, $content, $id);
             break;
         case 'section':
             // legacy
             $output =& Skin::build_header_box($title, $content, $id);
             break;
         case 'sidebar':
             $output =& Skin::build_sidebar_box($title, $content, $id);
             break;
         case 'sidecolumn':
             $output =& Skin::build_sidecolumn_box($title, $content, $id);
             break;
         case 'sliding':
             $output =& Skin::build_sliding_box($title, $content, $id);
             break;
         case 'toc':
             $output =& Skin::build_toc_box($title, $content, $id);
             break;
         case 'toq':
             $output =& Skin::build_toq_box($title, $content, $id);
             break;
         case 'unfolded':
             $output =& Skin::build_unfolded_box($title, $content, $id);
             break;
         default:
             // displayed in the navigation panel
             if (isset($context['skins_navigation_components']) && strpos($context['skins_navigation_components'], $variant) !== FALSE) {
                 $output =& Skin::build_navigation_box($title, $content, $id);
             } elseif (isset($context['skins_extra_components']) && strpos($context['skins_extra_components'], $variant) !== FALSE) {
                 $output =& Skin::build_extra_box($title, $content, $id);
             } else {
                 $output =& Skin::build_header_box($title, $content, $id, $variant);
             }
             break;
     }
     // job done
     return $output;
 }
 /**
  * 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;
 }
Пример #5
0
 /**
  * list articles
  *
  * @param resource the SQL result
  * @return array( $title => $content )
  *
  * @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';
     while ($item = SQL::fetch($result)) {
         // get the related overlay, if any
         $overlay = Overlay::load($item, 'article:' . $item['id']);
         // get the main 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']);
         }
         // shortcut for associates
         if (Surfer::is_associate()) {
             $title =& Skin::build_box_title($title, $url, i18n::s('View the page'));
         }
         // title prefix
         $prefix = '';
         // flag articles that are dead, or created or updated very recently
         if ($item['expiry_date'] > NULL_DATE && $item['expiry_date'] <= $context['now']) {
             $prefix .= EXPIRED_FLAG;
         }
         // signal articles to be published
         if ($item['publish_date'] <= NULL_DATE || $item['publish_date'] > $context['now']) {
             $prefix .= DRAFT_FLAG;
         }
         // prefix the title
         $title = $prefix . $title;
         // what has to be displayed in this box
         $parts = array();
         // if the page is publicly available, show introduction and link to full content
         $article = new Article();
         $article->load_by_content($item, Anchors::get($item['anchor']));
         if ($article->is_public()) {
             // get introduction from overlay, if any
             if (is_object($overlay)) {
                 $parts[] = Codes::beautify_introduction($overlay->get_text('introduction', $item));
                 // add a link to the main page
                 $parts[] = Skin::build_link($url, i18n::s('More') . MORE_IMG, 'basic', i18n::s('View the page'));
                 // use the introduction, if any
             } elseif ($item['introduction']) {
                 // the content of this box
                 $parts[] = Codes::beautify_introduction($item['introduction']);
                 // add a link to the main page
                 $parts[] = Skin::build_link($url, i18n::s('More') . MORE_IMG, 'basic', i18n::s('View the page'));
                 // no introduction, display article full content
             } else {
                 // insert overlay data, if any
                 if (is_object($overlay)) {
                     $parts[] = $overlay->get_text('box', $item);
                 }
                 // the content of this box
                 $parts[] = Codes::beautify($item['description'], $item['options']);
             }
             // else display full box content
         } else {
             // use the introduction, if any
             if ($item['introduction']) {
                 $parts[] = Codes::beautify_introduction($item['introduction']);
             }
             // get the related overlay, if any
             $overlay = Overlay::load($item, 'article:' . $item['id']);
             // insert overlay data, if any
             if (is_object($overlay)) {
                 $parts[] = $overlay->get_text('box', $item);
             }
             // the content of this box
             if ($item['description']) {
                 $parts[] = Codes::beautify($item['description'], $item['options']);
             }
         }
         // use nick name as box id
         $id = '';
         if (isset($item['nick_name'])) {
             $id = trim($item['nick_name']);
         }
         // append to the list
         $items[$title] = array('content' => implode(BR, $parts), 'id' => $id);
     }
     // end of processing
     SQL::free($result);
     return $items;
 }