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。


在模块中写个自己的小模块:

<?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);之后可以看到相关增加的自定义内容。


但在发现了报错:


在通过查看Views SQL发现了明确的问题。


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);
	}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值