搜索自定义字段在drupal中添加自定义表单

时间:2014-05-09 08:11:03

标签: php drupal drupal-7

我们已经在drupal中进行了自定义注册表单。    我们在哪里添加名字,姓氏,城市,技能。     现在我们想要根据以下条件搜索用户。     但是如果当drupal创建一个新字段时,在后端它会创建一个带有字段名称的表。     例如:field_data_field_account_type

like we have writtern code for search on te basis of account type

   function getUsersList($type=null){
$query = db_select('users', 'u');
$query->join('field_data_field_account_type', 'at', 'u.uid = at.entity_id'); 
$query->fields('at')
->fields('u')
->condition('at.field_account_type_value',$type,'=')
->orderBy('created', 'DESC');

$result = $query->execute();
$users = array();
while($record = $result->fetchAssoc()) 
{
    $user_fields = user_load($record['uid']);
    $users[] = $user_fields;
}
return $users;
   }


but if we will search on multiple tables using joins search will become slow.

那么,我们应该遵循什么方法来获得名字,城市,技能,  没有使用连接。

在drupal中是否有任何表单字段api函数来解决它。

我找到了一个解决方案,但在这里我面临一个问题。这是我的代码

      i found some solution for my problem but i am facing one problem              

    $query = new EntityFieldQuery();
     $results=$query->entityCondition('entity_type', 'user');
     if($type!=null)
     {
      $query->fieldCondition('field_account_type', 'value',$type, '=');
    }
           if($name!=null)
           {

 $query->fieldCondition('field_first_name', 'value',"%$name%", 'like');

//$query->fieldCondition('field_last_name', 'value',"%$name%", 'like');
           }

           /*if($city!=null&&isset($city))
           {
           $query->fieldCondition('field_city', 'value',"%$city%", 'like');
           }
            if($skill!=null&&isset($skill))
           {
    $query->fieldCondition('field_skills', 'value',"%$skill%", 'like');
            }*/
           $results->execute();


This code only work on first name , bu not for last name.lIKE here and condition is working for last name 

所以我可以使用或只使用一个文本框来设计这样的查询。使用firstname,lastname,city,skil等用户。

2 个答案:

答案 0 :(得分:0)

我要说的第一件事是我对drupal一无所知,但我会建议一个不同的观点。 你的问题是加入真的很慢,所以你不喜欢非加入解决方案。

我认为的是改善加入速度而不是不使用它,因为我认为"加入"在你的情况下做一件相当合理的事情。

为了解决问题,我建议在用户表中添加uid的索引。还有entity_id& field_data_field_account_type中的field_account_type_value。

将这3列索引后,如果您以前没有对其进行索引,则应大大提高查询速度。

答案 1 :(得分:0)

我没有得到任何解决方案所以我将用户的数据复制到另一个表中,因此搜索变得很快。

我的代码是:

function users_user_insert(&$edit, $account, $category) {
$coFounder      =   '';
 $founder       =   '';
 if($account->field_account_type['und'][0]['value']=='co-founder'){
$coFounder      =   $account->field_account_type['und'][0]['value'];
 }
 else if(($account->field_account_type['und'][0]['value']=='founder')&&($account-    
   >field_account_type['und'][1]['value']=='co-founder'))
  {
$founder        =   $account->field_account_type['und'][0]['value'];
$coFounder      =   $account->field_account_type['und'][1]['value'];
 }
 else{
$founder        =   $account->field_account_type['und'][0]['value'];
  }


   $result = db_insert('lew_users_meta')->fields(array('uid'=>$account-    
   >uid,'name'=>$account->name,'first_name'=>$account->field_first_name['und'][0]
   ['value'],
'last_name'=>$account->field_last_name['und'][0]['value'],'mail'=>$account->mail,
'city'=>$account->field_city['und'][0]['value'],
     'skills'=>$account->field_skills['und'][0]['value'],


          'coFounder'=>$coFounder,'founder'=>$founder,'created'=>time()
                        )


                       )                 
                       ->execute();

         }

     function users_user_update(&$edit, $account, $category) {
     $coFounder     =   '';
     $founder       =   '';
    if($account->field_account_type['und'][0]['value']=='co-founder'){
$coFounder      =   $account->field_account_type['und'][0]['value'];
     }
 else if(($account->field_account_type['und'][0]['value']=='founder')&&($account-   
  >field_account_type['und'][1]['value']=='co-founder'))
 {
$founder        =   $account->field_account_type['und'][0]['value'];
$coFounder      =   $account->field_account_type['und'][1]['value'];
 }
 else{
$founder        =   $account->field_account_type['und'][0]['value'];
  }

    $result = db_update(' lew_users_meta')
                       ->fields(array('name'=>$account->name,'first_name'=>$account-    
      >field_first_name['und']['0']['value'],
'last_name'=>$account-     
    >field_last_name['und'][0]['value'],'mail'=>$account->mail,
'city'=>$account->field_city['und'][0]['value'],
    'skills'=>$account->field_skills['und']['0']['value'],

      'founder'=>$founder,'coFounder'=>$coFounder,'modified'=>time()
                        )


                       )
                       ->condition('uid', $account->uid,'=')
                       ->execute();



  }

所以我们使用hook在另一个表中插入数据。因此我们不应该加入     表

如果您有更好的解决方案,请在此处发布