'. $output .'

' : ''; } } /** * Implementation of hook_perm(). */ function site_map_perm() { return array('access site map'); } /** * Implementation of hook_settings(). */ function site_map_admin_settings() { // Field to set site map message. Nifty language support from the catcha module,thanks. if (module_exists('locale')) { $langs = locale_supported_languages(); $form['site_map_message'] = array( '#type' => 'fieldset', '#title' => t('Site map message'), '#description' => t('Define a message to be displayed above the site map.'), ); foreach ($langs['name'] as $lang_code => $lang_name) { $form['site_map_message']["site_map_message_$lang_code"] = array( '#type' => 'textarea', '#title' => t('For language %lang_name (code %lang_code)', array('%lang_name' => $lang_name, '%lang_code' => $lang_code)), '#default_value' => _sitemap_get_message($lang_code), '#cols' => 60, '#rows' => 5, ); } } else { $form['site_map_message'] = array( '#type' => 'textarea', '#title' => t('Site map message'), '#default_value' => _sitemap_get_message(), '#cols' => 60, '#rows' => 5, '#description' => t('Define a message to be displayed above the site map.'), ); } $form['site_map_content'] = array( '#type' => 'fieldset', '#title' => t('Site map content'), ); $form['site_map_content']['site_map_show_front'] = array( '#type' => 'checkbox', '#title' => t('Show front page'), '#return_value' => 1, '#default_value' => variable_get('site_map_show_front', 1), '#description' => t('When enabled, this option will include the front page in the site map.'), ); $form['site_map_content']['site_map_show_blogs'] = array( '#type' => 'checkbox', '#title' => t('Show active blog authors'), '#return_value' => 1, '#default_value' => variable_get('site_map_show_blogs', 1), '#description' => t('When enabled, this option will show the 10 most active blog authors.'), ); $book_options = array(); if (module_exists('book')) { $result = db_query(db_rewrite_sql('SELECT n.nid, n.title FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE b.parent = 0 ORDER BY b.weight, n.title')); while ($row = db_fetch_object($result)) { $book_options[$row->nid] = $row->title; } } $form['site_map_content']['site_map_show_books'] = array( '#type' => 'select', '#title' => t('Books to include in the site map'), '#default_value' => variable_get('site_map_show_books', array()), '#options' => $book_options, '#multiple' => TRUE, '#description' => t('Ctrl-click (Windows) or Command-click (Mac) to select more than one value.'), ); $menu_options = array(); $menu_options = menu_get_root_menus(); $form['site_map_content']['site_map_show_menus'] = array( '#type' => 'select', '#title' => t('Menus to include in the site map'), '#default_value' => variable_get('site_map_show_menus', array()), '#options' => $menu_options, '#multiple' => TRUE, '#description' => t('Ctrl-click (Windows) or Command-click (Mac) to select more than one value.'), ); $form['site_map_content']['site_map_show_faq'] = array( '#type' => 'checkbox', '#title' => t('Show FAQ content'), '#return_value' => 1, '#default_value' => variable_get('site_map_show_faq', 1), '#description' => t('When enabled, this option will include the content from the FAQ module in the site map.'), ); $vocab_options = array(); if (module_exists('taxonomy')) { foreach (taxonomy_get_vocabularies() as $vocabulary) { $vocab_options[$vocabulary->vid] = $vocabulary->name; } } $form['site_map_content']['site_map_show_vocabularies'] = array( '#type' => 'select', '#title' => t('Categories to include in the site map'), '#default_value' => variable_get('site_map_show_vocabularies', array()), '#options' => $vocab_options, '#multiple' => TRUE, '#description' => t('Ctrl-click (Windows) or Command-click (Mac) to select more than one value.'), ); $form['site_map_content_options'] = array( '#type' => 'fieldset', '#title' => t('Categories settings'), ); $form['site_map_content_options']['site_map_books_expanded'] = array( '#type' => 'checkbox', '#title' => t('Show books expanded'), '#return_value' => 1, '#default_value' => variable_get('site_map_books_expanded', 1), '#description' => t('When enabled, this option will show all children pages for each book.'), ); $form['site_map_content_options']['site_map_show_count'] = array( '#type' => 'checkbox', '#title' => t('Show node counts by categories'), '#return_value' => 1, '#default_value' => variable_get('site_map_show_count', 1), '#description' => t('When enabled, this option will show the number of nodes in each taxonomy term.'), ); $form['site_map_content_options']['site_map_categories_depth'] = array( '#type' => 'textfield', '#title' => t('Categories depth'), '#default_value' => variable_get('site_map_categories_depth', 'all'), '#size' => 3, '#maxlength' => 10, '#description' => t('Specify how many subcategories should be included on the categorie page. Enter "all" to include all subcategories,"0" to include no subcategories, or "-1" not to append the depth at all.'), ); $form['site_map_rss_options'] = array( '#type' => 'fieldset', '#title' => t('RSS settings'), ); $form['site_map_rss_options']['site_map_show_rss_links'] = array( '#type' => 'checkbox', '#title' => t('Include RSS links'), '#return_value' => 1, '#default_value' => variable_get('site_map_show_rss_links', 1), '#description' => t('When enabled, this option will show links to the RSS feeds for each category and blog.'), ); $form['site_map_rss_options']['site_map_rss_depth'] = array( '#type' => 'textfield', '#title' => t('RSS feed depth'), '#default_value' => variable_get('site_map_rss_depth', 'all'), '#size' => 3, '#maxlength' => 10, '#description' => t('Specify how many subcategories should be included in the RSS feed. Enter "all" to include all subcategories or "0" to include no subcategories.'), ); return system_settings_form($form); } /** * Implementation of hook_menu(). */ function site_map_menu($may_cache) { $items = array(); if ($may_cache) { $items[] = array( 'path' => 'admin/settings/sitemap', 'title' => t('Site map'), 'description' => t('Control what should be displayed on the site map.'), 'callback' => 'drupal_get_form', 'callback arguments' => 'site_map_admin_settings', 'access' => user_access('administer site configuration'), 'type' => MENU_NORMAL_ITEM ); $items[] = array( 'path' => 'sitemap', 'title' => t('Site map'), 'description' => t('Display a site map with RSS feeds.'), 'callback' => 'site_map_page', 'access' => user_access('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 = 'rss.xml'; } $block['content'] = theme('feed_icon', url($feedurl)); $block['content'] .= '\n"; return $block; } } } /** * Menu callback for the site map. */ function site_map_page() { // Set breadcrumbs $breadcrumb = array(array('path' => 'sitemap')); menu_set_location($breadcrumb); return theme('site_map_display'); } function theme_site_map_display() { $output = ''; if (variable_get('site_map_show_rss_links', 1)) { $output .= '

