欢迎各位兄弟 发布技术文章
这里的技术是共享的
drupal ajax view hook_views_pre view views ajax 区块 如果自己自定义覆写了
hook_views_pre_view 的 filter 过滤器,它就不起作用了
hook_views_pre_view 里面的代码
if($view->name=='allcontentview' && ($display_id=='block_1'))
{
$filters = $view->display_handler->get_option('filters');
$user_role_include_fen_pei = _get_user_role_include_fen_pei();
//不包含 '分配跟踪人A' 或 '分配跟踪人B' 或 '分配跟踪人C' ;则移除这个过滤条件
if(empty($user_role_include_fen_pei)){
unset($filters['field_fen_pei_gzr_value_many_to_one']);
}
else{ //包含 '分配跟踪人A' 或 '分配跟踪人B' 或 '分配跟踪人C' 则这个过滤器就会把过滤条件置为 三个分配跟踪人中的一个
$filters['field_fen_pei_gzr_value_many_to_one']['value'][$user_role_include_fen_pei] = $user_role_include_fen_pei;
}
$view->display_handler->override_option('filters', $filters);
}
上面的代码 正常情况下 起作用,但是 区块 使用 ajax 分页它就不起作用了 无法覆写 filter 了
我的解决办法如下 就是 下面所指的 views_ajax_934104-3.patch 里面的代码
diff --git a/includes/ajax.inc b/includes/ajax.inc index 6d0b8a3..9915863 100644 --- a/includes/ajax.inc +++ b/includes/ajax.inc @@ -49,19 +49,11 @@ function views_ajax() { // Reuse the same DOM id so it matches that in Drupal.settings. $view->dom_id = $dom_id; - $errors = $view->validate(); - if ($errors === TRUE) { - $object->status = TRUE; - $object->display .= $view->preview($display_id, $args); - // Get the title after the preview call, to let it set - // up both the view's current display and arguments - $object->title = $view->get_title(); - } - else { - foreach ($errors as $error) { - drupal_set_message($error, 'error'); - } - } + $object->status = TRUE; + $object->display .= $view->preview($display_id, $args); + // Get the title after the preview call, to let it set + // up both the view's current display and arguments + $object->title = $view->get_title(); // Register the standard JavaScript callback. $object->__callbacks = array('Drupal.Views.Ajax.ajaxViewResponse'); // Allow other modules to extend the data returned.
views_ajax()中的该行导致(至少部分)在调用pre_view钩子之前构造视图。$errors = $view->validate();
具体情况是尝试使用hook_views_pre_view设置公开日期过滤器的值时。以编程方式设置的值适用于初始页面加载(非ajax),但是当使用ajax分页器时,由于在pre_view挂钩之前调用date_api_filter_handler :: init(),因此无法设置这些值。还有其他一些与日期有关的特定问题,这些问题与设置暴露的过滤器值有关(#523224:Date API过滤器处理程序不支持view :: set_exposed_input()),但是pre_view钩子之前的validate()会使使用Ajax视图时的情况复杂化。在特定于日期的问题中使用hack,并注释validate调用可使该视图按预期与ajax分页一起工作。
注释
评论#1
达韦纳这似乎与#837816相关:$ view-> add_item()无法在Ajax的hook_views_pre_build(&$ view)中工作
登录或注册以发表评论
评论#2
iamjon 信用出处: iamjon 已评论tauno,
您找到解决方案了吗?如果是,请更新。如果否,请回复dereine的评论。
因缺乏活动而关闭。请随时重新打开。
登录或注册以发表评论
评论#3
hefox 信用归因: hefox 已评论我已经看过很多次了,终于对它感到恼火,无法研究它。
在常规钩子之前,Validate确实会初始化一堆东西,使其中完成的事情变得毫无用处。如果做诸如添加与控制对某物的访问权相关的过滤器之类的工作,bam会在您的网站中引起一个很小的安全问题:(。
据我所知,所有验证操作都是确保视图仍然(所有插件仍然存在,等等)。在管理屏幕之外,没有人使用它,并且在执行视图之前(据我所知)也没有人使用它。没有看到为什么ajax回调正在使用它,所以这里有一个补丁只是将其删除。
登录或注册以发表评论
评论#4
达韦纳另请参见#1360336:views_ajax()找不到类似问题的某些处理程序,从而删除了对ajax的验证。
您完全可以同意,此时您不需要这种验证。这是完全错误的。
这个问题可能也值得添加到6.x-3.x和6.x-2.x中,即使我不认为将来会发布。
登录或注册以发表评论
评论#5
达韦纳哇,很长时间没有提交6.x-2.x了。提交并推送到6.x-2.x
登录或注册以发表评论