2012-07-19 71 views
1

在Symfony 1.4中使用sfGuard插件時,如何通過sfGuardUserProfile字段進行過濾?使用sfGuard插件過濾UserProfile字段

正如我認爲是標準的,我創建了一個sf_guard_user_profile表來保存諸如名字,姓氏等字段。

我有我的管理員索引頁面的用戶的相當股份列表。我可以通過用戶名篩選就好了。但我無法過濾sf_guard_user_profile表中的字段,如last_name。

我generator.yml看起來像

generator: 
    class: sfPropelGenerator 
    param: 
    model_class: sfGuardUser 

    config: 
     list: 
     display: [=username, first_name, last_name, last_login, role] 
     batch_actions: [] 

     filter: 
     display: [username] 

     form: 
     class: myGuardUserAdminForm 

我可以通過改變來獲得字段頁面上的形式展現出來:

filter: 
    class: sfGuardUserProfileFormFilter 

但是當我提交該表格用姓氏的有效值,它不會過濾。所有記錄都會返回。

回答

1

添加sfGuardUserProfileFormFilter作爲過濾器類不是過濾first_name,last_name和其他配置文件字段的正確方法。

相反,你必須添加一個字段,你需要過濾,像過濾器顯示列表:

filter: 
    display: [username, first_name, last_name] 

然後你要合併sfGuardUserProfileFormFiltersfGuardUserFormFilter

public function configure() 
{ 
    parent::configure(); 

    $this->mergeForm(new sfGuardUserProfileFormFilter()); 
} 

最後補充在sfGuardUserFormFilter函數addMyFieldColumnCriteria(推動符號)爲您要過濾的合併形式sfGuardUserProfileFormFilter的每個字段。對於first_name我們有:

protected function addFirstNameColumnCriteria(Criteria $criteria, $field, $values) 
    { 
     if (!is_array($values)) 
      return; 

     $criteria->addJoin(sfGuardUserPeer::ID, sfGuardUserProfilePeer::USER_ID, Criteria::INNER_JOIN); 

     if (isset($values['is_empty']) && $values['is_empty']) 
     { 
      $criteria->add($field, null, Criteria::ISNULL); 
      $criteria->addOr($field, '', Criteria::EQUAL); 
     } 
     else 
     { 
      $value = $values['text']; 
      if ($value == '') 
       return; 
      $criteria->add($field, '%'.$value.'%', Criteria::LIKE); 
     } 
    }