如何解决如何在Drupal 8的hook_views_pre_execute中将查询结果限制为0?
我正在开发一个Drupal 8网站,其中显示了某些内容类型的框图,其中显示了其他内容类型的相关信息。我需要根据正在访问的节点(与视图中的内容相对)的审核状态来动态限制查询结果。我的计划是从页面上下文中获取节点的审核状态,并使用它来限制视图的结果。但是,setLimit函数似乎对查询结果没有影响:
function myModule_views_pre_execute(ViewExecutable $view) {
// Only for my_view view.
if ($view->id() == 'my_view') {
$list_node = Drupal::request()->attributes->get('node');
if($list_node->moderation_state->value == "approved"){
}else{
dpm("node is not approved,setting limit to 0");
$view->query->setLimit(0);
}
}
几年前我见过similar questions的问题,但是答案似乎指向更改寻呼机而不是查询...奇怪的是,寻呼机将以某种方式直接与sql查询绑定本身,而不仅仅是显示或整理结果。 setLimit函数不仅可以简单地编辑最终SQL查询的“ LIMIT”部分吗?还是在我的代码运行后,寻呼机实际上在更改限制?提前非常感谢!
更新9.11.2020
我尝试在不同的挂钩中尝试不同的事情,检查通过视图编辑界面生成的实际查询,因为这暴露了“ LIMIT#”表达式。我从该过程中学到了两件事:
- 事物可以并且将在其他挂钩中编辑查询。我发现将setLimit放在
hook_views_query_alter
中已被其他模块覆盖,并且到hook_views_pre_execute
出现时,它已从我设置的位置更改为之前的设置。但是,在pre_execute
中进行设置可以正常工作。 - 令人惊讶的是,调用
setLimit(0)
会完全从查询中删除LIMIT表达式!。但是,其他任何值似乎都可以正常工作。
这是预期的行为吗? Drupal是否禁止将查询限制设置为0?还是应该在某个地方记录问题?
解决方法
您应该改用hook_views_query_alter。
function myModule_views_pre_execute(ViewExecutable $view,QueryPluginBase $query) {
// Only for my_view view.
if ($view->id() == 'my_view') {
$list_node = Drupal::request()->attributes->get('node');
if($list_node->moderation_state->value == "approved"){
}else{
dpm("node is not approved,setting limit to 0");
$query->setLimit(0);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。