Как получить все виджеты на определенной позиции?

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

Как получить все виджеты на определенной позиции?

#1 15 июля 2019 в 12:15
Уважаемые коллеги, добрый день!
Подскажите, пожалуйста, можно ли как-то просто получить в коде все виджеты на определенной позиции?
В классе cmsTemplate есть открытый метод public function hasWidgetsOn($position) и защищенная переменная protected $widgets = array(), а мне бы надо что-то типа 'getWidgetsOn($position)'...
Или необходимо писать все самому, обращаясь к модели widgets?
#2 15 июля 2019 в 20:17
Пока решил доступ к свойству widgets через ReflectionClass. Может, кому пригодится.
  1. $template = cmsTemplate::getInstance();
  2. $reflection = new ReflectionClass($template);
  3. $property = $reflection->getProperty('widgets');
  4. $property->setAccessible(true);
  5. $prop = $property->getValue($template);
Но буду признателен за более элегантное решение.
#3 15 июля 2019 в 20:26


Пока решил доступ к свойству widgets через ReflectionClass. Может, кому пригодится.

  1. $template = cmsTemplate::getInstance();
  2. $reflection = new ReflectionClass($template);
  3. $property = $reflection->getProperty('widgets');
  4. $property->setAccessible(true);
  5. $prop = $property->getValue($template);
Но буду признателен за более элегантное решение.

@lelik1973

а что мешает получить через ->widgets($position) ???
#4 15 июля 2019 в 20:27
Вам нужны все виджеты из нужной позиции или только на данной странице все виджеты нужной позиции?
#5 15 июля 2019 в 20:30


Вам нужны все виджеты из нужной позиции или только на данной странице все виджеты нужной позиции?

Loadырь

На данной странице все виджеты нужной позиции
#6 15 июля 2019 в 20:35
Мда… вроде написал
#7 15 июля 2019 в 20:36



Пока решил доступ к свойству widgets через ReflectionClass. Может, кому пригодится.

  1. $template = cmsTemplate::getInstance();
  2. $reflection = new ReflectionClass($template);
  3. $property = $reflection->getProperty('widgets');
  4. $property->setAccessible(true);
  5. $prop = $property->getValue($template);
Но буду признателен за более элегантное решение.

@lelik1973

а что мешает получить через ->widgets($position) ???

mr.KEVASC

widgets($position выводит виджеты. Мне же необходимо получить объекты (или массивы) для анализа и допобработки
#8 15 июля 2019 в 20:44




Пока решил доступ к свойству widgets через ReflectionClass. Может, кому пригодится.

  1. $template = cmsTemplate::getInstance();
  2. $reflection = new ReflectionClass($template);
  3. $property = $reflection->getProperty('widgets');
  4. $property->setAccessible(true);
  5. $prop = $property->getValue($template);
Но буду признателен за более элегантное решение.

@lelik1973

а что мешает получить через ->widgets($position) ???

mr.KEVASC

widgets($position выводит виджеты. Мне же необходимо получить объекты (или массивы) для анализа и допобработки

@lelik1973

пример того, что необходимо получить на выходе. какой именно массив и обьект, что там должно быть и т.д.
#9 15 июля 2019 в 20:58

Но буду признателен за более элегантное решение.

@lelik1973
более элегантного решения не видно.
#10 15 июля 2019 в 20:59


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

mr.KEVASC

Я пишу сервисный класс для своей темы (шаблона), в котором реализуется некоторая логика в зависимости от того, какие виджеты выводятся на текущей странице в разных позициях. Методы этого класса вызываются в main.tpl.php. Идеально для меня получить массив экземпляров классов cmsWidgets. Но массив, как он представлен в свойстве widgets тоже сойдет. Просто это для меня дополнительные накладные расходы, поскольку мне необходимо получить опции каждого виджета и по идентификатору биндинга приходится их тащить из базы через вызовы метода модели getWidgetBinding
#11 15 июля 2019 в 21:06


более элегантного решения не видно.

Loadырь

Я честно говоря тоже так подумал после анализа кода. При случае сделаю загрузку из базы по аналогии с методом runWidgets
#12 15 июля 2019 в 21:15
мда… так. заходишь в файл system/core/template.php и сразу после

  1. class cmsTemplate {
вставляешь это
  1. public function GetMyWidgets($position) {
  2. if (!$this->hasWidgetsOn($position)){ return false; } else { return $this->widgets[$position]; }
  3. }
главное чтобы в классе был.

запрос делать

  1. $ret = $this->GetMyWidgets('right-top');
  2. print_r($ret); die();
print_r простоя для наглядности вывода.
#13 15 июля 2019 в 21:16
вроде ничего сложного
#14 15 июля 2019 в 21:22


мда… так. заходишь в файл system/core/template.php и сразу после

mr.KEVASC

Это несколько противоречит моему видению мира. Я никогда не правлю код базовой системы (по очевидным на мой взгляд причинам). Если мне необходимо дополнить функционал, я делаю свой класс в соответствии с предложенной концепцией расширения базовой системы.
#15 15 июля 2019 в 21:31
Ну тут как бы правки нет, а если уж бояться за обновления то тогда проще так:
делаете в самом классе
  1. class cmsTemplate {
можно в конце класса
  1. include_once('my_template.php');
а в самомmy_template.php пишите свои функции. вот и всё. зачем городить кучу ненужного кода который в конечном итоге будет лишним, так как на разные операции тратится время для чтения, генерация и т.д… Для меня важна эффективность кода. Я на эти моменты не заморачиваюсь, так как потом интеграцию в любой момент можно сделать с новой версией. А городить новые классы и т.д. реально нафиг надо.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.