Icms2: Обработчик событий (hook) перед вызовом списка контента

#1 25 июня 2015 в 21:15
content_list_filter — хук вызывает перед вызовом списка контента.

Как обработать то что через него проходит? Что можно добавить или удалить из этого массива?

А вопрос собственно как добавить перед запросом дополнительный фильтр для запроса в бд?
Пока я справился хаком файла модели и в функцию getContentItems добавил $this->filterEqual('user_id', 1); чтобы отфильтровать по пользователю 1

А как это сделать через хук?
#2 25 июня 2015 в 21:29

Как обработать то что через него проходит?

kreator
через него проходит массив $data в котором спрятаны
  1. $ctype = $data[0];
  2. $model = $data[1];

Что можно добавить или удалить из этого массива?

kreator
можно "всё" или "ничего" или что-то между ними. Зависит от поставленных задач и предполагаемых результатов.

А как это сделать через хук?

kreator
  1. $model->filterEqual('user_id', 1);
  2. $data[1] = $model; // эта строка возможно лишняя.
  3. return $data;
#3 25 июня 2015 в 22:29
Вариации с filterEqual() выдают белый экран с этим в логе:
  1. Call to a member function filterEqual() on a non-object in.......
Что между правильно?

  1. public function run($item){
  2.  
  3. ????????????
  4.  
  5. return $item;
  6.  
  7. }
#4 25 июня 2015 в 22:32
Вру. Работает. Вот так:
  1. public function run($item){
  2.  
  3. $model = $item[1];
  4. $model->filterEqual('user_id', 2);
  5.  
  6. return $item;
  7.  
  8. }
#5 25 июня 2015 в 22:42

content_list_filter

kreator
при формировании списка записей типа контента есть два хука, предназначенных как раз для фильтрации:
  1. list($ctype, $this->model) = cmsEventsManager::hook("content_list_filter", array($ctype, $this->model));
  2. list($ctype, $this->model) = cmsEventsManager::hook("content_{$ctype['name']}_list_filter", array($ctype, $this->model));
content_list_filter и content_ТИПКОНТЕНТА_list_filter

В хук в обоих случаях передается массив данных типа контента и объект модели компонента "контент".

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

В общем случае в хуке нужно сделать как то так:

Имеем: некий контроллер "fuze" smile
Хотим обработать хук "content_list_filter"

Создаем хук

  1. class onFuzeContentListFilter extends cmsAction {
  2.  
  3. public function run($data){
  4.  
  5. list($ctype, $model) = $data;
  6.  
  7. $model->filterEqual('user_id', 1); // фильтруем по пользователю с id = 1
  8.  
  9. return array($ctype, $model);
  10.  
  11. }
  12.  
  13. }
Если же нужно уже в полученном массиве записей что-то исправить/удалить/дополнить, то использовать нужно хуки "content_before_list" или "content_ТИПКОНТЕНТА_before_list".

Что можно добавить или удалить из этого массива

kreator
что угодно из того, что есть, unset() в помощь
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.