0

多くのネストされたフィールドセットを持つ複雑なフォームがあります。別のフィールドセットのフィールド (-s) に応じて、一部のフィールドを検証する必要があります。したがって、他のフィールドセット (サブフィールドセットのみ) にアクセスできないため、すべてgetInputFilterSpecification()の検証ルールを で直接定義することはできません。Fieldsetこれを行う唯一の方法は、Form検証を拡張することです。右?もしそうなら、これを行う方法は?

MyForm extends Form
{
    public function isValid()
    {
        $isFormValid = parent::isValid();
        $isFieldXyzValid = // my additional validation logic
        if(! $isFieldXyzValid) {
            $fieldXyz->setMessages(...);
        }
        return $isFormValid && $isFieldXyzValid;
    }
}

このような?または、この問題を解決するためのよりクリーンな方法はありますか?

4

1 に答える 1

0

私は以前のプロジェクトで似たようなものをすでに開発しました。

これを行うために、フォームを取得して動的フィールドセットを設定するサービスと、明らかにカスタム検証ルールを使用しました。

コントローラーで、フォームを取得します (依存性注入 formManager (ポリフィルの有無にかかわらず) を使用)。

$form = $this->formManager->get('{your form}');

サービスを呼び出して、フォームを提供します。

そして、あなたのサービスでは、あなたが好きなことをすることができます:

  • (DB などから) 自分のものを取得して、どのフィールドが必須かを判断します
  • フォームの Foreach
  • フィールドセットの追加または削除
  • validationGroup フィールドを追加または削除する
  • フィルターを追加または削除する
  • バリデーターを追加または削除する

$stuff教義コレクションの要素であるforeachで(サンプル)経由でそれらを実行しました

$nameFieldset = 'my_fieldset-'.$stuff->getId();
            $globalValidator = new GlobalValidator();
            $globalValidator->setGlobalValue($gloablValue);

            $uoValidator = new UcValidator();
            $uoValidator->setOptions(array(
                'idToValidate' => $stuff->getId(),
                'translator' => $this->translator
            ));

            $globalValidator->setOptions(array(
                'idToValidate' => $stuff->getId(),
                'translator' => $this->translator
            ));

            $name = 'qty-'.$stuff->getId();

            $form = $this->setFilters($form, $name, $nameFieldset);
            $globalValidator->setData($data);
            $form = $this->setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset);

setFilters と setValidators は、フィルターとバリデーターをフィールドに追加するカスタム メソッドです (これもカスタムです)。

/**
 * @param myForm $form
 * @param $name
 * @param string $nameFieldset
 * @return myForm
 */
public function setFilters($form, $name, $nameFieldset)
{
    $form->getInputFilter()->get('items')->get($nameFieldset)
        ->get($name)
        ->getFilterChain()
        ->getFilters()
        ->insert(new StripTags())
        ->insert(new StringTrim());

    return $form;
}


/**
 * @param myForm $form
 * @param $name
 * @param $globalValidator
 * @param $uoValidator
 * @param $nameFieldset
 * @return myForm
 */
public function setValidators($form, $name, $globalValidator, $uoValidator, $nameFieldset)
{
    $optionsSpace = [
        'translator' => $this->translator,
        'type' => NotEmpty::SPACE
    ];
    $optionsString = [
        'translator' => $this->translator,
        'type' => NotEmpty::STRING
    ];
    $optionsDigits = [
        'translator' => $this->translator,
    ];
    $form->getInputFilter()->get('items')
        ->get($nameFieldset)
        ->get($name)
        ->setRequired(true)
        ->getValidatorChain()
        ->attach($uoValidator, true, 1)
        ->attach($globalValidator, true, 1)
        // We authorize zéro but not space nor strings
        ->attach(new NotEmpty($optionsSpace), true, 2)
        ->attach(new NotEmpty($optionsString), true, 2)
        ->attach(new Digits($optionsDigits), true, 2);
    return $form;
}
于 2016-08-23T10:07:38.290 に答える