1

2つの外部キーを持つテーブルTableModuleがあります。たとえば、 fk1fk2です。

  • fk1表1のpk1に移動します

  • fk2表2のpk2に移動します

モジュールを作成しました。たとえば、 TableModulefkを持つもの)を使用するModuleとしましょう。

それらのfk用に4つのフィルターを作成したいと思います:2つの入力テキストと2つのドロップダウン。特に、 fkごとに2つのフィルターを作成したいと思います。これは:

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は、テキスト入力を使用してフィルタリングするようにカスタマイズする必要があります。

なぜそれらのパーシャルを作成したのですか?config.ymlでfkを複製できないためです!!

私がやったこと(表1lib/filter/table1/ModuleFormFilterにあることに注意してください):

 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つのドロップダウンを作成しました。

-inputtextまたはdropdowns-を使用する場合、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.

いくつかのリンク(1、2)が見つかりましが、機能していません。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;
}

私のために働いていません。私を手伝ってくれますか??

4

3 に答える 3

4

Doctrineを使用している方のために、これは私の「ユーザープロファイル」モデルの単純な拡張であり、sfDoctrineGuardPluginからのsfGuardUserモデルのフィールドによるフィルタリングを可能にします。

私の「profile」クラスはMemberと呼ばれ、user_id列を介したUserリレーションを介して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%");
  }

}
于 2012-09-25T06:13:40.013 に答える
0

黒魔術:

多くの異なる方法があります。少なくとも私が投稿したリンクにあるものは、私にとってはうまくいきませんでした。

それでも、add [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

于 2012-04-18T14:37:50.737 に答える
0

各"addXColumnQuery関数のwhereではなくaddWhereを配置する方がよいと思います。これにより、他のフィルターセットが保持および結合されるためです

于 2015-06-09T21:23:21.850 に答える