0

私は symfony2.3 と admin ジェネレーター バンドルを使用しています。ファイル フィールドを持つエンティティがあります。そのフィールドを必須としてマークしたいと思います。いくつかの方法を試しましたが、期待どおりに機能しません。

これは、エンティティ内の私のファイル フィールドです。

/**
 * @Assert\NotNull()
 * @Assert\Image(
 *     maxSize="50k",
 *     maxSizeMessage = "El tamaño maximo de la imagen es de {{ limit }}kb",
 *     minWidth = 237,
 *     maxWidth = 237,
 *     minHeight = 170,
 *     maxHeight = 170,
 *     minWidthMessage = "La imagen debe tener {{ min_width }}px de ancho.",
 *     minHeightMessage = "La imagen debe tener {{ min_height }}px de alto.",
 *     maxWidthMessage = "La imagen debe tener {{ max_width }}px de ancho.",
 *     maxHeightMessage = "La imagen debe tener {{ max_height }}px de alto."
 * )
 * @Vich\UploadableField(mapping="product_mapping", fileNameProperty="fileName")
 *
 * @var File $file
 */
protected $file; 

/**
 * @var string $fileName
 * 
 * @ORM\Column(name="fileName", type="string", length=255, nullable = false)
 */
protected $fileName;   

@Assert\NotNull() と nullable = false に注意してください。

この構成では、新しいエンティティの作成を検証できます (ファイル フィールドを空にすると、管理ジェネレーター バンドルにメッセージが表示されます: フィールドを null にすることはできません...)。 ) 作成されたエンティティ、NotNull の検証が発生します (以前に有効なファイルで作成されたエンティティで)。エンティティを更新できるように、ファイルを再度アップロードする必要があります。

これは管理ジェネレーター (entity-generator.yml) の構成です。

file:
    label:            Imagen
    formType:         single_upload
    dbType:           string        
    addFormOptions:
        #required:  true               ## this launch a exception
        previewFilter:  150x150_outbound_thumnail
        help:     "La imagen del producto debe tener 237px de ancho y 170px de alto, y no debe exceder los 50kb."   

前もって感謝します

4

2 に答える 2

0

この問題に対する私自身の解決策を共有したいと思います:

問題は、エンティティのファイル プロパティに対してファイル (または最大幅、最大高さなどの画像) 制約を設定し、NotNull 制約も設定したときに発生しました。言い換えれば、ファイルがなりたいようになっているかどうかを確認し、そのファイルを必要とするようにしたいのです。私は Vich Uploadable Bundle を使用しています。

問題は、ファイルの制約が失敗し、ファイルがエンティティに読み込まれず、フォームが再表示されたときに再度ファイルを表示して Admin Generator Bundle がクラッシュすることです。

私がすべきこと: NotNull 制約を使用しないでください。

ファイル エンティティで、新しいプロパティを作成します。requiredFile はプライベートとして、DB に対して永続的ではありません。また、コールバックの制約を作成します: validateRequiredFile. コンストラクターで requiredFile = true を設定すると出来上がりです!

最終的なエンティティは次のようになります。

/** * @Vich\Uploadable * @ORM\Table(name="table_name") * @Assert\Callback(methods={"validateRequiredFile"}) * @ORM\Entity(repositoryClass="repo/path") */クラス製品{ ...

/**
 * Non persistent, just to determinate if file is required
 * @var string 
 */
private $requiredFile;

...

/**
 * Constructor
 */
public function __construct()
{        
    $this->requiredFile = true;      
}   

...

/**
 * This function is to validate the requires files
 * 
 * How to use:
 *    In the contructor of the entity who inherit from BaseFile, set requiredFile property as true, Ex:
 *          public function __construct()
 *              {   
 *                  ...     
 *                  $this->requiredFile = true;
 *                  parent::__construct();        
 *              }
 * 
 * @param \Symfony\Component\Validator\ExecutionContextInterface $context
 */
public function validateRequiredFile(ExecutionContextInterface $context){
    //get the validated object
    $object = $context->getValue();

    //to know if is a creation or a update
    $newObject = $object->getId() == null;

    //validation
    if ($newObject && empty($this->file) && $this->requiredFile === true ) {
        $context->addViolationAt('file', "The file is required", array(), null);
        $this->fileName = Constants::RELATIVE_NOT_VALID_IMAGE_PATH;
    }

    //in case we dont want to validate file as required, and no file was updated, clean property "fileName" who was setted in constructor 
    if ($newObject && empty($this->file) && empty($this->requiredFile)) {
        $this->fileName = null;
    }

}  

PS: 検証が失敗した場合に備えて、表示に使用するカスタム イメージを作成します。すべてのサイトからアクセスできるように、web フォルダーに配置しました。その画像へのパスは、Constants::RELATIVE_NOT_VALID_IMAGE_PATH に保存されます。

PS1: 関数 validateRequiredFile は BaseFile エンティティ ( @ORM\MappedSuperclass ) にあるように設計されており、エンティティに共通のすべてのプロパティをファイルに配置します。そういう意味でもこの機能は使いやすいです。

私はこれが誰かを助けることを望みます、それは私にいくらかの時間がかかりました:(

于 2014-03-10T21:44:18.433 に答える
0

single_upload はサポートされていないため、使用すると問題が発生します。数か月前、このプロジェクトはフォーム タイプをAvocodeFormExtensionに変更しましたが、変更ログでのみ言及されていました。なぜわざわざドキュメントを編集する必要があるのでしょうか?

それでも single_upload を使用したい場合は、コントローラーでファイルの存在を検証してみてください。このフィールドを必須とマークすると、ファイルが添付されたオブジェクトを編集する場合でも、毎回アップロードする必要があります。ブラウザからサーバーに送信されるフォームには、オブジェクトではなくファイルが含まれている必要があります。(私は FormType またはテンプレートを使用して、newActions で必須を渡し、editActions で必須を渡しません)

幸運を!

于 2014-03-05T20:34:45.770 に答える