環境: Symfony2.2 + Propel 1.6
モデル (顧客) にリンクされている「顧客」フォームを検証して、「アカウントの作成」(フォーム 1) と「ログイン アカウント」(フォーム 2) を管理しようとしています。ユーザーは「契約条件に同意します」チェックボックスをオンにする必要があり、このフィールドはモデルにリンクされていません。グローバルな「validation.yml」ファイルを使用して検証ルールを管理しています。
validation.yml ファイルでチェックボックスがオンになっていることを検証する方法がわかりません。
私はいくつかのテクニックを試しました:
1/ ルールを validation.yml に入れ、モデルに getter/setter を追加します。
検証.yml:
MyProject\Model\Customer:
properties:
email:
- NotBlank:
groups: [login, create]
message: Champ obligatoire.
- Email:
groups: [login, create]
message: La valeur saisie doit être un email.
cgv:
- Symfony\Component\Validator\Constraints\True:
groups: [login, create]
message: Vous devez accepter les CGV.
constraints:
- Propel\PropelBundle\Validator\Constraints\UniqueObject:
groups: [create]
fields: email
message: Cet email est déjà inscrit.
- Callback:
groups: [login]
methods:
- [MyProject\Model\CustomerQuery, isCustomerEmail]
MyProject\モデル\顧客:
class Customer extends BaseCustomer {
private $cgv;
(...)
public function setCgv($cgv) {
$this->cgv = (Boolean) $cgv;
}
public function getCgv() {
return $this->cgv;
}
}
結果: チェックボックスがチェックされていなくても、ルール「True」は問題ありません。「NotBlank」ルールを追加すると、チェック/チェック解除の両方のケースで検証が失敗しました。
2/ 「CustomerType」オブジェクトに特定の検証ルールを追加してみてください (この記事で説明されているように)
/*
*
*
* @author
*/
class CustomerLoginType extends AbstractType {
/**
*
* @param \Symfony\Component\Form\FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('email', 'text', array('required' => true));
$builder->add('fill', 'checkbox', array('mapped' => false, 'required' => false, 'data' => true));
$builder->add('cgv', 'checkbox', array('data' => true, 'mapped' => false, 'required' => true, 'validation_groups' => array('login'), 'constraints' => new True(array('message' => 'Vous devez accepter les Conditions Générales de Vente.'))));
}
/**
*
* @return string
*/
public function getName()
{
return 'customer_login';
}
/**
*
* @param \MyProject\FrontBundle\Form\Type\OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyProject\Model\Customer',
'validation_groups' => array('login')
));
}
}
結果: "validation.yml" ファイルが存在する場合、これらのルールは考慮されません。ファイル内の "Customer" エントリを削除しても機能する可能性がありますが、可能であれば保持したいと考えています。
3/「yml」ソリューションが見つからないため、最終的に次のようにコントローラー内に「手動」検証を追加しました。
$form_request = $this->getRequest()->get('customer_login');
if (!isset($form_request['cgv'])) {
$form_customer_login->get('cgv')->addError(new \Symfony\Component\Form\FormError('Vous devez accepter les Conditions Générales de Vente.'));
}
validation.yml ファイル内に「条件を受け入れる」チェックボックス ルールを追加する方法について何か考えはありますか?