Файл: system/controllers/admin/actions/widgets.php
Строк: 92
<?php
class actionAdminWidgets extends cmsAction {
private $is_dynamic_scheme = false;
private $rows_titles_pos = 'left';
public function run($do = false) {
// если нужно, передаем управление другому экшену
if ($do){
$this->runExternalAction('widgets_'.$do, array_slice($this->params, 1));
return;
}
cmsCore::loadAllControllersLanguages();
$controllers = $this->model_widgets->getPagesControllers();
$widgets_list = $this->model_widgets->getAvailableWidgets();
$tpls = cmsCore::getTemplates();
$template_name = $this->request->get('template_name', '');
if(!$template_name || !in_array($template_name, $tpls)){
$template_name = cmsConfig::get('template');
}
cmsCore::loadTemplateLanguage($template_name);
// Шаблоны для показа виджетов
$templates = [];
// Шаблоны, у которых есть динамическая схема
$templates_dynamic_scheme = [];
foreach ($tpls as $tpl) {
$template_path = $this->cms_config->root_path . cmsTemplate::TEMPLATE_BASE_PATH. $tpl;
$manifest = cmsTemplate::getTemplateManifest($template_path);
if($manifest !== null){
if (!empty($manifest['properties']['is_frontend'])) {
$templates[$tpl] = !empty($manifest['title']) ? $manifest['title'] : $tpl;
}
if (!empty($manifest['properties']['is_dynamic_layout'])) {
$templates_dynamic_scheme[$tpl] = !empty($manifest['title']) ? $manifest['title'] : $tpl;
}
continue;
}
if(file_exists($template_path .'/main.tpl.php')){
$templates[$tpl] = $tpl;
}
}
$this->rows_titles_pos = cmsUser::getCookie('rows_titles_pos');
if(!$this->rows_titles_pos){
$this->rows_titles_pos = 'left';
}
$scheme_html = $this->getSchemeHTML($template_name);
// Пошаговое руководство страницы, если есть
$intro_lang = cmsCore::loadLanguage('templates/'.$this->cms_template->name.'/admin/intro/widgets/widgets');
return $this->cms_template->render('widgets', array(
'is_dynamic_scheme' => $this->is_dynamic_scheme,
'rows_titles_pos' => $this->rows_titles_pos,
'intro_lang' => $intro_lang,
'controllers' => $controllers,
'template_name' => $template_name,
'templates' => $templates,
'templates_dynamic_scheme' => $templates_dynamic_scheme,
'widgets_list' => $widgets_list,
'scheme_html' => $scheme_html
));
}
public function getSchemeHTML($name=''){
$template = new cmsTemplate($name);
$template->setContext($this);
$scheme_html = $template->getSchemeHTML();
if (!$scheme_html) {
$scheme_html = $this->getDynamicSchemeHTML($template);
if (!$scheme_html) { return false; }
$this->is_dynamic_scheme = true;
}
preg_match_all('/{(.+)}/ui', $scheme_html, $matches);
if(!empty($matches[1])){
foreach($matches[1] as $block){
list($type, $value) = explode(':', $block);
if ($type=='position') {
$replace_html = '<ul class="position" rel="'.$value.'" id="pos-'.$value.'"></ul>';
}
if ($type=='block') {
if (mb_strpos($value, 'LANG_') === 0){ $value = constant($value); }
$replace_html = '<div class="block"><span>'.$value.'</span></div>';
}
if ($type=='cell') {
if (mb_strpos($value, 'LANG_') === 0){ $value = constant($value); }
$replace_html = '<div class="cell"><span>'.$value.'</span></div>';
}
$scheme_html = str_replace("{{$block}}", $replace_html, $scheme_html);
}
}
return $scheme_html;
}
private function getDynamicSchemeHTML($template) {
$this->cms_template->addTplJSName('admin-scheme');
$rows = $this->model_widgets->getLayoutRows($template->getName());
return $template->getRenderedChild('widgets_scheme', array(
'rows_titles_pos' => $this->rows_titles_pos,
'rows' => $rows
));
}
}