Здравствуйте всем!
В 9м друпале не могу через хук изменить аргументы представления.
Вижу что есть хук_views_query_alter( $view, $query)
где $query в TableQueue есть эти параметры.
Однако никак не могу через программу их менять.
Обращение $query->TableQueue - дает ошибку
Error: Cannot access protected property Drupal\views\Plugin\views\query\Sql::$tableQueue
Вопрос:
- Как снять эту защиту?
- Как изменить контекстные фильтры (аргументы) через хук?
Спасибо!
Комментарии
В общем случае для доступа к protected свойствам существуют специальные методы. В данном случае getTableQueue().
Спасибо. Но в том то и дело, что получив таким образом массив, я изменяю в нем значения. Однако эти изменения никак не попадают в $query . А ведь именно на основе $query создается запрос, который в итоге не меняется никак.
Например:
$tableQueue=$query->getTableQueue();
unset($tableQueue["node__field_имя_поля"]);
Тут $tableQueue будет изменен - я проверял. Однако $query прежний. И хук не выполняет в этом случае своей задачи.
С помощью getTableQueue() можно лишь читать, но не изменять защищенные свойства
Мне вообще непонятно какая связь между контекстными фильтрами представления и tableQueue. Если хотите поменять именно значения контекстных фильтров, то это нужно делать задолго до того, как формируется query, например в хуке hook_views_pre_view() как описано, например, здесь:
https://drupal.stackexchange.com/questions/139289/how-to-get-contextual-...
В hook_views_query_alter можно менять conditions в уже сформированной query.
Да, вы правы. Не по тому пути пошел.
Мне просто нужно было удалить один из контекстных фильтров вообще в случае его определенного значения, а не изменять значения аргумента.
Но эту проблему я могу решить через обычные фильтры.
Так надо было, в случае аргумента = 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]);
?>
Спасибо за наводку!