<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* MaxSite CMS
* (c) http://max-3000.com/
*/
// получение всех мета из ini-файлов
// результат в $all_meta $custom_meta $custom_meta_i
// мета-поля, которые следует здесь отобразить описываются в ini-файле.
$all_meta = ''; // основные + custom/meta.ini
$custom_meta = $custom_meta_i = ''; // custom/my_meta.ini отдельной tab-вкладкой
// получим одним запросом все мета поля
if ($id)
{
$CI->db->select('meta_value, meta_key');
$CI->db->where( array ('meta_id_obj' => $id, 'meta_table' => 'page' ) );
$query = $CI->db->get('meta');
$page_all_meta = array();
foreach ($query->result_array() as $row)
{
$page_all_meta[$row['meta_key']][] = $row['meta_value'];
}
}
else
{
$page_all_meta = array();
}
// pr($page_all_meta);
require_once( getinfo('common_dir') . 'inifile.php' ); // функции для работы с ini-файлом
// получим все данные из ini-файла
$all = mso_get_ini_file( $MSO->config['admin_plugins_dir'] . 'admin_page/meta.ini');
//pr($all);
// можно использовать дефолтный из shared_dir
$meta_def = mso_get_ini_file( getinfo('shared_dir') . 'meta/meta.ini');
$all = array_merge($all, $meta_def);
// meta.ini в template_dir — больше не использовать! — оставил пока как временное решение
// использовать custom/meta.ini — будет вместе с основными мета
if (file_exists(getinfo('template_dir') . 'meta.ini'))
{
$meta_templ = mso_get_ini_file( getinfo('template_dir') . 'meta.ini' );
if ($meta_templ) $all = array_merge($all, $meta_templ);
}
if (file_exists(getinfo('template_dir') . 'custom/meta.ini'))
{
$meta_templ = mso_get_ini_file( getinfo('template_dir') . 'custom/meta.ini' );
if ($meta_templ) $all = array_merge($all, $meta_templ);
}
// pr($all);
$all_meta = all_meta_parse($all, $page_all_meta);
// custom/my_meta.ini — отдельной вкладкой
$custom_meta = array();
if (file_exists(getinfo('template_dir') . 'custom/my_meta.ini'))
{
$meta_templ = mso_get_ini_file( getinfo('template_dir') . 'custom/my_meta.ini' );
if ($meta_templ) $custom_meta = $meta_templ;
}
// для особых случаев
if (file_exists(getinfo('template_dir') . 'custom/my_meta.php'))
require( getinfo('template_dir') . 'custom/my_meta.php' );
$custom_meta = all_meta_parse($custom_meta, $page_all_meta);
// custom_meta может и не быть в текущем шаблоне, поэтому делаем их вывод отдельно в формате tabs
if ($custom_meta)
{
$custom_meta = '<div class="mso-tabs-box custom-meta tabs_bordered">' . $custom_meta . '</div>';
$custom_meta_i = '<li class="mso-tabs-elem i-custom-meta"><span>' . t('Шаблонные') . '</span></li>';
}
// парсинг ini
function all_meta_parse($all, $page_all_meta)
{
$all_meta = '';
// проходимся по всем ini-опциям
// для совместимости используем вместо meta_ options_
foreach ($all as $key=>$row)
{
if ( isset($row['options_key']) )
$options_key = stripslashes(trim($row['options_key']));
else
continue;
if ($options_key == 'tags') continue; // метки отдельно идут
if ( !isset($row['type']))
$type = 'textfield';
else
$type = stripslashes(trim($row['type']));
if (!isset($row['values']))
$values = '';
else
$values = _mso_ini_check_php(stripslashes(htmlspecialchars(trim($row['values']))));
if (!isset($row['description']))
$description = '';
else
$description = _mso_ini_check_php(stripslashes( trim( t($row['description']))));
if (!isset($row['delimer']))
$delimer = '<br>';
else
$delimer = stripslashes($row['delimer']);
if (!isset($row['default']))
$default = '';
else
$default = _mso_ini_check_php(stripslashes(htmlspecialchars(trim($row['default']))));
if (!isset($row['placeholder']))
$placeholder = '';
else
$placeholder = ' placeholder="' . _mso_ini_check_php(stripslashes(htmlspecialchars(trim($row['placeholder'])))) . '"';
// дополнительные атрибуты
$attr = (isset($row['attr'])) ? ' ' . trim($row['attr']) : '';
$options_present = true; // признак, что опция есть в базе
// получаем текущее значение
if (isset($page_all_meta[$options_key])) // есть в мета
{
foreach ($page_all_meta[$options_key] as $val)
{
$value = htmlspecialchars($val);
}
}
else
{
$options_present = false;
$value = $default; // нет значание, поэтому берем дефолт
}
$f = NR;
$name_f = 'f_options[' . $options_key . ']'; // название поля
if ($type == 'textfield')
{
$value = str_replace('_QUOT_', '"', $value);
// в этом типе может быть свой type для input
if ( !isset($row['textfield_type']) )
$textfield_type = 'text';
else
$textfield_type = stripslashes($row['textfield_type']);
$f .= '<input type="' . $textfield_type . '" name="' . $name_f . '" value="' . $value . '"' . $placeholder . $attr . '>' . NR;
}
elseif ($type == 'color')
{
$f .= mso_load_jquery('jscolor.js', getinfo('common_url') . 'jquery/jscolor/');
$f .= '<input type="text" name="' . $name_f . '" value="' . $value . '" class="color"' . $placeholder . '>' . NR;
}
elseif ($type == 'datetime') // пока тестовый вариант
{
// http://xdsoft.net/jqplugins/datetimepicker/
$f .= mso_load_jquery('jquery.datetimepicker.full.min.js', getinfo('common_url') . 'jquery/datetimepicker/');
$id_datetimepicker = md5($name_f);
$f .= '<input type="text" name="' . $name_f . '" value="' . $value . '" id="' . $id_datetimepicker . '"' . $placeholder . '>' . NR;
if (isset($row['datetime_options']))
$datetime_options = $row['datetime_options'];
else
$datetime_options = 'format:"Y-m-d H:i:s", lang:"ru"';
if (isset($row['datetime_locale']))
$datetime_locale = '$.datetimepicker.setLocale("' . trim($row['datetime_locale']) . '");';
else
$datetime_locale = '$.datetimepicker.setLocale("ru");';
$f .= '<script>' . $datetime_locale . '$("#' . $id_datetimepicker . '").datetimepicker({' . $datetime_options . '});</script>';
}
elseif ($type == 'textarea')
{
if (isset($row['rows']))
{
if ($row['rows'] == 'auto')
{
$rr = count(explode("\n", $value));
if ($rr > 20) $rr = 20;
}
else
$rr = (int) $row['rows'];
}
else
{
$rr = count(explode("\n", $value));
if ($rr > 20) $rr = 20;
}
if ($rr < 2) $rr = 2;
$f .= '<textarea rows="' . $rr . '" name="' . $name_f . '"' . $placeholder . $attr . '>'. $value . '</textarea>' . NR;
}
elseif ($type == 'radio')
{
$values = explode('#', $values); // все значения разделены #
if ($values) // есть что-то
{
foreach( $values as $val )
{
$f .= '<label><input type="radio" name="' . $name_f . '" value="' . trim($val) . '"' . _set_checked($value, $val) . '> ' . trim($val) . '</label>' . $delimer . NR;
}
}
}
elseif ($type == 'select')
{
$values = explode('#', $values); // все значения разделены #
if ($values) // есть что-то
{
$f .= '<select name="' . $name_f . '">';
foreach($values as $val)
{
// $val может быть с || val - текст
$val = trim($val);
$val_t = $val;
$ar = explode('||', $val);
if (isset($ar[0])) $val = trim($ar[0]);
if (isset($ar[1])) $val_t = trim($ar[1]);
$f .= NR . '<option value="' . $val . '"' . _set_checked($value, $val, 'selected') . '>' . $val_t . '</option>';
}
$f .= NR . '</select>' . NR;
}
}
elseif ($type == 'checkbox')
{
$f .= '<input type="hidden" value="0" name="' . $name_f . '">';
$f .= '<label><input type="checkbox" value="1" name="' . $name_f . '" ' . _set_checked($value) . '> ' . $key . '</label>' . NR;
}
if ($description) $f .= '<p class="italic">' . t($description) . '</p>';
$key = '<p class="w25 w100-tablet bold">' . t($key) . '</p>';
// $all_meta .= '<div>' . $key . NR . $f . '</div>';
if (isset($row['page_type']))
{
$page_type = stripslashes(trim($row['page_type']));
$all_meta .= '<div class="page_meta_block ' . $page_type . '"><div class="flex flex-wrap pad10-tb">' . $key . NR . '<div class="w75 w100-tablet">' . $f . '</div></div></div>';
}
else
$all_meta .= '<div class="page_meta_block"><div class="flex flex-wrap pad10-tb">' . $key . NR . '<div class="w75 w100-tablet">' . $f . '</div></div></div>';
}
return $all_meta;
}
// вспомогательная функция — ставит checked="checked" или selected
function _set_checked($value, $val = false, $z = 'checked')
{
if ($val === false)
{
if ($value)
return ' ' . $z . '="' . $z . '"';
else
return '';
}
if ($value == trim($val))
return ' ' . $z . '="' . $z . '"';
else
return '';
}
# end of file