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