私は Symfony 初心者で、フォーム フィールドまたは別のフィールドに基づいてフォーム フィールドを検証する最善の方法を視覚化しようとして失敗しました。ケース: フォームは、生年月日または年齢のいずれかを要求します。生年月日が入力されている場合、年齢は無視されます。age が入力され、dob が空の場合、dob は今日の日付から年数を引いたものと言われます。どちらも入力されていない場合、検証エラーがスローされます。私はこれを Smarty 検証で達成しました。学習課題として、Symfony でアプリケーションを再現しようとしています。
両方のフィールドがエンティティのプロパティであるこのソリューションを見てきました。私の場合、年齢はありません。そのため、そのソリューションをどのように適用するかは明確ではありません。ポインタをいただければ幸いです。
ありがとう。
ジョージ PS: (編集: dreck を削除) PPS: (編集: ほぼ動作するバージョンのためのスペースを作るために削除) フォーム:
// src\Mana\AdminBundle\Resources\views\Form\Type\NewClientType.php
namespace Mana\AdminBundle\Form\Type;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Mana\AdminBundle\Validator\Constraints;
class NewClientType extends AbstractType {
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array('validation_groups' => 'client_new',
'validation_constraint' => new DOBorAge(),
));
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('fname', null, array('required' => false));
$builder->add('sname', null, array('required' => false));
$builder->add('dob', 'birthday', array('widget' => 'single_text', 'required' => false));
$builder->add('age', null, array('mapped' => false, 'required' => false));
}
public function getName() {
return 'client_new';
}
}
サービス:
services:
client_new:
class: Mana\AdminBundle\Validator\Constraints\DOBorAgeValidator
scope: request
tags:
- { name: validator.constraint_validator, alias: dobage_validator}
バリデーター:
// src\Mana\AdminBundle\Form\Type\DOBorAge.php
namespace Mana\AdminBundle\Form\Type;
use Mana\AdminBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
class DOBorAge extends Constraint {
public $message = 'Either a date of birth or age must be present';
public function validatedBy() {
return 'dobage_validator';
}
public function getTargets() {
return Constraint::CLASS_CONSTRAINT;
}
}
と
// src\Mana\AdminBundle\Validator\Constraints\DOBorAgeValidator.php
namespace Mana\AdminBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;
class DOBorAgeValidator extends ConstraintValidator {
protected $request;
public function __construct(Request $request) {
$this->request = $request;
}
public function validate($value, Constraint $constraint) {
var_dump($this->request->request->get('client'));
die();
return true;
}
}