Как в файле шаблона своего компонента вывести виджет?

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X

Есть ли метод в ядре системы чтобы вывести какой либо конкретный виджет из файла шаблона компонента?

#1 14 декабря 2023 в 19:51

Есть ли метод в ядре системы чтобы вывести какой либо конкретный виджет из файла шаблона компонента?

Т.е. например: имеется виджет с id=1 установленный и настроенный в позиции pos_1, допустим он в базе числится под bind_id=1

Как его можно вставить в шаблоне стороннего компонента?

… подскажите пожалуйста метод, если кто знает, время скоротать)

#2 14 декабря 2023 в 20:00

 Kreator, вот такой код использовал в одном из проектов года два назад. Может поможет

  1. public function actionRelated() {
  2.  
  3. $bind_id = $this->request->get('bind_id');
  4. $item_id = $this->request->get('item_id');
  5. if (!is_numeric($bind_id) || !is_numeric($item_id)) {
  6. cmsCore::error404();
  7. }
  8.  
  9. $model = new cmsModel();
  10. $widget_array = $model->getItemById('widgets_bind', $bind_id, function($item, $model) {
  11.  
  12. $item['options'] = cmsModel::yamlToArray($item['options']);
  13. $item['groups_view'] = cmsModel::yamlToArray($item['groups_view']);
  14. $item['groups_hide'] = cmsModel::yamlToArray($item['groups_hide']);
  15. $item['languages'] = cmsModel::yamlToArray($item['languages']);
  16. $item['template_layouts'] = cmsModel::yamlToArray($item['template_layouts']);
  17. $item['device_types'] = cmsModel::yamlToArray($item['device_types']);
  18.  
  19. return $item;
  20. });
  21.  
  22. if (!$widget_array) {
  23. cmsCore::error404();
  24. }
  25.  
  26. //чтобы получить больше данных
  27. $oldLimit = $widget_array['options']['limit'];
  28. $widget_array['options']['limit'] = 66;
  29.  
  30. //чтобы не было ошибок
  31. $widget_array['controller'] = 'content';
  32. $widget_array['name'] = 'list';
  33. $widget_array['is_cacheable'] = false;
  34. $widget_array['bind_id'] = $widget_array['id'];
  35.  
  36. //ну и получим данные об открытой записи тк
  37. $ctype_name = $model->getField('content_types', $widget_array['options']['ctype_id'], 'name');
  38. $item = $model->getItemById('con_' . $ctype_name,$item_id);
  39.  
  40. if (!$item) {
  41. cmsCore::error404();
  42. }
  43. $item['ctype_name'] = $ctype_name;
  44.  
  45. cmsModel::cacheResult('current_ctype_item', $item);
  46.  
  47. //подсмотрено в cms_core->runWidget и cms_template->renderWidget
  48. $widget = cmsCore::getWidgetObject($widget_array);
  49. $data = call_user_func_array(array($widget, 'run'), []);
  50.  
  51. //чтобы в list_tiles_news отличить этот запрос
  52. $widget->oldLimit = $oldLimit;
  53.  
  54. if($data === false){
  55. cmsCore::error404();
  56. }
  57.  
  58. $tpl_path = cmsCore::getWidgetPath($widget->name, $widget->controller);
  59. $tpl_file = $this->cms_template->getTemplateFileName($tpl_path . '/' . $widget->getTemplate());
  60.  
  61. $data['widget'] = $widget;
  62. $this->cms_template->processRender($tpl_file, $data);
  63.  
  64.  
  65. }
#3 14 декабря 2023 в 20:11

Вообще категорически плохая идея так делать. Вероятно, изначально подход неверный. Какая начальная задача?

#4 14 декабря 2023 в 20:23

Какая начальная задача?

Fuze

Чтобы использовать уже настроенный интерфейс и данные виджета, как часть готового программного кода при выводе информации.

Добавлено спустя 4 минуты

Вообще категорически плохая идея так делать.

Fuze

Допустим есть виджет Погода: настроенный, уложеный, упакованый, выводится так как надо. Как возможность использовать и выводить его готового.

Лет 5 назад я решал этот вопрос такой функцией:

  1. public function insertPosition($pos){
  2. $template = cmsTemplate::getInstance();
  3. if(!$template->hasWidgetsOn($pos)) {
  4. return '';
  5. }
  6. $template->widgets($pos);
  7. $pos = ob_get_clean();
  8. return $pos;
  9. }

Но тут выводилась вся позиция со всеми виджетами.

А нужно один конкретный ...

Добавлено спустя 1 минуту

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

#5 14 декабря 2023 в 20:42

Виджеты должны размещаться из админки. Но если это цель сделать только для себя, то да, можно и поколхозить. ± принцип показал  Zau4man.

Ну и в целом можно посмотреть как выводятся виджеты в движке, см. runWidget в core.php и сделать аналогично, учитывая вашу задачу.

#6 14 декабря 2023 в 20:45

Спасибо

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.