2

私の Symfony2 アプリケーションには、主にエンティティの永続化に使用されるフォームがありますが、ファイルをアップロードするために使用されるマップされていないフィールドを 1 つ追加しました。このフィールドは、その後処理されて削除されます。ただし、この追加フィールドを検証する方法がわかりません。

buildForm()ここでは、フォーム クラスのメソッドで定義されています。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text', array('label' => 'Name'))
        // ...
        ->add('data', 'file', array(
            'label'    => 'CSV Data File',
            'mapped'   => false,
            'required' => false,
        ));
}

最初に、このフィールドの検証をバンドルのvalidation.ymlファイルに追加しようとしましたが、このフィールドはエンティティの一部ではないため、エラーが発生しました。

My\Bundle\Entity\MyEntity:
  properties:
    data:
      - File:
          maxSize: 1024k
          mimeTypes: text/*
          mimeTypesMessage: Please upload a CSV file

私の次の試みは、フォームクラス自体に制約を追加することでしたが、オブジェクトではなく、この方法でのみ配列を検証できるようです。これは、主にエンティティに関連付けられているためだと思います。

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $collectionConstraint = new Collection(array(
        'data' => new File(array(
            'maxSize'          => '1024k',
            'mimeTypes'        => 'text/*',
            'mimeTypesMessage' => 'Please upload a CSV file',
        )),
    ));

    $resolver->setDefaults(array(
        'data_class'  => 'My\Bundle\Entity\MyEntity',
        'constraints' => $collectionConstraint,
    ));
}

ドキュメントから、余分なフィールドを単独で検証するために使用できるように見えますが$this->get('validator')->validateValue();、フォーム全体を一度に検証し、マップされていないフィールドに関連するエラーをフィールド自体とともに表示したいと思います。

誰にもアイデアはありますか?

4

1 に答える 1

8

property_path=null をデータ フォーム フィールドに渡すだけです。プロパティ パスは、関連するエンティティ フィールドを決定するために使用されます。その値を null に設定することにより、フィールドの値をエンティティに提供しないようにフォームに指示します。

// ...
->add('data', 'file', array(
      'label'         => 'CSV Data File',
      'mapped'        => false,
      'required'      => false,
      'property_path' => null,
));
// ...

更新:

このフィールド ID を検証するには、埋め込みフォームを作成し、データ フィールドと検証制約を渡します。

class dataType extends AbstractType

    // ...

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('data', 'file', array(
            'label'    => 'CSV Data File',
            'required' => false,
        ));
    }

    public function getDefaultOptions(array $options)
    {
        $collection = new Collection(array(
            'data' => new NotBlank(),
            // ...
        ));

        return array(
            'validation_constraint' => $collection,
        );
    }

    //...

エンティティ フォーム クラスを編集します。

->add('data', 'file', array(
      'label'         => 'CSV Data File',
      'mapped'        => false,
      'required'      => false,
));

と置換する:

->add('custom', new DataType(), array(
      'mapped'        => false,
));
于 2012-10-25T15:35:58.337 に答える