Как сделать | Верстка

InstantCMS 2.X
#1 7 апреля 2017 в 20:56
Всем привет. Столкнулся с маленькой проблемкой верстки, может ваш свежий взгляд на ситуацию направит меня в нужном направлении.
Имеем два файла в шаблоне отвечающие за вывод контента и сайдбара(то что меня интересует):
— main.tpl.php (отвечает за вывод всего, поточнее отдельно сайдбар(блок В) и отдельно массив в котором выводятся блок А и Б)
— default_item.tpl.php (выводит только блок А и Б)

В первом выводятся сайдбар и массив выводящий второй файл, т.е. саму статью, и тут выскакивает моя проблема, хочу заверстать так как на примере, т.е. сайбдар и контент должны быть в одном контейнере, а фотография с заголовком и прочими нужными полями в другом.
Есть идеи?
Один из вариантов, вывести блок А в main.tpl.php, тем самым заверстав оставшиеся блоки Б и В без проблем. Возможно ли это?
Или вывести сайдбар в самом default_item.tpl.php, что, конечно же, сильно предпочтительнее, или и вовсе тут выводить свои виджетики отдельно от сайдбара, последнего просто скрыть в этом разделе.
Дописываю текст и понимаю в каком направлении копать — помогите вывести отдельно виджеты в самом default_item.tpl.php
Прикрепленный файл
howto_btfb9.jpg 78 Кб
#2 7 апреля 2017 в 22:15

помогите вывести отдельно виджеты в самом default_item.tpl.php

Василич
  1. <?php
  2. cmsCore::getInstance()->runWidgets();
  3. $this->widgets('position');
  4. unset($this->widgets);
  5. ?>
position — это имя позиции (в файле main.tpl.php не должно быть такой позиции для виджетов, иначе будут дублироваться); не забудьте позицию дописать в scheme.html
#3 8 апреля 2017 в 01:10
Вариант DK рабочий. Только есть одна проблема — функция runWidgets() будет вызываться два раза, а значит все виджеты будут тоже пересчитываться дважды. Это тормозит сайт и может создать проблемы с другими виджетами, если они что-то считают и пишут в БД, например.

Я делал хак ядра, чтобы минимизировать тормоза и убрать проблемы с остальными виджетами:
Меняем функцию runWidgets() в \system\core\core.php и добавляем опциональный параметр с именем позиции:
  1. /**
  2.   * Запускает все виджеты, привязанные к текущей странице
  3.   * или виджеты в указанной позиции
  4.   * @param string $position Имя позиции для обработки
  5.   */
  6. // >> <WebMan> - Обработка отдельной позиции
  7. public function runWidgets($position = ''){
  8. // << </WebMan> - Обработка отдельной позиции
  9.  
  10. // в админке нам виджеты не нужны
  11. if ($this->controller == 'admin') { return; }
  12.  
  13. $widgets_model = cmsCore::getModel('widgets');
  14. $pages = $widgets_model->getPages();
  15.  
  16. $matched_pages = $this->detectMatchedWidgetPages($pages);
  17.  
  18. if (!is_array($matched_pages)) { return; }
  19. if (sizeof($matched_pages)==0) { return; }
  20.  
  21. $widgets_list = $widgets_model->getWidgetsForPages($matched_pages, cmsTemplate::getInstance()->getName());
  22.  
  23. if (is_array($widgets_list)){
  24. foreach ($widgets_list as $widget){
  25.  
  26. if(!empty($widget['controller']) && !cmsController::enabled($widget['controller'])){
  27. continue;
  28. }
  29.  
  30. // >> <WebMan> - Обработка отдельной позиции
  31. if (!$position || $widget['position'] == $position) { $this->runWidget($widget); }
  32. // << </WebMan> - Обработка отдельной позиции
  33. }
  34. }
  35.  
  36. }
Это код для 2.7.1. Для 2.7.2 я ещё не смотрел. Там функция изменилась, нужно будет её откорректировать по тому же принципу. Изменённые мной строки выделены комментариями.

Вызов делаем по примеру DK, но с указанием позиции виджета runWidgets('position'):
  1. <?php
  2. cmsCore::getInstance()->runWidgets('position');
  3. $this->widgets('position');
  4. unset($this->widgets);
  5. ?>
Этот хак не является оптимальным решением и не может быть включён "в коробку". Но при крайней необходимости позволяет вывести виджеты в любом месте шаблона.
#4 8 апреля 2017 в 09:40
  1. [полез обнимать вот этих вот двоих]
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.