天天看點

Drupal 在Views 中自定義篩選 Filter

在Views中設定了一個Node,Node中有個field_warehousefactory  字段通過Tax取到資料,User中有個Field_warehousefactoryid ,想法是目前登入使用者在檢視此Views時隻顯示User->Field_warehousefactoryid =node->field_warehousefactory 的文檔,但通過Views内置的篩選沒辦法同時取到二個值,通過搜尋和QQ群中的讨論最後找到了一個通過hook_views_query_alter 進行修改Views的SQL來操作。

下面直接把過記錄下來,先設定好Page。

Drupal 在Views 中自定義篩選 Filter
Drupal 在Views 中自定義篩選 Filter

在子產品中寫個自己的小子產品:

<?php
//hook_views_query_alter
function views_warehouse_factoryfilter_views_query_alter(&$view, &$query) {
		
			if($view->name=="warehouseviews"&& $view->current_display == "page"){
			$join=new views_join();
			$join->table='field_data_field_warehousefactory';
			$join->field='entity_id';
			$join->left_table='node';
			$join->left_field='nid';
			$join->type='inner';
			$join->extra=array(0 => Array ( 'field' => "entity_type" ,
											'value' => "node" ), 
							   1 => Array ( 'field' => "deleted", 
											'value' => 0 ,
											'numeric' => 1 ) );
			$join->definition=array('left_field' => "nid" ,
									'field' => "entity_id" ,
									'extra' => Array ( 0 => Array ( 'field' => "entity_type", 'value' => "node" ) ,
													   1 => Array ( 'field' => "deleted", 'value' => 0 ,'numeric' => 1 ) ), 
									'table' => "field_data_field_warehousereturndate" ,
									'left_table' => "node");
			$join->entity_type='and';
			$join->adjusted=1;
			
			$query->table_queue['field_data_field_warehousefactory']=array(
									
						'table'=>"field_data_field_warehousefactory",
						'num'=>"1",
						'join'=>$join,
						'alias'=>"field_data_field_warehousefactory",						
						'relationship'=>"node");
						
			$query->where[1]['conditions'][2]=array(
					'field'=>"field_data_field_warehousefactory.field_warehousefactory_tid",
					'value'=>'91',
					'operator'=>"in"
					);			
		dpm($query);
		}
	}
           

通過dpm($query);之後可以看到相關增加的自定義内容。

Drupal 在Views 中自定義篩選 Filter
Drupal 在Views 中自定義篩選 Filter

但在發現了報錯:

Drupal 在Views 中自定義篩選 Filter

在通過檢視Views SQL發現了明确的問題。

Drupal 在Views 中自定義篩選 Filter
Drupal 在Views 中自定義篩選 Filter

My Gold 在Where的In中沒有 91 這個值。

通過不斷的測試和開放思想,最後發現了單值使用“=”進行指派,多值使用的IN 就需要用array數組進行指派。現在修改下為:

<?php
//hook_views_query_alter
function views_warehouse_factoryfilter_views_query_alter(&$view, &$query) {
		
	//if($view->name=="warehouseviews"&& $view->current_display == "page"){
			//print_r($query);
			$join=new views_join();
			$join->table='field_data_field_warehousefactory';
			$join->field='entity_id';
			$join->left_table='node';
			$join->left_field='nid';
			$join->type='INNER';
			$join->extra="(field_data_field_warehousefactory.entity_type = 'node' AND  field_data_field_warehousefactory.deleted = '0')";	
			$join->entity_type='AND';
			$join->adjusted=1;
			
			$query->table_queue['field_data_field_warehousefactory']=array(
									
						'table'=>"field_data_field_warehousefactory",
						'num'=>"1",
						'join'=>$join,
						'alias'=>"field_data_field_warehousefactory",						
						'relationship'=>"node");
						
			$query->where[1]['conditions'][]=array(				
					'field'=>"field_data_field_warehousefactory.field_warehousefactory_tid",
					'value'=>array('90','91'),
					'operator'=>"IN"
					);
			//單值指派使用“=”,多值指派使用 array 
			//$query->where[1]['conditions']=array(				
			//		'field'=>"field_data_field_warehousefactory.field_warehousefactory_tid",
			//		'value'=>'91',
			//		'operator'=>"=");
			//dpm($query);
	//}
	}
           

在Drupal群中多謝:@[sh]phpartisan ,@[武漢]老學 

資料參考:http://drupalchina.cn/node/2646    https://api.drupal.org/api/views/includes%21handlers.inc/class/views_join/7

最後實作到程式中的修改結果為:

<?php
//hook_views_query_alter
function views_warehouse_factoryfilter_views_query_alter(&$view, &$query) {
		if($view->name=="warehouseviews"){
			
			$join=new views_join();
			$join->table='field_data_field_warehousefactory';
			$join->field='entity_id';
			$join->left_table='node';
			$join->left_field='nid';
			$join->type='INNER';
			$join->extra="field_data_field_warehousefactory.entity_type = 'node' AND  field_data_field_warehousefactory.deleted = '0'";	
			$join->entity_type='AND';
			$join->adjusted=1;
			
			$query->table_queue['field_data_field_warehousefactory']=array(
									
						'table'=>"field_data_field_warehousefactory",
						'num'=>"1",
						'join'=>$join,
						'alias'=>"field_data_field_warehousefactory",						
						'relationship'=>"node");
			global $user;
			$user_load=user_load($user->uid); //取得使用者擴充的字段
			$factoryid=$user_load->field_factory_location['und']; //取得使用者所在工廠的數組
			$arr_factory=array();
			foreach($factoryid as $factory){				
				$arr_factory[]=$factory['tid']; //對使用者所在工廠數組進行适配到$query->where數組的Value中去。							
			}			
			if(count($arr_factory)>1){			
				$query->where[1]['conditions'][]=array(				
					'field'=>"field_data_field_warehousefactory.field_warehousefactory_tid",					
					'value'=>$arr_factory,					
					'operator'=>"IN"
					);
					}
			else {
				$query->where[1]['conditions'][]=array(				
					'field'=>"field_data_field_warehousefactory.field_warehousefactory_tid",
					'value'=>$arr_factory[0],
					'operator'=>"=");					
			} 
			//單值指派使用“=”,多值指派使用 array 			
			dpm($query);
	}
	}