smf-theme/index.template.php

900 lines
32 KiB
PHP

<?php
/**
* Simple Machines Forum (SMF)
*
* @package SMF
* @author Simple Machines https://www.simplemachines.org
* @copyright 2022 Simple Machines and individual contributors
* @license https://www.simplemachines.org/about/smf/license.php BSD
*
* @version 2.1.3
*/
/* This template is, perhaps, the most important template in the theme. It
contains the main template layer that displays the header and footer of
the forum, namely with main_above and main_below. It also contains the
menu sub template, which appropriately displays the menu; the init sub
template, which is there to set the theme up; (init can be missing.) and
the linktree sub template, which sorts out the link tree.
The init sub template should load any data and set any hardcoded options.
The main_above sub template is what is shown above the main content, and
should contain anything that should be shown up there.
The main_below sub template, conversely, is shown after the main content.
It should probably contain the copyright statement and some other things.
The linktree sub template should display the link tree, using the data
in the $context['linktree'] variable.
The menu sub template should display all the relevant buttons the user
wants and or needs.
For more information on the templating system, please see the site at:
https://www.simplemachines.org/
*/
/**
* Initialize the template... mainly little settings.
*/
function template_init()
{
global $settings, $txt;
/* $context, $options and $txt may be available for use, but may not be fully populated yet. */
// The version this template/theme is for. This should probably be the version of SMF it was created for.
$settings['theme_version'] = '2.1';
// Set the following variable to true if this theme requires the optional theme strings file to be loaded.
$settings['require_theme_strings'] = false;
// Set the following variable to true if this theme wants to display the avatar of the user that posted the last and the first post on the message index and recent pages.
$settings['avatars_on_indexes'] = false;
// Set the following variable to true if this theme wants to display the avatar of the user that posted the last post on the board index.
$settings['avatars_on_boardIndex'] = false;
// Set the following variable to true if this theme wants to display the login and register buttons in the main forum menu.
$settings['login_main_menu'] = false;
// This defines the formatting for the page indexes used throughout the forum.
$settings['page_index'] = array(
'extra_before' => '<span class="pages">' . $txt['pages'] . '</span>',
'previous_page' => '<span class="main_icons previous_page"></span>',
'current_page' => '<span class="current_page">%1$d</span> ',
'page' => '<a class="nav_page" href="{URL}">%2$s</a> ',
'expand_pages' => '<span class="expand_pages" onclick="expandPages(this, {LINK}, {FIRST_PAGE}, {LAST_PAGE}, {PER_PAGE});"> ... </span>',
'next_page' => '<span class="main_icons next_page"></span>',
'extra_after' => '',
);
// Allow css/js files to be disabled for this specific theme.
// Add the identifier as an array key. IE array('smf_script'); Some external files might not add identifiers, on those cases SMF uses its filename as reference.
if (!isset($settings['disable_files']))
$settings['disable_files'] = array();
}
/**
* The main sub template above the content.
*/
function template_html_above()
{
global $context, $scripturl, $txt, $modSettings;
// Show right to left, the language code, and the character set for ease of translating.
echo '<!DOCTYPE html>
<html', $context['right_to_left'] ? ' dir="rtl"' : '', !empty($txt['lang_locale']) ? ' lang="' . str_replace("_", "-", substr($txt['lang_locale'], 0, strcspn($txt['lang_locale'], "."))) . '"' : '', '>
<head>
<meta charset="', $context['character_set'], '">';
/*
You don't need to manually load index.css, this will be set up for you.
Note that RTL will also be loaded for you.
To load other CSS and JS files you should use the functions
loadCSSFile() and loadJavaScriptFile() respectively.
This approach will let you take advantage of SMF's automatic CSS
minimization and other benefits. You can, of course, manually add any
other files you want after template_css() has been run.
* Short example:
- CSS: loadCSSFile('filename.css', array('minimize' => true));
- JS: loadJavaScriptFile('filename.js', array('minimize' => true));
You can also read more detailed usages of the parameters for these
functions on the SMF wiki.
* Themes:
The most efficient way of writing multi themes is to use a master
index.css plus variant.css files. If you've set them up properly
(through $settings['theme_variants']), the variant files will be loaded
for you automatically.
Additionally, tweaking the CSS for the editor requires you to include
a custom 'jquery.sceditor.theme.css' file in the css folder if you need it.
* MODs:
If you want to load CSS or JS files in here, the best way is to use the
'integrate_load_theme' hook for adding multiple files, or using
'integrate_pre_css_output', 'integrate_pre_javascript_output' for a single file.
*/
// load in any css from mods or themes so they can overwrite if wanted
template_css();
// load in any javascript files from mods and themes
template_javascript();
echo '
<title>', $context['page_title_html_safe'], '</title>
<meta name="viewport" content="width=device-width, initial-scale=1">';
// Content related meta tags, like description, keywords, Open Graph stuff, etc...
foreach ($context['meta_tags'] as $meta_tag)
{
echo '
<meta';
foreach ($meta_tag as $meta_key => $meta_value)
echo ' ', $meta_key, '="', $meta_value, '"';
echo '>';
}
/* What is your Lollipop's color?
Theme Authors, you can change the color here to make sure your theme's main color gets visible on tab */
echo '
<meta name="theme-color" content="#557EA0">';
// Please don't index these Mr Robot.
if (!empty($context['robot_no_index']))
echo '
<meta name="robots" content="noindex">';
// Present a canonical url for search engines to prevent duplicate content in their indices.
if (!empty($context['canonical_url']))
echo '
<link rel="canonical" href="', $context['canonical_url'], '">';
// Show all the relative links, such as help, search, contents, and the like.
echo '
<link rel="help" href="', $scripturl, '?action=help">
<link rel="contents" href="', $scripturl, '">', ($context['allow_search'] ? '
<link rel="search" href="' . $scripturl . '?action=search">' : '');
// If RSS feeds are enabled, advertise the presence of one.
if (!empty($modSettings['xmlnews_enable']) && (!empty($modSettings['allow_guestAccess']) || $context['user']['is_logged']))
echo '
<link rel="alternate" type="application/rss+xml" title="', $context['forum_name_html_safe'], ' - ', $txt['rss'], '" href="', $scripturl, '?action=.xml;type=rss2', !empty($context['current_board']) ? ';board=' . $context['current_board'] : '', '">
<link rel="alternate" type="application/atom+xml" title="', $context['forum_name_html_safe'], ' - ', $txt['atom'], '" href="', $scripturl, '?action=.xml;type=atom', !empty($context['current_board']) ? ';board=' . $context['current_board'] : '', '">';
// If we're viewing a topic, these should be the previous and next topics, respectively.
if (!empty($context['links']['next']))
echo '
<link rel="next" href="', $context['links']['next'], '">';
if (!empty($context['links']['prev']))
echo '
<link rel="prev" href="', $context['links']['prev'], '">';
// If we're in a board, or a topic for that matter, the index will be the board's index.
if (!empty($context['current_board']))
echo '
<link rel="index" href="', $scripturl, '?board=', $context['current_board'], '.0">';
// Include stylesheets for custom fonts.
// TODO: The theme path could probably be un-hardcoded.
echo '
<link rel="stylesheet" href="/Themes/MMF/css/fonts-cabin.css" />
<link rel="stylesheet" href="/Themes/MMF/css/fonts-oswald.css" />';
// Output any remaining HTML headers. (from mods, maybe?)
echo $context['html_headers'];
echo '
</head>
<body id="', $context['browser_body_id'], '" class="action_', !empty($context['current_action']) ? $context['current_action'] : (!empty($context['current_board']) ?
'messageindex' : (!empty($context['current_topic']) ? 'display' : 'home')), !empty($context['current_board']) ? ' board_' . $context['current_board'] : '', '">
';
}
/**
* The upper part of the main template layer. This is the stuff that shows above the main forum content.
*/
function template_body_above()
{
global $context, $settings, $scripturl, $txt, $modSettings, $maintenance;
// Liens pour accessibilité, invisible sans utiliser la navigation au clavier
// menu du forum
echo '<a class="link_access" href="#main_menu">'. $txt['khbb_link_main_menu'] .'</a> ';
// contenu du forum
echo '<a class="link_access" href="#content_section">' . $txt['khbb_link_content_section'] . '</a> ';
// recherche du forum
echo '<a class="link_access" href="?action=search#searchfor">' . $txt['khbb_link_search'] . '</a> ';
echo '<div class="khbb_body">';
// Wrapper div now echoes permanently for better layout options. h1 a is now target for "Go up" links.
echo '
<div id="khbb_forum" class="khbb_forum">
<div id="header">
<h1 class="forumtitle">
<a id="top" href="', $scripturl, '">', empty($context['header_logo_url_html_safe']) ? $context['forum_name_html_safe'] : '<img src="' . $context['header_logo_url_html_safe'] . '" alt="' . $context['forum_name_html_safe'] . '">', '</a>
</h1>
</div>
<div id="wrapper">';
// début menu du haut. On reconstruit sauce maison.
echo '<a class="mobile_user_menu">
<div class="khbb_mobile_button">
<span class="menu_icon"></span>
<span class="text_menu">', $txt['mobile_user_menu'], '</span>
</div>
</a>';
echo '<nav id="main_menu" class="" >';
// De quoi gérer le menu en mobile
echo '<div id="mobile_user_menu" class="popup_container">
<div class="popup_window_menu khbb_nav">
<div class="popup_heading">', $txt['mobile_user_menu'], '
<a href="javascript:void(0);" class="main_icons hide_popup"></a>
</div>';
//le menu proprement dit
echo '<ul>
';
// Appel des boutons home, recherche et divers trucs de quand on est co. Todo : éclater ce menu pour mettre d'un côté les liens vers une fonction (type recherche) de l'autre celles vers des pages (type home)
//echo template_menu() ;
// Test de reconstruction maison du menu
echo '<ul class="dropmenu menu_nav">';
// Quand on est pas co : Accueil, Rechercher
echo '<li>
<a href="/" >
<img class="" alt="" src="' . $settings['images_url'] . '/icons/home.png"></img>
<span class="khbb_subtitlemenu">' ,$txt['home'], '</span>
</a>
</li> ';
if ($context['allow_search'])
{
echo '<li>
<a href="?action=search" >
<img class="" alt="" src="' . $settings['images_url'] . '/icons/search.png"></img>
<span class="khbb_subtitlemenu">' ,$txt['search'], '</span>
</a>
</li> ';
}
// messages récents
echo '<li>
<a href="?action=recent" title="', $txt['recent_view'], '">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/recent.png"></img>
<span class="khbb_subtitlemenu">', $txt['recent_posts'],'</span>
</a>
</li> ';
// If the user is logged in, display some things that might be useful. S'affiche uniquement si connecté
if ($context['user']['is_logged'])
{
// messages non lus, etc
echo '
<li>
<a href="', $scripturl, '?action=unread" title="', $txt['unread_since_visit'], '">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/unread.png"></img>
<span class="khbb_subtitlemenu">' ,$txt['view_unread_category'], '</span>
</a>
</li>
<li>
<a href="', $scripturl, '?action=profile;area=showposts;sa=messages;u=', $context['user']['id'],'" title="', $txt['show_unread_replies'], '">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/unread_replies.png"></img>
<span class="khbb_subtitlemenu">' ,$txt['unread_replies'], '</span>
</a>
</li> ';
// Calendrier.
if ($context['allow_calendar'])
{
echo '<li>
<a href="?action=calendar" >
<img class="" alt="" src="' . $settings['images_url'] . '/icons/calendar.svg"></img>
<span class="khbb_subtitlemenu">' ,$txt['calendar'], '</span>
</a>
</li> ';
}
// Liste des membres (sous-menu possible mais osef)
echo '<li>
<a href="?action=mlist" title="', $txt['mlist_menu_view'], '">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/members.png"></img>
<span class="khbb_subtitlemenu">' ,$txt['members'], '</span>
</a>
</li>
';
// PMs if we're doing them
if ($context['allow_pm'])
echo '
<li>
<a href="?action=pm" >
<img class="" alt="" src="' . $settings['images_url'] . '/icons/pm.png"></img>
<span class="khbb_subtitlemenu">', $txt['pm_short'], '</span>', !empty($context['user']['unread_messages']) ? '
<span class="amt">' . $context['user']['unread_messages'] . '</span>' : '', '
</a>
<div id="pm_menu" class="top_menu scrollable"></div>
</li>';
// alerts
echo '
<li>
<a href="?action=profile;area=showalerts;u=', $context['user']['id'], '" title="', $txt['notify_replies'], '">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/alerts.png"></img>
<span class="khbb_subtitlemenu">', $txt['alerts'], '</span>', !empty($context['user']['alerts']) ? '
<span class="amt">' . $context['user']['alerts'] . '</span>' : '', '
</a>
<div id="alerts_menu" class="top_menu scrollable"></div>
</li>';
// the user's menu. Envoie sur la page de profil sans la popup.
echo '
<li>
<a href="?action=profile" title="', $txt['forumprofile'], '">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/profile.png"></img>
<span class="khbb_subtitlemenu">', $txt['profile'], '</span>
</a>
</li>';
// Droits spécifiques
// Admin (sous-menu mais osef)
if ($context['allow_admin'])
echo '<li>
<a href="?action=admin" title="', $txt['admin_center'],' ">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/admin.png"></img>
<span class="khbb_subtitlemenu">' ,$txt['admin'], '</span>
';
// Show how many errors there are
if (!empty($context['num_errors']))
{
echo '<a href="?action=admin;area=logs;sa=errorlog" title="', $txt['errorlog'],' "><span class="error">' . $context['num_errors'] . '</span></a>';
}
echo '</a>
</li> ';
// Modération (sous-menu mais idem osef)
if ($context['allow_admin'])
echo '<li>
<a href="?action=moderate">
<img class="" alt="" src="' . $settings['images_url'] . '/icons/moderate.png"></img>
<span class="khbb_subtitlemenu">' ,$txt['moderate'], '</span>
';
// Show how many errors there are
if (!empty($context['total_mod_reports']))
{
echo '<span class="amt">' . $context['total_mod_reports'] . '</span>';
}
echo '</a>
</li> ';
// A logout button
if (empty($settings['login_main_menu']))
echo '
<li>
<a href="', $scripturl, '?action=logout;', $context['session_var'], '=', $context['session_id'], '" >
<img class="" alt="" src="' . $settings['images_url'] . '/icons/login.png"></img>
<span class="khbb_subtitlemenu">', $txt['logout'], '</span>
</a>
</li>';
}
// Otherwise they're a guest. Ask them to either register or login.
elseif (empty($maintenance))
{
// Some people like to do things the old-fashioned way.
// Todo : je ne sais pas ce que ça fait et quand ça risquera de poper.
if (!empty($settings['login_main_menu']))
{
echo '
<li class="welcome">', sprintf($txt[$context['can_register'] ? 'welcome_guest_register' : 'welcome_guest'], $context['forum_name_html_safe'], $scripturl . '?action=login', 'return reqOverlayDiv(this.href, ' . JavaScriptEscape($txt['login']) . ', \'login\');', $scripturl . '?action=signup'), '</li>
';
}
else
{
// The login button (and inscription) title="', $txt['login'], '/', $txt['register'],'"
echo '
<li class="button_login">
<a href="', $scripturl, '?action=login"
class="', $context['current_action'] == 'login' ? 'active' : 'open','"
onclick="return reqOverlayDiv(this.href, ' . $txt['login'] . ', \'login\');"
>
<img class="" alt="" src="' . $settings['images_url'] . '/icons/login.png"></img>
<span class="khbb_subtitlemenu">', $txt['login'], '/', $txt['register'],'</span>
</a>
</li>';
}
}
// Fin menu
echo '</ul><!-- .menu_nav -->';
echo '</ul>'
;
// Language
if (!empty($modSettings['userLanguage']) && !empty($context['languages']) && count($context['languages']) > 1)
{
echo '
<form id="languages_form" method="get">
<label for="language_select" class="khbb_label">', $txt['khbb_language_choose'], '</label>
<select id="language_select" name="language" <!--onchange="this.form.submit()-->">';
foreach ($context['languages'] as $language)
echo '
<option value="', $language['filename'], '"', isset($context['user']['language']) && $context['user']['language'] == $language['filename'] ? ' selected="selected"' : '', '>', str_replace('-utf8', '', $language['name']), '</option>';
echo '
</select>
<input type="submit" value="', $txt['quick_mod_go'], '">
</form>';
}
echo '
</div></div>
</nav> ';
// Fin menu
theme_linktree();
// The main content should go here.
echo '
<div id="content_section">
<div id="main_content_section">';
}
/**
* The stuff shown immediately below the main content, including the footer
*/
function template_body_below()
{
global $context, $txt, $scripturl, $modSettings;
echo '
</div><!-- #main_content_section -->
</div><!-- #content_section -->
';
// Show the footer with copyright, terms and help links.
echo '<div>
<div id="footer">
<div class="footer2">
<div class="inner_wrap">';
echo '
<ul>
<li class="floatright"><a href="', $scripturl, '?action=help">', $txt['help'], '</a> ', (!empty($modSettings['requireAgreement'])) ? '| <a href="' . $scripturl . '?action=agreement">' . $txt['terms_and_rules'] . '</a>' : '', ' </li>
<li>';
// Insérer barre de recherche rapide quick search
echo template_quicksearch() ;
echo '
</li>
<li class="copyright">', theme_copyright(), '</li>
<li><a href="?action=.xml;type=rss">Flux RSS</a></li>
</ul>';
// Show the load time?
if ($context['show_load_time'])
echo '
<p>', sprintf($txt['page_created_full'], $context['load_time'], $context['load_queries']), '</p>';
echo '
</div>
</div>
</div><!-- #footer -->
</div><!-- #wrapper -->
';
// There is now a global "Go to top" link at the right.
echo '
<div class="go_to_top"><a href="#top">', $txt['go_up'], ' &#9650;</a></div>
';
echo '</div>';
echo '</div>';
}
/**
* This shows any deferred JavaScript and closes out the HTML
*/
function template_html_below()
{
// Load in any javascipt that could be deferred to the end of the page
template_javascript(true);
echo '</body>
</html>';
}
/**
* Show a linktree. This is that thing that shows "My Community | General Category | General Discussion"..
*
* @param bool $force_show Whether to force showing it even if settings say otherwise
*/
function theme_linktree($force_show = false)
{
global $context, $shown_linktree, $scripturl, $txt;
// If linktree is empty, just return - also allow an override.
if (empty($context['linktree']) || (!empty($context['dont_default_linktree']) && !$force_show))
return;
echo '
<div class="navigate_section">
<ul>';
// Each tree item has a URL and name. Some may have extra_before and extra_after.
foreach ($context['linktree'] as $link_num => $tree)
{
echo '
<li', ($link_num == count($context['linktree']) - 1) ? ' class="last"' : '', '>';
// Don't show a separator for the first one.
// Better here. Always points to the next level when the linktree breaks to a second line.
// Picked a better looking HTML entity, and added support for RTL plus a span for styling.
if ($link_num != 0)
echo '
<span class="dividers">', $context['right_to_left'] ? ' &#9668; ' : ' &#9658; ', '</span>';
// Show something before the link?
if (isset($tree['extra_before']))
echo $tree['extra_before'], ' ';
// Show the link, including a URL if it should have one.
if (isset($tree['url']))
echo '
<a href="' . $tree['url'] . '"><span>' . $tree['name'] . '</span></a>';
else
echo '
<span>' . $tree['name'] . '</span>';
// Show something after the link...?
if (isset($tree['extra_after']))
echo ' ', $tree['extra_after'];
echo '
</li>';
}
echo '
</ul>
</div><!-- .navigate_section -->';
$shown_linktree = true;
}
/**
* Show the menu up top. Something like [home] [help] [profile] [logout]...
*/
function template_menu()
{
global $context, $settings;
echo '<ul class="dropmenu menu_nav">';
// Note: Menu markup has been cleaned up to remove unnecessary spans and classes.
foreach ($context['menu_buttons'] as $act => $button)
{
echo '
<li class="button_', $act, '', !empty($button['sub_buttons']) ? ' subsections"' : '"', '>
<a', $button['active_button'] ? ' class="active"' : '', ' href="', $button['href'], '"', isset($button['target']) ? ' target="' . $button['target'] . '"' : '', isset($button['onclick']) ? ' onclick="' . $button['onclick'] . '"' : '', '
title="', $button['title'], '"
>
<!--test bouton personnalisé-->
<img class=""
alt=""
src="' . $settings['images_url'] . '/icons/generics.svg"></img>
</a>';
// 2nd level menus
if (!empty($button['sub_buttons']))
{
echo '<ul>';
foreach ($button['sub_buttons'] as $childbutton)
{
echo '
<li', !empty($childbutton['sub_buttons']) ? ' class="subsections"' : '', '>
<a href="', $childbutton['href'], '"', isset($childbutton['target']) ? ' target="' . $childbutton['target'] . '"' : '', isset($childbutton['onclick']) ? ' onclick="' . $childbutton['onclick'] . '"' : '', '>
', $childbutton['title'], !empty($childbutton['amt']) ? ' <span class="amt">' . $childbutton['amt'] . '</span>' : '', '
</a>';
// 3rd level menus :)
if (!empty($childbutton['sub_buttons']))
{
echo '<ul>';
foreach ($childbutton['sub_buttons'] as $grandchildbutton)
echo '<li>
<a href="', $grandchildbutton['href'], '"', isset($grandchildbutton['target']) ? ' target="' . $grandchildbutton['target'] . '"' : '', isset($grandchildbutton['onclick']) ? ' onclick="' . $grandchildbutton['onclick'] . '"' : '', '>
', $grandchildbutton['title'], !empty($grandchildbutton['amt']) ? ' <span class="amt">' . $grandchildbutton['amt'] . '</span>' : '', '
</a>
</li>';
// End 3rd level menus
echo '</ul>';
}
echo '</li>';
}
// End 2nd level menus
echo '</ul>';
}
// fin des éléments de premier niveau
echo '</li>';
}
// Ajout des autres éléments?
}
/**
* Generate a strip of buttons.
*
* @param array $button_strip An array with info for displaying the strip
* @param string $direction The direction
* @param array $strip_options Options for the button strip
*/
function template_button_strip($button_strip, $direction = '', $strip_options = array())
{
if (!is_array($strip_options))
$strip_options = array();
// Create the buttons...
$buttons = array();
foreach ($button_strip as $key => $value)
{
// If a "new topic" button is provided, skip it in this first pass.
// It will be added at the end of the strip.
if ( $key == 'new_topic' ) continue;
$buttons = template_button_strip_single_button($key, $value, $buttons);
}
// If a "new topic" button is provided, add it at the end of the strip.
if ( array_key_exists('new_topic', $button_strip) ) {
$key = 'new_topic';
$value = $button_strip[$key];
$buttons = template_button_strip_single_button($key, $value, $buttons);
}
// No buttons? No button strip either.
if (empty($buttons))
return;
echo '
<div class="buttonlist', !empty($direction) ? ' float' . $direction : '', '"', (empty($buttons) ? ' style="display: none;"' : ''), (!empty($strip_options['id']) ? ' id="' . $strip_options['id'] . '"' : ''), '>
', implode('', $buttons), '
</div>';
}
function template_button_strip_single_button($key, $value, $buttons) {
global $context, $txt;
// As of 2.1, the 'test' for each button happens while the array is being generated. The extra 'test' check here is deprecated but kept for backward compatibility (update your mods, folks!)
if (!isset($value['test']) || !empty($context[$value['test']]))
{
// Buttons used to spawn another list of options are handled in a dedicated function.
if (!empty($value['sub_buttons']))
return template_button_strip_single_button_with_sub_buttons($key, $value, $buttons);
if (!isset($value['id']))
$value['id'] = $key;
$button = '
<a class="button button_strip_' . $key . (isset($value['class']) ? ' ' . $value['class'] : '') . '" ' . (!empty($value['url']) ? 'href="' . $value['url'] . '"' : '') . ' ' . (isset($value['custom']) ? ' ' . $value['custom'] : '') . '>'.(!empty($value['icon']) ? '<span class="main_icons '.$value['icon'].'"></span>' : '').'' . $txt[$value['text']] . '</a>';
$buttons[] = $button;
}
return $buttons;
}
function template_button_strip_single_button_with_sub_buttons($key, $value, $buttons) {
global $context, $txt;
if (!isset($value['id']))
$value['id'] = $key;
$button = '
<details>
<summary>
<a class="button button_strip_' . $key . (isset($value['class']) ? ' ' . $value['class'] : '') . '" ' . (!empty($value['url']) ? 'href="' . $value['url'] . '"' : '') . ' ' . (isset($value['custom']) ? ' ' . $value['custom'] : '') . '>'.(!empty($value['icon']) ? '<span class="main_icons '.$value['icon'].'"></span>' : '').'' . $txt[$value['text']] . '</a>
</summary>';
$button .= '
<ul>';
foreach ($value['sub_buttons'] as $element)
{
if (isset($element['test']) && empty($context[$element['test']]))
continue;
$button .= '
<li><a href="' . $element['url'] . '"><strong>' . $txt[$element['text']] . '</strong>';
if (isset($txt[$element['text'] . '_desc']))
$button .= '<br><span>' . $txt[$element['text'] . '_desc'] . '</span>';
$button .= '</a></li>';
}
$button .= '
</ul>
</details>';
$buttons[] = $button;
return $buttons;
}
/**
* Generate a list of quickbuttons.
*
* @param array $list_items An array with info for displaying the strip
* @param string $list_class Used for integration hooks and as a class name
* @param string $output_method The output method. If 'echo', simply displays the buttons, otherwise returns the HTML for them
* @return void|string Returns nothing unless output_method is something other than 'echo'
*/
function template_quickbuttons($list_items, $list_class = null, $output_method = 'echo')
{
global $txt;
// Enable manipulation with hooks
if (!empty($list_class))
call_integration_hook('integrate_' . $list_class . '_quickbuttons', array(&$list_items));
// Make sure the list has at least one shown item
foreach ($list_items as $key => $li)
{
// Is there a sublist, and does it have any shown items
if ($key == 'more')
{
foreach ($li as $subkey => $subli)
if (isset($subli['show']) && !$subli['show'])
unset($list_items[$key][$subkey]);
if (empty($list_items[$key]))
unset($list_items[$key]);
}
// A normal list item
elseif (isset($li['show']) && !$li['show'])
unset($list_items[$key]);
}
// Now check if there are any items left
if (empty($list_items))
return;
// Print the quickbuttons
$output = '
<ul class="quickbuttons' . (!empty($list_class) ? ' quickbuttons_' . $list_class : '') . '">';
// This is used for a list item or a sublist item
$list_item_format = function($li)
{
$html = '
<li' . (!empty($li['class']) ? ' class="' . $li['class'] . '"' : '') . (!empty($li['id']) ? ' id="' . $li['id'] . '"' : '') . (!empty($li['custom']) ? ' ' . $li['custom'] : '') . '>';
if (isset($li['content']))
$html .= $li['content'];
else
$html .= '
<a href="' . (!empty($li['href']) ? $li['href'] : 'javascript:void(0);') . '"' . (!empty($li['javascript']) ? ' ' . $li['javascript'] : '') . '>
' . (!empty($li['icon']) ? '<span class="main_icons ' . $li['icon'] . '"></span>' : '') . (!empty($li['label']) ? $li['label'] : '') . '
</a>';
$html .= '
</li>';
return $html;
};
foreach ($list_items as $key => $li)
{
// Do not include the "quick edit" button.
if ( $li['class'] == 'quick_edit' ) continue;
// Handle the sublist
if ($key == 'more')
{
$output .= '
<li class="post_options">
<a href="javascript:void(0);">' . $txt['post_options'] . '</a>
<ul>';
foreach ($li as $subli)
$output .= $list_item_format($subli);
$output .= '
</ul>
</li>';
}
// Ordinary list item
else
$output .= $list_item_format($li);
}
$output .= '
</ul><!-- .quickbuttons -->';
// There are a few spots where the result needs to be returned
if ($output_method == 'echo')
echo $output;
else
return $output;
}
/**
* The upper part of the maintenance warning box
*/
function template_maint_warning_above()
{
global $txt, $context, $scripturl;
echo '
<div class="errorbox" id="errors">
<dl>
<dt>
<strong id="error_serious">', $txt['forum_in_maintenance'], '</strong>
</dt>
<dd class="error" id="error_list">
', sprintf($txt['maintenance_page'], $scripturl . '?action=admin;area=serversettings;' . $context['session_var'] . '=' . $context['session_id']), '
</dd>
</dl>
</div>';
}
/**
* The lower part of the maintenance warning box.
*/
function template_maint_warning_below()
{
}
/**
* This shows any deferred JavaScript and closes out the HTML
*/
function template_quicksearch()
{
global $txt, $context, $scripturl, $selected;
if ($context['allow_search'])
{
echo '
<form role="search" id="search_form" class="floatright" action="', $scripturl, '?action=search2" method="post" accept-charset="', $context['character_set'], '">
<label for="search_form_input" class="khbb_label">' . $txt['khbb_quick_search'] . '</label>
<input type="search" id="search_form_input" name="search" value="" placeholder="' . $txt['khbb_quick_search'] . '">&nbsp;';
// Using the quick search dropdown?
$selected = !empty($context['current_topic']) ? 'current_topic' : (!empty($context['current_board']) ? 'current_board' : 'all');
echo '
<label for="search_selection" class="khbb_label">' . $txt['mlist_search_filter'] . '</label>
<select id="search_selection" name="search_selection">
<option value="all"', ($selected == 'all' ? ' selected' : ''), '>', $txt['search_entireforum'], ' </option>';
// Can't limit it to a specific topic if we are not in one
if (!empty($context['current_topic']))
echo '
<option value="topic"', ($selected == 'current_topic' ? ' selected' : ''), '>', $txt['search_thistopic'], '</option>';
// Can't limit it to a specific board if we are not in one
if (!empty($context['current_board']))
echo '
<option value="board"', ($selected == 'current_board' ? ' selected' : ''), '>', $txt['search_thisboard'], '</option>';
// Can't search for members if we can't see the memberlist
if (!empty($context['allow_memberlist']))
echo '
<option value="members"', ($selected == 'members' ? ' selected' : ''), '>', $txt['search_members'], ' </option>';
echo '
</select>';
// Search within current topic?
if (!empty($context['current_topic']))
echo '
<input type="hidden" name="sd_topic" value="', $context['current_topic'], '">';
// If we're on a certain board, limit it to this board ;).
elseif (!empty($context['current_board']))
echo '
<input type="hidden" name="sd_brd" value="', $context['current_board'], '">';
echo '
<input type="submit" name="search2" value="', $txt['search'], '" class="button">
<input type="hidden" name="advanced" value="0">
</form>';
}
// Fin recherche rapide
}
?>