'. $output .'

' : ''; } } /** * Implementation of hook_perm(). */ function site_map_perm() { return array('access site map'); } /** * Implementation of hook_theme(). */ function site_map_theme() { return array( 'site_map_display' => array( 'arguments' => array(), ), 'site_map_box' => array( 'arguments' => array('title' => NULL, 'content' => NULL, 'class' => ''), ), 'site_map_feed_icon' => array( 'arguments' => array('url' => NULL, 'type' => 'node'), ), ); } /** * Implementation of hook_menu(). */ function site_map_menu() { $items['admin/settings/sitemap'] = array( 'title' => 'Site map', 'description' => 'Control what should be displayed on the site map.', 'page callback' => 'drupal_get_form', 'page arguments' => array('site_map_admin_settings'), 'access arguments' => array('administer site configuration'), 'file' => 'site_map.admin.inc', 'type' => MENU_NORMAL_ITEM, ); $items['sitemap'] = array( 'title' => 'Site map', 'description' => 'Display a site map with RSS feeds.', 'page callback' => 'site_map_page', 'access arguments' => array('access site map'), 'type' => MENU_SUGGESTED_ITEM, ); return $items; } /** * Implementation of hook_block(). */ function site_map_block($op = 'list', $delta = 0) { if ($op == 'list') { $blocks[0]['info'] = t('Syndicate (site map)'); return $blocks; } else if ($op == 'view') { if (user_access('access content')) { $block['subject'] = t('Syndicate'); if (arg(0) == 'blog') { $uid = arg(1); $feedurl = is_numeric($uid) ? "blog/$uid/feed" : 'blog/feed'; } else { $feedurl = variable_get('site_map_rss_front', 'rss.xml'); } $block['content'] = theme('feed_icon', url($feedurl), t('Syndicate')); $block['content'] .= '\n"; return $block; } } } /** * Menu callback for the site map. */ function site_map_page() { if (variable_get('site_map_css', 0) != 1) { drupal_add_css(drupal_get_path('module', 'site_map') .'/site_map.css'); } return theme('site_map_display'); } /** * Return a themed site map. * * @return * A string containing the site map output. */ function theme_site_map_display() { $output = ''; if ((variable_get('site_map_show_rss_links', 1) != 0) && module_exists('commentrss') && variable_get('commentrss_site', COMMENTRSS_SITE_FRONT_PAGE)) { $output .= '

'. theme('site_map_feed_icon', NULL) .' '. t('Link to a content RSS feed'); $output .= '
'. theme('site_map_feed_icon', NULL, 'comment') .' '. t('Link to a comment RSS feed'); $output .= '

'; } if (variable_get('site_map_show_front', 1)) { $output .= _site_map_front_page(); } if (variable_get('site_map_show_blogs', 1)) { $output .= _site_map_blogs(); } /* $output .= _site_map_audio(); */ /* $output .= _site_map_video(); */ // Compile the books trees. $output .= _site_map_books(); // Compile the menu trees. $output .= _site_map_menus(); if (variable_get('site_map_show_faq', 1)) { $output .= _site_map_faq(); } // Compile the vocabulary trees. $output .= _site_map_taxonomys(); // Invoke all custom modules and get themed HTML to be integrated into the site map. $additional = module_invoke_all('site_map'); foreach ($additional as $themed_site_map_code) { $output .= $themed_site_map_code; } $output = '
'. $output .'
'; return $output; } /** * Return a themed sitemap box. * * @param $title * The subject of the box. * @param $content * The content of the box. * @param $class * Optional extra class for the box. * @return * A string containing the box output. */ function theme_site_map_box($title, $content, $class = '') { return '

'. $title .'

