2012-04-17 51 views
1

我有一個表,TableModule,與2個外鍵重複鍵,讓我們說FK1FK2Symfony 1.4:創建自定義過濾器。外鍵,並用不同的過濾器(推進)

  • FK1進入PK1在表表1

  • FK2進入PK2在表表2

我創建的米odule。比方說,模塊,它使用TableModule(一個與FK的

我想對那些FK創建4個過濾器:2輸入文本和2個下拉菜單。特別是,我想創建兩個過濾器每fk。這就是:

For fk1 I would get: 
    -InputText 
    -Dropdown (choice in propel) 
For fk2 I would get: 
    -InputText 
    -Dropdown (choice in propel) 

當然,這將顯示的表1結果表2。現在

,在我config.yml我:

... 
    filter: 
     display: [fk1, fk1TextFilter, fk2, fk2TextFilter] 
    ... 

這就是:FK1FK2將被過濾爲下拉菜單,將諧音fk1TextFilterfk2TextFilter必須進行自定義以使用文本輸入進行過濾。

爲什麼我創建了那些partials?因爲我不能在config.yml中複製fk!

lib/filter/table1/ModuleFormFilter我做了(請注意,是在表1):

public function configure() 
{ 
    $this->setWidgets(array(
    'fk1'    => new sfWidgetFormPropelChoice(array('model' => 'table1', 'add_empty' => true,)), 
    'fk1TextFilter'  => new sfWidgetFormInput(), 
    'fk2'    => new sfWidgetFormPropelChoice(array('model' => 'table2', 'add_empty' => true,)), 
    'fk2TextFilter'  => new sfWidgetFormInput(), 
)); 

$this->setValidators(array(
    'fk1TextFilter'  => new sfValidatorPropelChoice(array('model' => 'table1', 'column' => 'id', 'required' => false)), 
    'fk1'    => new sfValidatorPropelChoice(array('model' => 'table1', 'column' => 'id', 'required' => false)), 
    'fk2TextFilter'  => new sfValidatorPropelChoice(array('model' => 'table2', 'column' => 'id', 'required' => false)), 
    'fk2'    => new sfValidatorPropelChoice(array('model' => 'table2', 'column' => 'id', 'required' => false)), 
)); 

$this->validatorSchema->setPostValidator(
    new sfValidatorPropelUnique(array('model' => 'table2', 'column' => array('fk2'))) 
); 

$this->widgetSchema->setNameFormat('model[%s]'); 

$this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema); 

}

這就是:創建2 TextInput和2個下拉菜單如前所述。

如果我使用 - 可以是輸入文本或下拉菜單 - 只是fk這將工作正常。問題是我不能複製fk的。我不能這樣做:

$this->setWidgets(array(
    'fk1' => new sfWidgetFormPropelChoice(array('model' => 'table1', 'add_empty' => true,)), 
    'fk1' => new sfWidgetFormInput(), 
    'fk2' => new sfWidgetFormPropelChoice(array('model' => 'table2', 'add_empty' => true,)), 
    'fk2' => new sfWidgetFormInput(), 
)); 

如果我運行頁面,我得到:

You must define a "filterByfk1TextFilter" method in the ModelQuery class to be able to filter with the "fk1TextFilter" field. 

我發現了一些鏈接(12),但不是爲我工作。我沒有在symfony文檔中具體的例子。

我必須創造什麼?

現在我有,在同一lib/filter/table1/ModuleFormFilter

public function getFields() 
{ 
    $fields = parent::getFields(); 
    $fields['fk1TextFilter'] = 'fk1TextFilter'; 
    $fields['fk2TextFilter'] = 'fk2TextFilter'; 
    return $fields; 
} 

public function addModelfk1TextFilterQuery($query, $field, $value) 
{ 
//add your filter query! 
//for example in your case 
$rootAlias = $query->getRootAlias(); 
$query = ModelQuery::create() 
    ->filterByfk1TextFilter() 
    ->find(); 

//remember to return the $query! 
return $query; 
} 

是不是爲我工作。請問你能幫幫我嗎??

回答

0

黑魔法:

有很多不同的方法。沒有人爲我工作,至少在我發佈的鏈接中。

儘管如此,使用:添加[VirtualColumnName] ColumnCriteria允許您自定義過濾器。

在這種情況下,在所有的代碼我寫的(和改變addModelfk1TextFilterQuery())只需添加:

public function addfk1TextFilterColumnCriteria($query, $field, $value) 
{ 
    //Here just put a query in propel, for ex: 

    $query = $query->useTableModel() 
       ->filterByName("*$value*") 
       ->endUse() 
       ->find(); 
return $query; 
} 

希望這將幫助一些人!

迷你編輯:做一些回聲$field$values澄清

4

對於那些你使用原則,這是一個簡單的擴展,在我的「用戶個人資料」的模式,使過濾用的字段來自sfDoctrineGuardPlugin的sfGuardUser模型。

我的'個人資料'類被稱爲成員,並通過用戶關係通過user_id列引用sfGuardUser。

希望有人認爲它有用!

class MemberFormFilter extends BaseMemberFormFilter { 

    public function configure() { 
    $this->setWidget('first_name', new sfWidgetFormInputText()); 
    $this->setWidget('last_name', new sfWidgetFormInputText()); 
    $this->setWidget('email_address', new sfWidgetFormInputText()); 

    $this->setValidator('first_name', new sfValidatorString(array('required' => false))); 
    $this->setValidator('last_name', new sfValidatorString(array('required' => false))); 
    $this->setValidator('email_address', new sfValidatorString(array('required' => false))); 
    } 

    public function getFields() { 
    return array_merge(parent::getFields(), array(
     'first_name' => 'Text', 
     'last_name' => 'Text', 
     'email_address' => 'Text' 
    )); 
    } 

    public function addFirstNameColumnQuery(Doctrine_Query $query, $field, $value) { 
    $rootAlias = $query->getRootAlias(); 
    return $query->leftJoin($rootAlias.'.User u') 
     ->where('u.first_name LIKE ?', "%$value%"); 
    } 

    public function addLastNameColumnQuery(Doctrine_Query $query, $field, $value) { 
    $rootAlias = $query->getRootAlias(); 
    return $query->leftJoin($rootAlias.'.User u') 
     ->where('u.last_name LIKE ?', "%$value%"); 
    } 

    public function addEmailAddressColumnQuery(Doctrine_Query $query, $field, $value) { 
    $rootAlias = $query->getRootAlias(); 
    return $query->leftJoin($rootAlias.'.User u') 
     ->where('u.email_address LIKE ?', "%$value%"); 
    } 

} 
0

我認爲這將是更好地把addWhere,而不是,其中對每個「addXColumnQuery功能,因爲這樣一來會保留並結合其他過濾器設置。

+0

這不提供要回答這個問題,要批評或要求作者澄清,在他們的帖子下留下評論 - 你總是可以評論你自己的帖子,一旦你有足夠的聲望,你就可以評論任何帖子。 – Kmeixner 2015-06-09 21:24:17