[DOCS] Как сменить шаблон на другой и активировать опции другого шаблона?

#1 9 ноября 2019 в 21:27
$template = cmsTemplate::getInstance();

Назначаем другой шаблон вместо текущего:
  1. $template->setName('template');
  2. $template->setInheritNames($template->getInheritTemplates());
Еще это:
  1. $template->getOptions();
Тоже нужно вроде, подгружаются языковые файлы шаблона… и… нет, опции шаблона не подгрузились.
Как сделать корректную смену шаблона чтобы и опции подгрузились?
А то и шаблон сменился и он загружается, но опции остались от шаблона до смены.

Если в контроллере template подправить protected $options; на public $options; и затем у себя ниже сделать:
  1. $template->options = $template->getOptions();
Но тут явно не правильный ход.
Хотя я ждал что после вызова getOptions() опции будут вызваны.

Где я логику потерял? Есть решение?
#2 10 ноября 2019 в 15:20
Попробуйте
  1. $template->loadOptions();
Или вообще получите опции из yml файла
  1. $options_file = $this->site_config->root_path . "system/config/theme_{$template->name}.yml";
  2. if (!is_readable($options_file)){ return array(); }
  3. $options_yaml = file_get_contents($options_file);
  4. $options = cmsModel::yamlToArray($options_yaml);
#3 10 ноября 2019 в 15:35
Evanescence
Да, именно так они и получаются.
и $template->loadOptions(); достаточно для того чтобы получить их из файла.
Но при просмотре: dump($template); мы имеем предыдущие опции.
А вот переписать из в protected $options можно только если сделать public
#4 10 ноября 2019 в 18:10

Как сменить шаблон на другой и активировать опции другого шаблона?

Kreator
В хуке, до первой инициализации cmsTemplate::getInstance() сменить имя шаблона в объекте конфигурации. Максимально правильно — только так. Распространится это на всю работу движка.

Хотя я ждал что после вызова getOptions() опции будут вызваны.

Kreator
Так они и вызвались, метод отдаёт именно их. get = получить, а не установить в свойство $options, где по прежнему старые опции.

Если надо например только в контроллере/экшене вывести в определённом шаблоне, то не вижу проблем.
  1.  
  2. $template = new cmsTemplate('имя шаблона');
  3. // если это всё в контроллере или экшене, надо установить контекст
  4. $template->setContext($this);
  5.  
После чего $template соответственно нужно использовать, а не cmsTemplate::getInstance().
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.