Можно ли вставить виджет прямо в шаблон кодом
<?php $this->widgets('top', false, 'wrapper_plain'); ?>
Спасибо😊 тупанул чутка
Это код из шаблона вообще то).
Как минимум, делаете "не так" то, что не приводите конкретного кода своего варианта (что куда вставляете).Попробовал вставить в шаблон отдельной страницы не пашет Может что не так делаю?
В Двойке нет возможности находу добавлять позиции виджетов на страницу. Зато есть возможность указать другой "скелет" (файл основного шаблона) с помощью метода cmsTemplate->setLayout($layout)/
Пример использования этого метода можете посмотреть при подключении шаблона Админки в /system/controllers/admin/frontend.php
Если у Вас шаблон main.tpl.php очень навороченный, то копировать его несколько раз для разных страниц, а потом поддерживать всё это в актуальном виде может оказаться затруднительно. Тогда проще добавить все нужные позиции виджета сразу в main.tpl.php.
совет вставить <?php $this->widgets('top', false, 'wrapper_plain'); ?> не дал результат. если это вставить в общий шаблон, работает… я в схеме вынес в низ эту позицию шаблона что бы туда виджет можно было накинуть… на главной работает в теле шаблона одного вида контента нет… вот задача, как его туда пристроить!? я могу там вывести по схеме общего шаблона, но мне надо вывести между картинкой (превью) и текстом… через шаблон как таковой не получится… надо как-то в тело шаблона вкроить
Всё правильно. Виджеты обрабатываются только один раз после того, как готовится страница контента. Это сделано для того, чтобы виджеты могли работать с данными, полученными от контроллера, обрабатывающего текущую страницу сайта. Чтобы это изменить, нужно переделать подготовку и вывод виджетов, что довольно сложно.<?php $this->widgets('top', false, 'wrapper_plain'); ?> не дал результат
Из готовых решений я видел Поле — позиция для виджетов. Как оно работает и подойдёт ли Вам — не знаю. Минусы этого решения его автор шэльдэ бердэ бельдэ честно описал в своём посте.
Насколько я понимаю, без правок в ядре такое решение будет дважды обрабатывать (но не выводить) не только один этот виджет, а вообще все виджеты страницы, что приводит к лишним тормозам. А если таким образом на странице выводится несколько полей с виджетами, то, видимо, все виджеты будут пересчитываться многократно.
Для себя я нашёл такой, может не сильно красивый, но рабочий вариант.
1. Как и в поле от шэльдэ бердэ бельдэ создал в схеме scheme.html новую позицию, чтобы можно было размещать туда виджеты в Админке:
{position:main-body-top}
/** * Запускает все виджеты, привязанные к текущей странице * или виджеты в указанной позиции * @param string $position Имя позиции для обработки */ // >> WebMan: Обработка отдельной позиции public function runWidgets($position = ''){ // << WebMan $controllers_without_widgets = cmsConfig::get('controllers_without_widgets'); if ($controllers_without_widgets && in_array($this->controller, $controllers_without_widgets)) { return; } $matched_pages = $this->loadMatchedPages()->getMatchedPages(); if (!$matched_pages) { return; } $template = cmsTemplate::getInstance(); $widgets_list = cmsCore::getModel('widgets')->getWidgetsForPages(array_keys($matched_pages), $template->getName()); $device_type = cmsRequest::getDeviceType(); $layout = $template->getLayout(); $user = cmsUser::getInstance(); if($user->is_admin){ $template->addJS('templates/default/js/widgets.js'); } foreach ($widgets_list as $widget){ // не выводим виджеты контроллеров, которые отключены continue; } // проверяем доступ для виджетов if (!$user->isInGroups($widget['groups_view'])) { continue; } // >> WebMan: Включение работы запретов доступа виджета и для админа тоже // if (!empty($widget['groups_hide']) && $user->isInGroups($widget['groups_hide']) && !$user->is_admin) { // << WebMan continue; } // проверяем для каких устройств показывать continue; } // проверяем для каких макетов показывать continue; } cmsDebugging::pointStart('widgets'); // >> WebMan: Обработка отдельной позиции if (!$position || $widget['position'] == $position) { $this->runWidget($widget); } // << WebMan 'data' => $widget['title'].' => /system/'.cmsCore::getWidgetPath($widget['name'], $widget['controller']).'/widget.php' ), 0); } } }
3. В шаблоне записи (или любом другом шаблоне) прописываю код вывода виджетов в желаемой позиции, что-то типа такого:
<?php cmsCore::getInstance()->runWidgets('main-body-top'); ?> <div class="widget_ajax_wrap" id="widget_pos_main-body-top"><?php $this->widgets('main-body-top'); ?></div>
это правильнее
Это решение, возможно, менее универсально, чем поле для вывода виджета, но имеет большой плюс: виджеты страницы, кроме тех, которые выводятся в этой позиции, просчитываются только один раз.
Может кому пригодится визуальный пример (см. под спойлером)
З.Ы. Спрячьте свою почту в профиле, а то спам-боты замучают.