私はページオブジェクトを持っています:
Page:
actAs:
Timestampable: ~
I18n:
fields: [name,content,attachment,course_name, course_description ]
actAs:
Sluggable: { fields: [name], uniqueBy: [lang, name], canUpdate: true }
columns:
...
is_course: { type: boolean }
course_name: { type: string(255) }
course_description: { type: string(500) }
そして、i18n フォームが埋め込まれた PageForm:
//PageForm.class.php
public function configure()
{
...
$this->embedI18n(array('pl','en'));
$this->widgetSchema->setLabel('en', 'Angielski');
$this->widgetSchema->setLabel('pl', 'Polski');
}
is_course が false に設定されている間、フィールド course_name と course_description は必要ありません。ただし、is_course が有効になっている場合、検証は course_name と course_description が必要であるというエラーをスローする必要があります。
「Symfony Advanced Forms」ガイドとその他の投稿を読みましたが、PageForm で sfValidatorCallback を使用するか、PageTranslationForm で PostValidator を使用する必要があるかわかりません。私はこの方法で sfValidatorCallback を使用しようとしました:
//PageForm.class.php
public function configure()
{
...
$this->validatorSchema->setPostValidator(
new sfValidatorCallback(array('callback' => array($this,'checkCourses')))
);
}
public function checkCourses($validator, $values)
{
if($values['is_course'])
{
if($values['pl']['course_name'] && !$values['pl']['course_description'])
{
$error = new sfValidatorError($validator,'Required filed');
throw new sfValidatorErrorSchema($validator, array( _what_name_ => $error));
}
}
return $values;
}
しかし、$values['pl']['course_description'] でエラーをスローする方法がわかりません。これは、Symfony API が _what_name_ はエラーの配列であるべきだと言っているためです..
symfony でフォームを検証する過程で何が起こっているのか、本当に混乱しています。
//編集
PageTranslationForm にいくつかの変更を加えたところ、次のようになりました... //PageTranslationform.class.php
public function configure()
{
//......
$this->validatorSchema->setPostValidator(
new sfValidatorCallback(array('callback' => array($this,'checkCourses')))
);
//.....
}
public function checkCourses($validator, $values)
{
if($values['course_name'] && !$values['course_description'])
{
$error = new sfValidatorError($validator,'Required');
throw new sfValidatorErrorSchema($validator, array( 'course_description' => $error));
}
elseif(!$values['course_name'] && $values['course_description'])
{
$error = new sfValidatorError($validator,'Required');
throw new sfValidatorErrorSchema($validator, array( 'course_name' => $error));
}
return $values;
}
そして、ほとんど機能しますが...このバリデーターは、PageForm is_course が「true」に設定されている場合にのみ有効にする必要があります。PageTranslationForm の checkCourses 関数で PageForm からフィールド「is_course」にアクセスするにはどうすればよいですか?
//解決
ジェレミーに感謝します。私はあなたのアイデアを使用し、最終的にこの解決策を得ました:
//PageForm.class.php
public function configure()
{
$this->embedI18n(array('pl','en'));
$this->widgetSchema->setLabel('en', 'Angielski');
$this->widgetSchema->setLabel('pl', 'Polski');
//.....
if($this->getObject()->getIsCourse())
{
foreach($this->getEmbeddedForms() as $key => $form)
{
$this->validatorSchema[$key]->setPostValidator(
new sfValidatorCallback(array('callback' => array($form,'checkCourses')))
);
}
}
}
//PageTranslationForm.class.php
//configure etc
public function checkCourses($validator, $values)
{
$errorSchema = new sfValidatorErrorSchema($validator);
if($values['course_name'] && !$values['course_description'])
{
$errorSchema->addError(new sfValidatorError($validator,'required'), 'course_description');
}
elseif(!$values['course_name'] && $values['course_description'])
{
$errorSchema->addError(new sfValidatorError($validator,'required'), 'course_name');
}
elseif(!$values['course_name'] && !$values['course_description'])
{
$errorSchema->addError(new sfValidatorError($validator,'required'), 'course_name');
$errorSchema->addError(new sfValidatorError($validator,'required'), 'course_description');
}
if (count($errorSchema))
{
throw new sfValidatorErrorSchema($validator, $errorSchema);
}
return $values;
}
アドバイスありがとうございます。完璧に動作します。お役に立てば幸いです:)