You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

182 lines
8.8 KiB

<?php
// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
//
// All Rights Reserved. See copyright.txt for details and a complete list of authors.
// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
// $Id$
/**
* Smarty plugin
* @package Smarty
* @subpackage plugins
*
* \brief smarty_block_tabs : add tabs to a template
*
* params: name (optional but unique per page if set)
* params: toggle=y on n default
*
* usage:
* \code
* {tabset name='tabs' skipsingle=1}
* {tab name='tab1'}tab content{/tab}
* {tab name='tab2'}tab content{/tab}
* {tab name='tab3'}tab content{/tab}
* {/tabset}
* \endcode
*/
function smarty_block_tabset($params, $content, $smarty, &$repeat)
{
global $prefs, $smarty_tabset_name, $smarty_tabset, $smarty_tabset_i_tab, $cookietab, $tabset_index;
if ($smarty->getTemplateVars('print_page') == 'y' || $prefs['layout_tabs_optional'] === 'n') {
$params['toggle'] = 'n';
}
if ($repeat) {
// opening
if (! is_array($smarty_tabset)) {
$smarty_tabset = [];
}
$tabset_index = count($smarty_tabset) + 1;
$smarty_tabset_name = getTabsetName($params, $tabset_index);
$smarty_tabset[$tabset_index] = [ 'name' => $smarty_tabset_name, 'tabs' => []];
if (! isset($smarty_tabset_i_tab)) {
$smarty_tabset_i_tab = 1;
}
if (! isset($cookietab) || $tabset_index > 1) {
$cookietab = getCookie($smarty_tabset_name, 'tabs', 1);
}
// work out cookie value if there
if (isset($_REQUEST['cookietab']) && $tabset_index) { // overrides cookie if added to request as in tiki-admin.php?page=look&cookietab=6
$cookietab = empty($_REQUEST['cookietab']) ? 1 : $_REQUEST['cookietab'];
setCookieSection($smarty_tabset_name, $cookietab, 'tabs'); // too late to set it here as output has started
}
// If the tabset specifies the tab, override any kind of memory but only if not doing "no tabs" mode
if (isset($params['cookietab']) && $cookietab !== 'n') {
$cookietab = $params['cookietab'];
}
$smarty_tabset_i_tab = 1;
return;
} else {
$content = trim($content);
if (empty($content)) {
return '';
}
if (! empty($params['skipsingle']) && count($smarty_tabset[$tabset_index]['tabs']) == 1) {
return $content;
}
$ret = '';
$notabs = '';
//closing
if ($prefs['feature_tabs'] == 'y') {
if (empty($params['toggle']) || $params['toggle'] != 'n') {
$smarty->loadPlugin('smarty_function_button');
if ($cookietab == 'n') {
$button_params['_text'] = tra('Tab View');
} else {
$button_params['_text'] = tra('No Tabs');
}
$button_params['_size'] = 'mini';
$button_params['_auto_args'] = '*';
$button_params['_onclick'] = "setCookie('$smarty_tabset_name','" . ($cookietab == 'n' ? 1 : 'n' ) . "', 'tabs') ;";
$button_params['_class'] = 'btn-sm btn-secondary';
$notabs = smarty_function_button($button_params, $smarty);
$notabs = "<div class='float-end'>$notabs</div>";
$content_class = '';
} else {
$content_class = ' full_width'; // no no-tabs button
}
} else {
return $content;
}
if ($cookietab == 'n') {
return $ret . $notabs . $content;
}
$smarty_tabset_name = getTabsetName($params, $tabset_index);
if (isset($params['params']['direction']) && $params['params']['direction'] == 'vertical') {
$count = 1;
$ret .= '<div class="d-flex align-items-start">
<div class="nav flex-column nav-pills me-3" id="nav-' . $smarty_tabset_name . '" role="tablist" aria-orientation="vertical">' . $notabs . '<span style="height:5px;">&nbsp;</span>';
foreach ($smarty_tabset[$tabset_index]['tabs'] as $value) {
$ret .= '<a class="nav-link" id="v-pills-' . $value['id'] . '-tab" data-bs-toggle="tab" href="#v-pills-' . $value['id'] . '" role="tab" aria-controls="v-pills-' . $value['id'] . '" >' . $value['label'] . '</a>';
++$count;
}
$ret .= "</div>";
$tabset_index--;
$ret .= '<div class="tab-content" id="v-pills-' . $smarty_tabset_name . '">' . $content . '</div>
</div>';
//add styles
applyStyles($params, $smarty_tabset_name);
} else {
$ret .= '<div class="clearfix tabs" data-name="' . $smarty_tabset_name . '">' . $notabs;
$count = 1;
$ret .= '<ul class="nav nav-tabs" id="nav-' . $smarty_tabset_name . '">';
foreach ($smarty_tabset[$tabset_index]['tabs'] as $value) {
$ret .= '<li class="nav-item"><a class="nav-link ' . $value['active'] . '" href="#' . $value['id'] . '" data-bs-toggle="tab">' . $value['label'] . '</a></li>';
++$count;
}
$ret .= '</ul>';
$ret .= "</div>";
$tabset_index--;
$ret .= '<div class="tab-content" id="v-pills-' . $smarty_tabset_name . '">' . $content . '</div>';
// add styles
applyStyles($params, $smarty_tabset_name);
}
return $ret;
}
}
/**
* @param $params
* @param $tabset_index
* @return array
*/
function getTabsetName($params, $tabset_index)
{
if (! empty($params['name'])) {
$smarty_tabset_name = $params['name']; // names have to be unique
} else {
$short_name = str_replace(['tiki-', '.php'], '', basename($_SERVER['SCRIPT_NAME']));
$smarty_tabset_name = '_' . $short_name . $tabset_index;
}
$smarty_tabset_name = TikiLib::remove_non_word_characters_and_accents($smarty_tabset_name);
return $smarty_tabset_name;
}
function applyStyles($params, $smarty_tabset_name)
{
$headerlib = TikiLib::lib('header');
$panels = '#v-pills-' . $smarty_tabset_name;
$tabs = '#nav-' . $smarty_tabset_name . ' .nav-link';
$style = '';
$style .= ! empty($params['params']['tabborderstyle']) ? $tabs . '{border-style:' . $params['params']['tabborderstyle'] . ';} ' : '';
$style .= ! empty($params['params']['tabborderwidth']) ? $tabs . '{border-width:' . $params['params']['tabborderwidth'] . 'px;} ' : '';
$style .= ! empty($params['params']['tabbordercolor']) ? $tabs . '{border-color:' . $params['params']['tabbordercolor'] . ';} ' : '';
$style .= ! empty($params['params']['tabfontstyle']) ? $tabs . '{font-style:' . $params['params']['tabfontstyle'] . ';} ' : '';
$style .= ! empty($params['params']['tabfontweight']) ? $tabs . '{font-weight:' . $params['params']['tabfontweight'] . ';} ' : '';
$style .= ! empty($params['params']['tabfontsize']) ? $tabs . '{font-size:' . $params['params']['tabfontsize'] . 'px;} ' : '';
$style .= ! empty($params['params']['tabtextcolor']) ? $tabs . '{color:' . $params['params']['tabtextcolor'] . ';} ' : '';
$style .= ! empty($params['params']['tabactivetextcolor']) ? $tabs . '.active {color:' . $params['params']['tabactivetextcolor'] . ';} ' : '';
$style .= ! empty($params['params']['tabbgcolor']) ? $tabs . '{background-color:' . $params['params']['tabbgcolor'] . ';} ' : '';
$style .= ! empty($params['params']['tabactivebgcolor']) ? $tabs . '.active {background:' . $params['params']['tabactivebgcolor'] . ';} ' : '';
$style .= ! empty($params['params']['panelbgcolor']) ? $panels . '{background-color:' . $params['params']['panelbgcolor'] . ';} ' : '';
$style .= ! empty($params['params']['paneltextcolor']) ? $panels . '{color:' . $params['params']['paneltextcolor'] . ';} ' : '';
$style .= ! empty($params['params']['paneltextstyle']) ? $panels . '{font-style:' . $params['params']['paneltextstyle'] . ';} ' : '';
$style .= ! empty($params['params']['panelfontweight']) ? $panels . '{font-weight:' . $params['params']['panelfontweight'] . ';} ' : '';
$style .= ! empty($params['params']['panelfontsize']) ? $panels . '{font-size:' . $params['params']['panelfontsize'] . 'px;} ' : '';
$style .= ! empty($params['params']['panelborderstyle']) ? $panels . '{border-style:' . $params['params']['panelborderstyle'] . ';} ' : '';
$style .= ! empty($params['params']['panelborderwidth']) ? $panels . '{border-width:' . $params['params']['panelborderwidth'] . 'px;} ' : '';
$style .= ! empty($params['params']['panelbordercolor']) ? $panels . '{border-color:' . $params['params']['panelbordercolor'] . ';} ' : '';
$headerlib->add_css($style);
}