<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) https://max-3000.com/
*
*/
// Функция возвращает полный путь к файлу
// если файла нет, то возвращается false
// если второй параметр == false, используется каталог текущего шаблона
// if ($fn = mso_fe('stock/page_out/page-out.php')) require $fn;
function mso_fe($file, $dir = false)
{
if ($dir === false) $dir = getinfo('template_dir');
$file = $dir . $file;
if (file_exists($file) and is_file($file))
return $file;
else
return false;
}
// поиск файла либо в каталоге шаблона, либо в shared-каталоге
// файл указывается относительно каталога шаблона/shared-каталога
// приоритет имеет файл в шаблоне, после в shared
// если файл не найден, то возвращается $default
// иначе полный путь, годный для require
// if ($fn = mso_find_ts_file('type/page_404/page_404.php')) require $fn;
function mso_find_ts_file($fn, $default = false)
{
$fn1 = getinfo('template_dir') . $fn; // путь в шаблоне
$fn2 = getinfo('shared_dir') . $fn; // путь в shared
// если указан хук custom_ts_file, то вначале его обрабатываем
// хук должен вернуть полное имя файла
if (mso_hook_present('custom_ts_file') and $fn3 = mso_hook('custom_ts_file', $fn) and file_exists($fn3)) return $fn3;
elseif (file_exists($fn1)) return $fn1; // если шаблонный
elseif (file_exists($fn2)) return $fn2; // нет, значит shared
else return $default;
}
// Функция возвращает полный путь к файлу, который следует подключить в index.php шаблона
// использовать вместо старого варианта выбора type-файла
// if ($fn = mso_dispatcher()) require $fn;
function mso_dispatcher()
{
global $MSO;
// тип данных
$type = getinfo('type');
// для rss используются отдельное подключение
if (is_feed()) {
// ищем файл в шаблоне или shared
if ($f = mso_find_ts_file('type/feed/' . $type . '.php'))
return $f;
else
return mso_find_ts_file('type/feed/home.php');
}
// в зависимости от типа данных подключаем нужный файл
// на page_404 может быть свой хук. Тогда ничего не подключаем
if (
$type == 'page_404'
and mso_hook_present('custom_page_404')
and mso_hook('custom_page_404')
) {
return false;
} elseif ($type == 'page_404') {
// страница не найдена, формируем по сегменту
$seg = mso_strip(mso_segment(1));
$fn = 'type/' . $seg . '/' . $seg . '.php';
// !!! пробный вариант, который непонятно как сработает !!!
// создаем новый тип по сегменту — это позволит использовать is_type() для этих типов
// если не будетвыявлено ошибок, то оставить (внесено: 2018-11-20 ver. 100.6)
if (mso_find_ts_file($fn)) $MSO->data['type'] = $seg;
} else {
$fn = 'type/' . $type . '/' . $type . '.php';
}
if ($f = mso_find_ts_file($fn))
return $f;
else
return mso_find_ts_file('type/page_404/page_404.php');
}
// возвращает jquery-script
// в $path можно указать http-путь к файлу
function mso_load_jquery($plugin = '', $path = '')
{
global $MSO;
if (!isset($MSO->js['jquery'][$plugin])) {
// еще нет включения этого файла
$MSO->js['jquery'][$plugin] = '1';
if ($plugin) {
// это какой-то плагин
if ($path)
return '<script src="' . $path . $plugin . '"></script>';
else
return '<script src="' . getinfo('common_url') . 'jquery/' . $plugin . '"></script>';
} else {
// это основная библиотека, которая вызывается в секции HEAD
// если есть в шаблоне assets/js/jquery.min.js то подключаем только его
if (mso_fe('assets/js/jquery.min.js'))
$fj = getinfo('template_url') . 'assets/js/jquery.min.js';
else
$fj = getinfo('common_url') . 'jquery/jquery.min.js';
// режим загрузки jQuery
// если head, то грузим как есть
// если это BODY, то прописываем только preload
$mode = mso_get_option('jquery_load', 'general', 'head');
if ($mode == 'head') {
return '<script src="' . $fj . '"></script>';
} elseif ($mode == 'body') {
return '<link rel="preload" href="' . $fj . '" as="script">';
}
}
}
}
// подключаемый type_foreach-файл
// должен находиться в каталоге шаблона /type_foreach/
// либо в /take/ — это второй альтернативный каталог (они работают одновременно)
// каталог take можно переопределить через mso_set_val('type_foreach_alt_dir', 'my_take');
function mso_page_foreach($type_foreach_file = false)
{
global $MSO;
// при первом обращении занесем сюда все файлы из шаблонного type_foreach
// чтобы потом результат считывать из масива, а не по file_exists
static $files = false;
static $files_alt = false;
$MSO->data['type_foreach_file'] = $type_foreach_file; // помещаем в $MSO вызываемый тип
// альтернативный каталог
$alt = mso_get_val('type_foreach_alt_dir', 'take') . '/';
// можно переопределить файлы через type_foreach/_general.php
if (file_exists(getinfo('template_dir') . 'type_foreach/general.php'))
include(getinfo('template_dir') . 'type_foreach/general.php');
// можно поменять type_foreach-файл через хук
$type_foreach_file = mso_hook('type-foreach-file-general', $type_foreach_file);
if ($type_foreach_file) {
if ($files === false) {
// старый вариант с helper('directory')
// $CI = & get_instance();
// $CI->load->helper('directory');
// $files = directory_map(getinfo('template_dir') . 'type_foreach/', true); // только в type_foreach
// $files_alt = directory_map(getinfo('template_dir') . $alt, true);
$files = glob(getinfo('template_dir') . 'type_foreach/' . '*.php');
$files = array_map(function ($a) {
return pathinfo($a, PATHINFO_BASENAME);
}, $files);
$files_alt = glob(getinfo('template_dir') . $alt . '*.php');
$files_alt = array_map(function ($a) {
return pathinfo($a, PATHINFO_BASENAME);
}, $files_alt);
if (!$files) $files = [];
if (!$files_alt) $files_alt = [];
}
$find_file = $type_foreach_file . '.php'; // какой файл ищем
if (in_array($find_file, $files)) {
// есть в type_foreach/
return getinfo('template_dir') . 'type_foreach/' . $find_file;
} elseif (in_array($find_file, $files_alt)) {
// есть в альтернативном каталоге
return getinfo('template_dir') . $alt . $find_file;
} else {
// нет файла
// если есть хук type-foreach-file
if (mso_hook_present('type-foreach-file')) {
// получим его значение
// он должен возвращать либо полный путь к файлу, либо false
if ($out = mso_hook('type-foreach-file', $type_foreach_file))
return $out; // указан путь
else
return false; // вернул false
} else {
// нет хука type-foreach-file
return false;
}
}
}
return false;
}
/**
* Вывод содержимого опции из текстового файла
*
* @param string $component - компонент
* @param string $file - текстовый файл
* @param boolean $quot - выполнять замены для ini-файла
*
* @return string
*/
function mso_get_component_option($component, $file = '_default.txt', $quot = true)
{
$fn = getinfo('template_dir') . 'components/' . $component . '/' . $file;
if (file_exists($fn)) {
$text = file_get_contents($fn);
if ($quot) $text = str_replace('"', '_QUOT_', $text);
return $text;
}
return '';
}
/**
* Получить их ini-файла все секции и преобразовать их в массив [type][key]=default
* подходящий для mso_get_option(... $default_values)
*
* используется для того, чтобы передать в mso_get_option дефолтные значения ключей прямо из ini-файла
*
* $optionsINI = mso_get_defoptions_from_ini(dirname(__DIR__) . '/options.ini');
* $b1 = mso_get_option($component . '-home_block1', getinfo('template'), '', $optionsINI);
*/
function mso_get_defoptions_from_ini($file)
{
if (!file_exists($file)) return false;
$arrayIni = file_get_contents($file);
if ($arrayIni) {
ob_start();
eval('?>' . $arrayIni . '<?php ');
$arrayIni = ob_get_contents();
ob_end_clean();
$arrayIni = parse_ini_string($arrayIni, true);
}
if (!$arrayIni) return false;
$arrayOut = [];
// для замены %CURRENTDIR% в options_key
$CURRENTDIR = basename(dirname($file));
// формируем массив из options_type[ options_key ] = default
foreach ($arrayIni as $val) {
$type = $val['options_type'] ?? 'general';
if ($type == '%TEMPLATE%') $type = getinfo('template');
$default = $val['default'] ?? '';
$default = str_replace('_QUOT_', '"', $default);
$default = str_replace('`', '"', $default);
$default = str_replace('_NBSP_', ' ', $default);
$default = str_replace('_NR_', "\n", $default);
$val['options_key'] = str_replace('%CURRENTDIR%', $CURRENTDIR, $val['options_key']);
$arrayOut[$type][$val['options_key']] = $default;
}
return $arrayOut;
}
# end of file