View - как изменить аргументы через хук?

Главные вкладки

Аватар пользователя merlin merlin 8 мая 2022 в 23:52

Здравствуйте всем!
В 9м друпале не могу через хук изменить аргументы представления.
Вижу что есть хук_views_query_alter( $view, $query)
где $query в TableQueue есть эти параметры.
Однако никак не могу через программу их менять.
Обращение $query->TableQueue - дает ошибку
Error: Cannot access protected property Drupal\views\Plugin\views\query\Sql::$tableQueue

Вопрос:
- Как снять эту защиту?
- Как изменить контекстные фильтры (аргументы) через хук?

Спасибо!

Комментарии

Аватар пользователя marassa marassa 9 мая 2022 в 7:53

merlin wrote: Обращение $query->TableQueue - дает ошибку
Error: Cannot access protected property Drupal\views\Plugin\views\query\Sql::$tableQueue

Вопрос:
- Как снять эту защиту?

В общем случае для доступа к protected свойствам существуют специальные методы. В данном случае getTableQueue().

Аватар пользователя merlin merlin 9 мая 2022 в 10:02

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

Например:
$tableQueue=$query->getTableQueue();
unset($tableQueue["node__field_имя_поля"]);

Тут $tableQueue будет изменен - я проверял. Однако $query прежний. И хук не выполняет в этом случае своей задачи.
С помощью getTableQueue() можно лишь читать, но не изменять защищенные свойства

Аватар пользователя marassa marassa 9 мая 2022 в 10:13

Мне вообще непонятно какая связь между контекстными фильтрами представления и tableQueue. Если хотите поменять именно значения контекстных фильтров, то это нужно делать задолго до того, как формируется query, например в хуке hook_views_pre_view() как описано, например, здесь:
https://drupal.stackexchange.com/questions/139289/how-to-get-contextual-...
В hook_views_query_alter можно менять conditions в уже сформированной query.

Аватар пользователя merlin merlin 9 мая 2022 в 12:39

Да, вы правы. Не по тому пути пошел.
Мне просто нужно было удалить один из контекстных фильтров вообще в случае его определенного значения, а не изменять значения аргумента.

Но эту проблему я могу решить через обычные фильтры.
Так надо было, в случае аргумента = 0, поставить условие в обычный фильтр не как значение равное нулю, а как пустое(отсутствующее) значение.
Я споткнулся на ошибках собственной логики. Возможности Друпала тут не при чем.

В общем решил проблемму так:
1. В аргументах добавил исключение 'null' (по умолчанию было all)
2. Добавил фильтр на field_имя_поля null (значение поля должно быть пустым)
3. В хук_views_query_alter() указал, чтоб при условии аргумента != null, удалить фильтр field_имя_поля null
т.е.

<?phpif ($view->args[1]!="null")
   unset($query->where[1]['conditions'][1]);
?>

Спасибо за наводку!