【发布时间】:2020-12-29 12:00:31
【问题描述】:
我正在开发一个 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”部分吗?还是在我的代码运行后寻呼机实际上改变了限制?非常感谢!
2020 年 11 月 9 日更新
我尝试在不同的钩子中尝试不同的东西,检查通过视图编辑界面生成的实际查询,因为这会暴露“LIMIT #”表达式。我从这个过程中学到了两个主要的东西:
- 可以并且将会在其他挂钩中编辑查询。我发现将 setLimit 放入
hook_views_query_alter会被其他模块覆盖,而当hook_views_pre_execute出现时,它会与我之前设置的有所不同。但是将其设置为pre_execute可以正常工作。 - 令人惊讶的是,调用
setLimit(0)从查询中完全删除了 LIMIT 表达式!但是,任何其他值似乎都可以正常工作。
这是预期的行为吗? Drupal 是否禁止将查询的限制设置为 0?还是我应该在某处记录问题?
【问题讨论】:
标签: php drupal-8 drupal-modules drupal-views