1

迷惑な問題があります。フォームのどのフィールドが変更されたかを調べて、それをテーブルに挿入しようとしています。次のようにdoUpdateObjectasでvar_dumpを実行できました

public function doUpdateObject($values) 
{ 
    parent::doUpdateObject($values);
    var_dump($this->getObject()->getModified(false));
    var_dump($this->getObject()->getModified(true));
 } 

そして、$ this-> getObject()-> getModifiedは、trueまたはfalseに設定することで、前後の値を指定するのに機能しているようです。

私が今直面している問題は、どういうわけか、sfWidgetFormSelectが私のフィールドの1つを文字列として保存しているように見えることです。保存する前は、まったく同じフィールドがintでした。(私は前と後の両方でvar_dumpによってこのアイデアを得ました)。

両方のvarダンプの結果は次のとおりです。

array(1) {["annoying_field"]=> int(3)} array(1) {["annoying_field"]=>string(1)"3"}

これにより、教義はこれが修正であると考え、したがって誤検知を与えるようです。

私の基本形では、私は持っています

under $this->getWidgets()
'annoying_field'    => new sfWidgetFormInputText(),

under $this->setValidators
'annoying_field'    => new sfValidatorInteger(array('required' => false)),

最後に、構成済みのForm.class.phpで、ファイルを次のように再構成しました。

$this->widgetSchema['annoying_field'] = new sfWidgetFormSelect(array('choices' => $statuses));

statusesは、{"" a "、" b "、" c "、"d"}などの値を含む配列です。

ステータスのインデックスをデータベースに保存したいだけです。

また、変更を別のデータベーステーブルに挿入するにはどうすればよいですか?私のログテーブルとしましょう。

なぜこれが起こるのかについてのアイデアやアドバイスはありがたいです、私はそれを理解しようとしていて、無駄にさまざまなキーワードをグーグルで閲覧しています。

ありがとう!

編集:

さて、テストのためだけにスキーマに整数という別のフィールドを作成しました。エントリを作成して保存し、編集しました。

今回も同じことが起こりました!

4

2 に答える 2

1

まず、データベースに保存するstatus_idを指定する場合は、次のようにステータス配列を定義する必要があります。

 {1 => "a", 2 => "b", 3 => "c", 4 => "d"}

そのようにして、彼は1が「a」のようにレンダリングされるべきであることを知っています。次に、保存するときは、インデックスのみを保存する必要があります。

別のデータベースへの保存については、Formクラスで定義されたdoSaveメソッドをニーズに合わせて変更することをお勧めします。私はPropelがそれをどのように扱うかを知っているだけです、多分これは役立つかもしれません:

doSaveメソッドは次のようなものを投与します:

  protected function doSave($con = null)
  {
    if (null === $con)
    {
      $con = $this->getConnection();
    }

    $old = $this->getObject()->getModifiedValues($this);//Define this
    $new_object = new Log($old);//Create a new log entry
    $new_object->save($con));//save it!

    $this->updateObject();

    $this->getObject()->save($con);

    // embedded forms
    $this->saveEmbeddedForms($con);
  }

お役に立てれば!

編集:

これは、私のアプリケーションの1つでモデルから抽出された例であり、正常に機能しています。

スキーマ:

[...]    
funding_source_id:
  type: integer
  required: true
[...]

形:

$this->setWidget('funding_source_id', new sfWidgetFormChoice(array(
   'choices' => array(1 => 'asdads', 2 => '123123123' , 3 => 'asd23qsdf'),
)));


$this->setValidator('funding_source_id', new sfValidatorChoice(array(
   'choices' => array(1 => 'asdads', 2 => '123123123' , 3 => 'asd23qsdf'),
  'required' => true
)));

ログについては、かなり複雑になる可能性があります。基本フォームクラス(現在はSymfony1.4のsfFomrObject)のdoSaveメソッドの現在の実装と、変更された値を処理するオブジェクトをいつどのように委任するかを読む必要があります。

于 2010-12-20T02:56:52.607 に答える
0

さて、代わりに配列キーを使用するためにカスタムバリデーターを実行するのを忘れたことがわかりました。

于 2010-12-24T00:48:03.453 に答える