4

HTML フォーム フィールドからの選択オプションに基づいてフィールドの検証を変更するフォームを作成しようとしています。

例: ユーザーがドロップダウン フィールド "options" からオプション 1 を選択した場合、フィールド "metric" を sfValidatorInteger として検証する必要があります。ユーザーがフィールド「オプション」からオプション 2 を選択した場合、フィールド「メトリック」を sfValidatorEmail などとして検証する必要があります。

そのため、public function configure() { 内に、「オプション」の値を取得するための switch ステートメントがあり、「オプション」から返された値に基づいてバリデーターを作成します。

1.) 「オプション」の値を取得するにはどうすればよいですか? 私はもう試した:

$this->getObject()->options
$this->getTaintedValues()

現在私のために働いている唯一のものは、実際にはMVCではありません:

$params = sfcontext::getInstance()->getRequest()->getParameter('options');

2.) その情報を取得したら、「メトリック」の値を別のフィールドに割り当てるにはどうすればよいですか? (「メトリック」は db の実際の列ではありません)。したがって、「メトリクス」の値を「email」、「age」などの別のフィールドに割り当てる必要があります...現在、ポストバリデーターでこれをこのように処理していますが、configure( ):

$this->validatorSchema->setPostValidator(new sfValidatorCallback(array('callback' => array($this, 'checkMetric'))));

public function checkMetric($validator, $values) {

}

ありがとう!

4

3 に答える 3

6

投稿バリデーターを使用したい。フォームで次のようなことを試してください。

public function configure()
{
  $choices = array('email', 'integer');
  $this->setWidget('option', new sfWidgetFormChoice(array('choices' => $choices))); //option determines how field "dynamic_validation" is validated
  $this->setValidator('option', new sfValidatorChoice(array('choices' => array_keys($choices)));
  $this->setValidator('dynamic_validation', new sfValidatorPass()); //we're doing validation in the post validator
  $this->mergePostValidator(new sfValidatorCallback(array(
    'callback' => array($this, 'postValidatorCallback')
  )));
}

public function postValidatorCallback($validator, $values, $arguments)
{
   if ($values['option'] == 'email')
   {
     $validator = new sfValidatorEmail();
   }
   else //we know it's one of email or integer at this point because it was already validated
   {
     $validator = new sfValidatorInteger();
   }
   $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']); //clean will throw exception if not valid
   return $values;
}
于 2010-08-31T20:57:30.230 に答える
0

sfValidatorErrorSchemaの代わりに a をスローすることで、フィールドの横に検証エラーが表示されるようになりましたsfValidatorError

$values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);

…になる…</p>

try
{
    $values['dynamic_validation'] = $validator->clean($values['dynamic_validation']);
}
catch(sfValidatorError $e)
{
    $this->getErrorSchema()->addError($e, 'dynamic_validation');
    throw $this->getErrorSchema();
}

これがこの結果を得る最善の方法かどうかはわかりませんが、現時点ではうまくいっているようです。

于 2012-05-08T05:00:49.793 に答える
0

1) ポスト バリデータでは、 $values パラメータを使用して値にアクセスできます。$values['options'] を使用するだけで問題ありません... または、コードの別の部分からこの値にアクセスしたかったですか? $this->getObject()->widgetSchema['options'] フォームがオブジェクトにバインドされると、うまくいくはずです。

2) configure() メソッドはフォーム コンストラクターの最後で呼び出されるため、データベースからのオブジェクトを使用してフォームを初期化していない限り (検証は必要ありません)、値はまだバインドされておらず、アクセスもできません。しかし、フォームを $_POST から初期化したい場合は、ポストバリデーターが間違いなく私見の方法です。

于 2010-08-31T20:14:19.430 に答える