Виджет в шаблон?

Можно ли вставить виджет прямо в шаблон кодом

#1 27 июня 2018 в 19:08
Если кто делал или знает, как?
#2 27 июня 2018 в 20:12
  1. <?php $this->widgets('top', false, 'wrapper_plain'); ?>
Это код из шаблона вообще то).
#3 27 июня 2018 в 20:23


Это код из шаблона вообще то).

Lora
Спасибо😊 тупанул чутка
#4 28 июня 2018 в 12:45
Я имел ввиду в шаблон для отдельной страницы. На главной понятно в шаблон ставишь работает. Попробовал вставить в шаблон отдельной страницы не пашет😥 Может что не так делаю?
#5 28 июня 2018 в 14:39

Попробовал вставить в шаблон отдельной страницы не пашет Может что не так делаю?

Рачей
Как минимум, делаете "не так" то, что не приводите конкретного кода своего варианта (что куда вставляете).

В Двойке нет возможности находу добавлять позиции виджетов на страницу. Зато есть возможность указать другой "скелет" (файл основного шаблона) с помощью метода cmsTemplate->setLayout($layout)/
Пример использования этого метода можете посмотреть при подключении шаблона Админки в /system/controllers/admin/frontend.php

Если у Вас шаблон main.tpl.php очень навороченный, то копировать его несколько раз для разных страниц, а потом поддерживать всё это в актуальном виде может оказаться затруднительно. Тогда проще добавить все нужные позиции виджета сразу в main.tpl.php.
#6 28 июня 2018 в 15:04
мне нужно вставить виджет в отдельную страницу контента… то есть не в общий шаблон, а в страницу для одного вида контента.
совет вставить <?php $this->widgets('top', false, 'wrapper_plain'); ?> не дал результат. если это вставить в общий шаблон, работает… я в схеме вынес в низ эту позицию шаблона что бы туда виджет можно было накинуть… на главной работает в теле шаблона одного вида контента нет… вот задача, как его туда пристроить!? я могу там вывести по схеме общего шаблона, но мне надо вывести между картинкой (превью) и текстом… через шаблон как таковой не получится… надо как-то в тело шаблона вкроить
#7 28 июня 2018 в 15:19
#8 28 июня 2018 в 15:23


тыц

шэльдэ бердэ бельдэ

спасибо! то что надо
#9 28 июня 2018 в 16:07

<?php $this->widgets('top', false, 'wrapper_plain'); ?> не дал результат

Рачей
Всё правильно. Виджеты обрабатываются только один раз после того, как готовится страница контента. Это сделано для того, чтобы виджеты могли работать с данными, полученными от контроллера, обрабатывающего текущую страницу сайта. Чтобы это изменить, нужно переделать подготовку и вывод виджетов, что довольно сложно.

Из готовых решений я видел Поле — позиция для виджетов. Как оно работает и подойдёт ли Вам — не знаю. Минусы этого решения его автор шэльдэ бердэ бельдэ честно описал в своём посте.
Насколько я понимаю, без правок в ядре такое решение будет дважды обрабатывать (но не выводить) не только один этот виджет, а вообще все виджеты страницы, что приводит к лишним тормозам. А если таким образом на странице выводится несколько полей с виджетами, то, видимо, все виджеты будут пересчитываться многократно.

Для себя я нашёл такой, может не сильно красивый, но рабочий вариант.
1. Как и в поле от шэльдэ бердэ бельдэ создал в схеме scheme.html новую позицию, чтобы можно было размещать туда виджеты в Админке:
  1. {position:main-body-top}