'. theme('site_map_feed_icon', NULL) .' '. t('This is a link to a content RSS feed'); if (module_exists('commentrss')) { $output .= '
'. theme('site_map_feed_icon', NULL, 'comment') .' '. t('This is a 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; } function theme_site_map_feed_icon($url, $type = 'node') { switch ($type) { case 'node': $output = theme('image', (drupal_get_path('module', 'site_map') .'/feed-small.png'), t('Syndicate content'), t('Syndicate content')); if ($url) { $output = ''. $output .''; } break; case 'comment': $output = theme('image', (drupal_get_path('module', 'site_map') .'/feed-small-comment.png'), t('Syndicate comments'), t('Syndicate comments')); if ($url) { $output = ''. $output .''; } break; } return $output; } function _site_map_front_page() { $title = t('Front page'); $output = l(t("Front page of %sn", array("%sn" => variable_get('site_name', 'Drupal'))), '', NULL, NULL, NULL, FALSE, TRUE) . (variable_get('site_map_show_rss_links', 1) ? ' '. theme('site_map_feed_icon', url('rss.xml')) . (module_exists('commentrss') ? ' '. theme('site_map_feed_icon', url('crss'), 'comment') : '') : ''); $output = theme('box', $title, $output); return $output; } /** * Render the latest blog authors */ function _site_map_blogs() { if (module_exists('blog')) { $title = t('Blogs'); $output = '
'. t("Community blog and recent blog authors at %sn.", array("%sn" => variable_get('site_name', 'Drupal'))) .'
'; $blogs = array(); $blogs[] .= l(t('All blogs'), 'blog') . (variable_get('site_map_show_rss_links', 1) ? ' '. theme('site_map_feed_icon', url('blog/feed')) : ''); $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 ORDER BY numitems DESC, u.name"; $result = db_query_range($sql, 0, 10); while ($blog = db_fetch_object($result)) { $blogs[] = l(t("!s's blog", array("!s" => $blog->name)), "blog/$blog->uid") .' ('. $blog->numitems .')'. (variable_get('site_map_show_rss_links', 1) ? ' '. theme('site_map_feed_icon', url("blog/$blog->uid/feed")) : ''); } $output .= theme('item_list', $blogs); $output = theme('box', $title, $output); } return $output; } function _site_map_audio() { if (module_exists('audio')) { $title = t('Audio'); $output = l(t('Audio content'), 'audio') . (variable_get('site_map_show_rss_links', 1) ? ' '. theme('site_map_feed_icon', url('audio/feed')) : ''); $output = theme('box', $title, $output); } return $output; } function _site_map_video() { if (module_exists('video')) { $title = t('Video'); $output = l(t('Video content'), 'video') . (variable_get('site_map_show_rss_links', 1) ? ' '. theme('site_map_feed_icon', url('video/feed')) : ''); $output = theme('box', $title, $output); } return $output; } /** * Render books */ function _site_map_books() { 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'))) .'
'; $result = db_query(db_rewrite_sql('SELECT n.nid, n.title FROM {node} n INNER JOIN {book} b ON n.vid = b.vid WHERE b.parent = 0 AND n.status = 1 AND n.moderate = 0 AND n.nid IN (%s) ORDER BY b.weight, n.title'), implode(',', $nids)); while ($node = db_fetch_object($result)) { $book_display .= '

'. l($node->title, 'node/'. $node->nid) .'

'; $book_display .= book_tree($node->nid, 5 , array(variable_get('site_map_books_expanded', 1) ? TRUE : '')); } if ($book_display) { $output = theme('box', $title, $description . $book_display); } } return $output; } /** * Render menus */ function _site_map_menus() { $output = ''; if ($mids = variable_get('site_map_show_menus', array())) { $menu = menu_get_menu(); foreach ($mids as $mid) { $menu_display = _site_map_menu_tree($mid, $menu); if (!empty($menu_display)) { $title = $menu['visible'][$mid]['title']; $output .= theme('box', $title, $menu_display); } } } return $output; } function _site_map_faq() { if (module_exists('faq')) { $title = variable_get('faq_title', t('Frequently Asked Questions')); $output = faq_get_faq_list(); $output = theme('box', $title, $output); } return $output; } function _site_map_menu_tree($pid = 1, $menu = NULL) { // based on functions theme_menu_tree and menu_tree if (isset($menu['visible'][$pid]) && $menu['visible'][$pid]['children']) { foreach ($menu['visible'][$pid]['children'] as $mid) { $children = isset($menu['visible'][$mid]['children']) ? $menu['visible'][$mid]['children'] : NULL; $menu_tree .= theme('menu_item', $mid, _site_map_menu_tree($mid, $menu), count($children) == 0); } } if ($menu_tree) { $output = ''; } return $output; } /** * This function can be called from blocks or pages as desired. */ function _site_map_taxonomys() { if (module_exists('taxonomy') && $vids = variable_get('site_map_show_vocabularies', array())) { $result = db_query('SELECT vid, name, description FROM {vocabulary} WHERE vid IN (%s) ORDER BY weight ASC, name', implode(',', $vids)); while ($t = db_fetch_object($result)) { $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) { if ($vid == variable_get('forum_nav_vocabulary', '')) { $title = l($name, 'forum'); } else { $title = $name ? check_plain(t($name)) : ''; } $title .= (module_exists('commentrss') ? ' '. theme('site_map_feed_icon', url("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 = $description ? '
'. check_plain($description) .'
' : ''; $output .= '
'; // taxonomy_get_tree() honors access controls $tree = taxonomy_get_tree($vid); foreach ($tree as $term) { // Adjust the depth of the '; } } $output .= "
\n"; $output = theme('box', $title, $output); 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 $locale; $lang_code = $locale; } $message = filter_xss_admin(variable_get("site_map_message_$lang_code", '')); } else { $message = filter_xss_admin(variable_get('site_map_message', '')); } return $message; }