'. $content .'
'; } /** * Return a themed feed icon. * * @param $url * The feed URL. * @param $type * The type of feed icon. * @return * A string containing the linked image. */ function theme_site_map_feed_icon($url, $type = 'node') { $output = ''; switch ($type) { case 'node': $output = theme('image', (drupal_get_path('module', 'site_map') .'/feed-small.png'), t('Syndicate content'), t('Syndicate content')); break; case 'comment': $output = theme('image', (drupal_get_path('module', 'site_map') .'/feed-small-comment.png'), t('Syndicate comments'), t('Syndicate comments')); break; } if ($url) { $output = l($output, $url, array('attributes' => array('class' => 'feed-link'), 'html' => TRUE)); } return $output; } function _site_map_front_page() { $output = ''; $class = ''; $title = t('Front page'); $output = l(t("Front page of %sn", array("%sn" => variable_get('site_name', 'Drupal'))), '', array('html' => TRUE)); if (variable_get('site_map_show_rss_links', 1) != 0) { $rss_link = theme('site_map_feed_icon', variable_get('site_map_rss_front', 'rss.xml')); if (module_exists('commentrss') && variable_get('commentrss_site', COMMENTRSS_SITE_FRONT_PAGE)) { $rss_link .= ' '. theme('site_map_feed_icon', 'crss', 'comment'); } if (variable_get('site_map_show_rss_links', 1) == 1) { $output .= ' '. $rss_link; } else { $class = ' sitemap-rss-left'; $output = $rss_link .' '. $output; } } return theme('site_map_box', $title, $output, 'sitemap-front'. $class); } /** * Render the latest blog authors */ function _site_map_blogs() { $output = ''; $class = ''; if (module_exists('blog')) { $title = t('Blogs'); $output = '
'. t("Community blog and recent blog authors at %sn.", array("%sn" => variable_get('site_name', 'Drupal'))) .'
'; $blog_link = l(t('All blogs'), 'blog'); if (variable_get('site_map_show_rss_links', 1) != 0) { $rss_link = theme('site_map_feed_icon', 'blog/feed'); if (variable_get('site_map_show_rss_links', 1) == 1) { $blog_link .= ' '. $rss_link; } else { $class = ' sitemap-rss-left'; $blog_link = $rss_link .' '. $blog_link; } } $blogs = array(); $blogs[] = $blog_link; $sql = "SELECT DISTINCT u.uid, u.name, count(u.uid) AS numitems FROM {node} n INNER JOIN {users} u ON u.uid = n.uid WHERE n.type = 'blog' AND n.status = 1 GROUP BY u.uid, u.name ORDER BY numitems DESC, u.name"; $result = db_query_range($sql, 0, 10); while ($blog = db_fetch_object($result)) { $blog_item = l(t("!s's blog", array("!s" => $blog->name)), "blog/$blog->uid") .' ('. $blog->numitems .')'; if (variable_get('site_map_show_rss_links', 1) != 0) { $rss_link = theme('site_map_feed_icon', "blog/$blog->uid/feed"); if (variable_get('site_map_show_rss_links', 1) == 1) { $blog_item .= ' '. $rss_link; } else { $blog_item = $rss_link .' '. $blog_item; } } $blogs[] = $blog_item; } $output .= theme('item_list', $blogs); $output = theme('site_map_box', $title, $output, 'sitemap-blog'. $class); } return $output; } function _site_map_audio() { $output = ''; $class = ''; if (module_exists('audio')) { $title = t('Audio'); $output = l(t('Audio content'), 'audio'); if (variable_get('site_map_show_rss_links', 1) != 0) { $rss_link = theme('site_map_feed_icon', 'audio/feed'); if (variable_get('site_map_show_rss_links', 1) == 1) { $output .= ' '. $rss_link; } else { $class = ' sitemap-rss-left'; $output = $rss_link .' '. $output; } } $output = theme('site_map_box', $title, $output, 'sitemap-audio'. $class); } return $output; } function _site_map_video() { $output = ''; $class = ''; if (module_exists('video')) { $title = t('Video'); $output = l(t('Video content'), 'video'); if (variable_get('site_map_show_rss_links', 1) != 0) { $rss_link = theme('site_map_feed_icon', 'video/feed'); if (variable_get('site_map_show_rss_links', 1) == 1) { $output .= ' '. $rss_link; } else { $class = ' sitemap-rss-left'; $output = $rss_link .' '. $output; } } $output = theme('site_map_box', $title, $output, 'sitemap-video'. $class); } return $output; } /** * Render books */ function _site_map_books() { $output = ''; if (module_exists('book') && ($nids = variable_get('site_map_show_books', array()))) { $title = t('Books'); $description = '
'. t("Books at %sn.", array("%sn" => variable_get('site_name', 'Drupal'))) .'
'; $book_menus = array(); foreach ($nids as $nid) { $node = node_load($nid); $tree = menu_tree_all_data($node->book['menu_name'], $node->book); $data = array_shift($tree); $output .= theme('book_title_link', $data['link']); $output .= ($data['below']) ? menu_tree_output($data['below']) : ''; } if ($output) { $output = theme('site_map_box', $title, $description . $output, 'sitemap-book'); } } return $output; } /** * Render menus */ function _site_map_menus() { global $language; if (module_exists('locale')) { $mids = variable_get('site_map_show_menus_'. $language->language, array()); } else { $mids = variable_get('site_map_show_menus', array()); } $output = ''; if ($mids) { foreach ($mids as $mid) { $menu = menu_load($mid); // Use menu_tree_all_data to retrieve the expanded tree. $tree = menu_tree_all_data($mid); if (module_exists('i18nmenu')) { i18nmenu_localize_tree($tree); } $menu_display = menu_tree_output($tree); if (!empty($menu_display)) { $title = $menu['title']; $output .= theme('site_map_box', $title, $menu_display, 'sitemap-menu'); } } } return $output; } function _site_map_faq() { $output = ''; if (module_exists('faq')) { $title = variable_get('faq_title', t('Frequently Asked Questions')); $output = faq_get_faq_list(); $output = theme('site_map_box', $title, $output, 'sitemap-faq'); } return $output; } /** * This function can be called from blocks or pages as desired. */ function _site_map_taxonomys() { $output = ''; if (module_exists('taxonomy') && $vids = variable_get('site_map_show_vocabularies', array())) { $result = db_query('SELECT vid, name, description FROM {vocabulary} WHERE vid IN ('. db_placeholders($vids, 'int') .') ORDER BY weight ASC, name', $vids); while ($t = db_fetch_object($result)) { if (module_exists('i18ntaxonomy')) { $t->name = tt("taxonomy:vocabulary:$t->vid:name", $t->name); } $output .= _site_map_taxonomy_tree($t->vid, $t->name, $t->description); } } return $output; } /** * Render taxonomy tree * * @param $tree The results of taxonomy_get_tree() with optional 'count' fields. * @param $name An optional name for the tree. (Default: NULL) * @param $description An optional description of the tree. (Default: NULL) * @return A string representing a rendered tree. */ function _site_map_taxonomy_tree($vid, $name = NULL, $description = NULL) { $output = ''; $class = ''; if ($vid == variable_get('forum_nav_vocabulary', '')) { $title = l($name, 'forum'); $threshold = variable_get('site_map_forum_threshold', -1); $forum_link = TRUE; } else { $title = $name ? check_plain(t($name)) : ''; $threshold = variable_get('site_map_term_threshold', 0); $forum_link = FALSE; } $title .= (module_exists('commentrss') && variable_get('commentrss_term', FALSE) ? ' '. theme('site_map_feed_icon', "crss/vocab/$vid", 'comment') : ''); $last_depth = -1; $rss_depth = variable_get('site_map_rss_depth', 'all'); if (!is_numeric($rss_depth) || $rss_depth < 0) { $rss_depth = 'all'; } $cat_depth = variable_get('site_map_categories_depth', 'all'); if (!is_numeric($cat_depth)) { $cat_depth = 'all'; } $output .= !empty($description) ? '
'. filter_xss_admin($description) ."
\n" : ''; $output .= '
'; // taxonomy_get_tree() honors access controls $tree = taxonomy_get_tree($vid); foreach ($tree as $term) { $term->count = taxonomy_term_count_nodes($term->tid); if ($term->count <= $threshold) { continue; } if (module_exists('i18ntaxonomy')) { $term->name = tt("taxonomy:term:$term->tid:name", $term->name); } // Adjust the depth of the \n"; } } $output .= "
\n"; $output = theme('site_map_box', $title, $output, 'sitemap-terms sitemap-terms-'. $vid . $class); return $output; } /** * Get the message which appears above the site map. * If the locale module is enabled, an optional language code can be given */ function _sitemap_get_message($lang_code = NULL) { if (module_exists('locale')) { if ($lang_code == NULL) { global $language; $lang_code = $language->language; } $message = filter_xss_admin(variable_get("site_map_message_$lang_code", '')); } else { $message = filter_xss_admin(variable_get('site_map_message', '')); } return $message; }