欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

drupal ajax view hook_views_pre view views ajax 区块 如果自己自定义覆写了 hook_views_pre_view 的 filter 过滤器,它就不起作用了 有大用 有大大用 有大大大用 有大大大大用

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.


稍后在使用Ajax时调用hook_views_pre_view

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分页一起工作。                    

评论                                文件                                尺寸                                作者                                
#3                                views_ajax_934104-3.patch                                1.21 KB                                狐狸                                
通过:[[SimpleTest]]:[MySQL] 0次通过。视图                                    
万神殿的支持有助于为Drupal和开源提供动力。万神殿学到更多    

注释        

dawehner的头像            

iamjon的图片            

状态:                                        活性                                        »已关闭(无法复制)                                        

tauno,
您找到解决方案了吗?如果是,请更新。如果否,请回复dereine的评论。                            

因缺乏活动而关闭。请随时重新打开。                            

hefox的图片            

版:                                        6.x-2.11                                        »6.x-2.x-dev                                        
状态:                                        关闭(无法复制)                                        »需要审查                                        
文件                                        尺寸                                        
1.21 KB                                        
通过:[[SimpleTest]]:[MySQL] 0次通过。视图                                            

我已经看过很多次了,终于对它感到恼火,无法研究它。                            

在常规钩子之前,Validate确实会初始化一堆东西,使其中完成的事情变得毫无用处。如果做诸如添加与控制对某物的访问权相关的过滤器之类的工作,bam会在您的网站中引起一个很小的安全问题:(。                            

据我所知,所有验证操作都是确保视图仍然(所有插件仍然存在,等等)。在管理屏幕之外,没有人使用它,并且在执行视图之前(据我所知)也没有人使用它。没有看到为什么ajax回调正在使用它,所以这里有一个补丁只是将其删除。                            

dawehner的头像            

状态:                                        需要审查                                        »由社区审查和测试                                        

另请参见#1360336:views_ajax()找不到类似问题的某些处理程序,从而删除了对ajax的验证。                            

您完全可以同意,此时您不需要这种验证。这是完全错误的。                            

这个问题可能也值得添加到6.x-3.x和6.x-2.x中,即使我不认为将来会发布。                            

dawehner的头像            

状态:                                        由社区审查和测试                                        »固定                                        

哇,很长时间没有提交6.x-2.x了。提交并推送到6.x-2.x                            

状态:                                        固定                                        »封闭(固定)                                        

自动关闭-已修复问题,为期2周,没有任何活动。                            



来自  https://www.drupal.org/project/views/issues/934104

普通分类: