Добрый день. Через админку накликано представление, оно формирует SQL запрос.
Есть ли способ подменить этот запрос на свой? Нужно брать данные из другой таблицы.
Редактировать запрос вьюшки.
Главные вкладки
Лучший ответ
В общем hook_views_query_alter и прочие view api не подходят.
Эти хуки кстати надо писать не в module_name.module, а в module_name.views_execution.inc
В принципе базовую таблицу можно поменять из хука hook_views_query_alter вот так:
<?php
$views->storage->set('base_table', 'ваша_таблица');
?>
Но в запросе будет ошибка, потому что вместе с таблице поменяется её alias, по которому работают выборка, условия и join.
Поменять alias в этом же хуке у меня не получилось.
Так что берём hook_query_alter (module_name.module)
<?php
/**
* Подменяет родную таблицу на кэширующую
*
* @param AlterableInterface $query
*/
function mymodule_query_alter (AlterableInterface $query) {
/**@var \Drupal\Core\Database\Driver\mysql\Select $query*/
if ($query->hasTag('views_view_name')) { // имя вьюшки с префиксом views_, или в админке можно задать свой маркер и тогда уже без префикса
$tableList = &$query->getTables();
if (isset(
$tableList['node_field_data'])) {
$tableList['node_field_data']['table'] = 'cache_table_node_field_data'; // меняем node_field_data на cache_table_node_field_data
}
}
}
?>
Комментарии
https://api.drupal.org/api/drupal/core!modules!views!views.api.php/funct...
Я первым делом попробовал этот хук, но не понял как сменить таблицу или запрос целиком, там в примерах меняется только where
Мне кажется, что чем альтерить полностью запрос через query_alter() - проще написать хендлер для таблицы.
Что такое "хендлер для таблицы"?
http://xandeadx.ru/blog/drupal/149
Спасибо, надо вкурить.
В общем hook_views_query_alter и прочие view api не подходят.
Эти хуки кстати надо писать не в module_name.module, а в module_name.views_execution.inc
В принципе базовую таблицу можно поменять из хука hook_views_query_alter вот так:
<?php
$views->storage->set('base_table', 'ваша_таблица');
?>
Но в запросе будет ошибка, потому что вместе с таблице поменяется её alias, по которому работают выборка, условия и join.
Поменять alias в этом же хуке у меня не получилось.
Так что берём hook_query_alter (module_name.module)
<?php /**
/**@var \Drupal\Core\Database\Driver\mysql\Select $query*/
$tableList = &$query->getTables();
$tableList['node_field_data']['table'] = 'cache_table_node_field_data'; // меняем node_field_data на cache_table_node_field_data
}
* Подменяет родную таблицу на кэширующую
*
* @param AlterableInterface $query
*/
function mymodule_query_alter (AlterableInterface $query) {
if ($query->hasTag('views_view_name')) { // имя вьюшки с префиксом views_, или в админке можно задать свой маркер и тогда уже без префикса
if (isset(
$tableList['node_field_data'])) {}
}
?>