<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) https://max-3000.com/
*
*/
// регистрируем сайдбар
function mso_register_sidebar($sidebar = '1', $title = 'Cайдбар', $options = [])
{
global $MSO;
$MSO->sidebars[$sidebar] = [
'title' => t($title),
'options' => $options
];
}
// вывод сайбрара
function mso_show_sidebar($sidebar = '1', $block_start = '<div class="[CLASS]mso-widget mso-widget_[NUMW] mso-widget_[SB]_[NUMW] mso-[FN] mso-[FN]_[NUMF]">', $block_end = '</div>', $echo = true)
{
global $MSO, $page; // чтобы был доступ к параметрам страниц в условиях виджетов
static $num_widget = []; // номер виджета по порядку в одном сайдбаре
$widgets = mso_get_option('sidebars-' . $sidebar, 'sidebars', []);
$out = '';
if ($widgets) {
foreach ($widgets as $widget) {
$usl_res = 1; // предполагаем, что нет условий, то есть всегда true
$class = ''; // дополнительный класс виджета
// возможно указаны css-классы виджета между @класс1 класс2@
if (preg_match('!\@(.*?)\@!is', $widget, $matches)) $class = trim($matches[1]) . ' ';
// удаляем указанные классы
$widget = trim(preg_replace('!\@(.*?)\@!is', "", $widget));
// удалим возможные двойные пробелы
$widget = str_replace(' ', ' ', $widget);
// имя виджета может содержать номер через пробел
$arr_w = explode(' ', $widget); // в массив
if (sizeof($arr_w) > 1) {
// два или больше элементов
$widget = trim($arr_w[0]); // первый - функция
$num = trim($arr_w[1]); // второй - номер виджета
if (isset($arr_w[2])) {
// есть какое-то php-условие
$u = $arr_w; // поскольку у нас разделитель пробел, то нужно до конца все подбить в одну строчку
$u[0] = $u[1] = '';
$usl = trim(implode(' ', $u));
// текст условия, is_type('home') or is_type('category')
$usl = 'return ( ' . $usl . ' ) ? 1 : 0;';
$usl_res = eval($usl); // выполяем
if ($usl_res === false) $usl_res = 1; // возможно произошла ошибка
}
} else {
$num = 0; // номер виджета не указан, значит 0
}
// номер функции виджета может быть не только числом, но и текстом
// если текст, то нужно его преобразовать в slug, чтобы исключить
// некоректную замену [NUMF] для стилей
$num = mso_slug($num);
// двойной - заменим на один - защита id в форме админки
$num = str_replace('--', '-', $num);
if (function_exists($widget) and $usl_res === 1) {
if ($temp = $widget($num)) {
// выполняем виджет если он пустой, то пропускаем вывод
if (isset($num_widget[$sidebar]['numw'])) //уже есть номер виджета
{
$numw = ++$num_widget[$sidebar]['numw'];
$num_widget[$sidebar]['numw'] = $numw;
} else {
// нет такого = пишем 1
$numw = $num_widget[$sidebar]['numw'] = 1;
}
$st = str_replace('[FN]', $widget, $block_start); // название функции виджета
$st = str_replace('[NUMF]', $num, $st); // номер функции
$st = str_replace('[NUMW]', $numw, $st); //
$st = str_replace('[SB]', $sidebar, $st); // номер сайдбара
$st = str_replace('[CLASS]', $class, $st);
$en = str_replace('[FN]', $widget, $block_end);
$en = str_replace('[NUMF]', $num, $en);
$en = str_replace('[NUMW]', $numw, $en);
$en = str_replace('[SB]', $sidebar, $en);
$out .= $st . $temp . $en;
}
}
}
if ($echo)
echo $out;
else
return $out;
}
}
// регистрируем виджет
function mso_register_widget($widget = false, $title = 'Виджет')
{
global $MSO;
if ($widget) $MSO->widgets[$widget] = t($title);
}
// вспомогательная функция, которая принимает глобальный _POST
// и поле $option. Использовать в _update виджетов
function mso_widget_get_post($option = '')
{
if (isset($_POST[$option]))
return stripslashes($_POST[$option]);
else
return '';
}
// функция для виджетов формирует поля формы для form.fform с необходимой html-разметкой
// каждый вызов функции - одна строчка + если есть $hint - вторая
// $form = mso_widget_create_form('Название', поле формы, 'Подсказка');
function mso_widget_create_form($name = '', $input = '', $hint = '')
{
if ($hint)
$out = '<p><label><span class="name_widget">' . $name . '</span>' . $input . '</label><span class="hint_widget">' . $hint . '</span></p>';
else
$out = '<p><label><span class="name_widget">' . $name . '</span>' . $input . '</label></p>';
return $out;
}
# end of file