2. Добавил в метод cmsCore->runWidgets() возможность вывода только виджетов в указанной позиции:
  1. /**
  2.   * Запускает все виджеты, привязанные к текущей странице
  3.   * или виджеты в указанной позиции
  4.   * @param string $position Имя позиции для обработки
  5.   */
  6. // >> WebMan: Обработка отдельной позиции
  7. public function runWidgets($position = ''){
  8. // << WebMan
  9.  
  10. $controllers_without_widgets = cmsConfig::get('controllers_without_widgets');
  11.  
  12. if ($controllers_without_widgets && in_array($this->controller, $controllers_without_widgets)) { return; }
  13.  
  14. $matched_pages = $this->loadMatchedPages()->getMatchedPages();
  15. if (!$matched_pages) { return; }
  16.  
  17. $template = cmsTemplate::getInstance();
  18.  
  19. $widgets_list = cmsCore::getModel('widgets')->getWidgetsForPages(array_keys($matched_pages), $template->getName());
  20.  
  21. if (is_array($widgets_list)){
  22.  
  23. $device_type = cmsRequest::getDeviceType();
  24. $layout = $template->getLayout();
  25. $user = cmsUser::getInstance();
  26.  
  27. if($user->is_admin){
  28. $template->addJS('templates/default/js/widgets.js');
  29. }
  30.  
  31. foreach ($widgets_list as $widget){
  32.  
  33. // не выводим виджеты контроллеров, которые отключены
  34. if(!empty($widget['controller']) && !cmsController::enabled($widget['controller'])){
  35. continue;
  36. }
  37.  
  38. // проверяем доступ для виджетов
  39. if (!$user->isInGroups($widget['groups_view'])) { continue; }
  40. // >> WebMan: Включение работы запретов доступа виджета и для админа тоже
  41. // if (!empty($widget['groups_hide']) && $user->isInGroups($widget['groups_hide']) && !$user->is_admin) {
  42. if (!empty($widget['groups_hide']) && $user->isInGroups($widget['groups_hide'])) {
  43. // << WebMan
  44. continue;
  45. }
  46.  
  47. // проверяем для каких устройств показывать
  48. if($widget['device_types'] && !in_array($device_type, $widget['device_types'])){
  49. continue;
  50. }
  51.  
  52. // проверяем для каких макетов показывать
  53. if($widget['template_layouts'] && !in_array($layout, $widget['template_layouts'])){
  54. continue;
  55. }
  56.  
  57. cmsDebugging::pointStart('widgets');
  58.  
  59. // >> WebMan: Обработка отдельной позиции
  60. if (!$position || $widget['position'] == $position) { $this->runWidget($widget); }
  61. // << WebMan
  62.  
  63. cmsDebugging::pointProcess('widgets', array(
  64. 'data' => $widget['title'].' => /system/'.cmsCore::getWidgetPath($widget['name'], $widget['controller']).'/widget.php'
  65. ), 0);
  66.  
  67. }
  68. }
  69.  
  70. }
Комментариями // >> WebMan и // << WebMan я выделил все свои изменения.

3. В шаблоне записи (или любом другом шаблоне) прописываю код вывода виджетов в желаемой позиции, что-то типа такого:
  1. <?php cmsCore::getInstance()->runWidgets('main-body-top'); ?>
  2. <div class="widget_ajax_wrap" id="widget_pos_main-body-top"><?php $this->widgets('main-body-top'); ?></div>
  3. <?php unset($this->widgets); ?>
Это решение, возможно, менее универсально, чем поле для вывода виджета, но имеет большой плюс: виджеты страницы, кроме тех, которые выводятся в этой позиции, просчитываются только один раз.
#10 28 июня 2018 в 17:35


Это решение, возможно, менее универсально, чем поле для вывода виджета, но имеет большой плюс: виджеты страницы, кроме тех, которые выводятся в этой позиции, просчитываются только один раз.

WebMan
это правильнее
#11 20 августа 2018 в 13:18
Спасибо!… то что надо.

Может кому пригодится визуальный пример (см. под спойлером)


#12 21 августа 2018 в 09:31
Спасибо за наглядность, vadimilin.
З.Ы. Спрячьте свою почту в профиле, а то спам-боты замучают.
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.