2012-07-07 31 views
13

Trong thực thể thuyết của tôi, đó là data_class cho hình thức của tôi, tôi có một tài sản tập tin định nghĩa như thế này:Non trống trường đầu vào tập tin ở dạng Symfony2

/** 
    * Image. 
    * 
    * @Assert\NotBlank 
    * @Assert\File 
    * @Assert\Image(minWidth="138", minHeight="96") 
    */ 
    protected $file; 

Ngoài ra, thêm vào nó để tạo kiểu với ->add('file', 'file') ...

Tạo đối tượng hoạt động hoàn hảo, nhưng vấn đề là khi tôi sử dụng biểu mẫu để cập nhật thực thể này. Nó yêu cầu tệp một lần nữa, vì nó có @Assert \ NotBlank. Vì tôi có các trường khác trong biểu mẫu này nên tôi không muốn tải lại hình ảnh lên mọi bản cập nhật.

Khi tôi xóa @Assert \ NotBlank, everithing hoạt động tốt, nhưng tôi muốn trường tệp này là bắt buộc.

Bất kỳ ý tưởng nào?

Trả lời

7

Bạn có hai cách ra tình trạng này và cả hai dựa vào Callback xác nhận: (Symfony callback)

Hoặc thêm boolean tên isUpdate để bạn thực thể đó sẽ không được tiếp tục tồn và sẽ cho validator mà hoạt động đã được thực hiện. Phương pháp này được mô tả đầy đủ trong liên kết ở trên.

Một cách khác để giải quyết vấn đề này là thêm trình xác thực gọi lại vào loại Biểu mẫu của bạn trực tiếp. Một lần nữa, một số isUpdate cờ sẽ là cần thiết nhưng lần này trong vòng loại Form (vượt qua nó thông qua constructor):

if ($this->isUpdate == false){ 
    $builder->addValidator(new CallbackValidator(function(FormInterface $form){ 
     if ($form['image_file']->getData() == NULL){ 
      $form->addError(new FormError('You need to specify image file.'));     
     } 
    })); 
} 

Có lẽ đó là cách đơn giản hơn để đạt được xác nhận mong muốn nhưng tôi bắt gặp hai vài tháng trở lại.

Hy vọng điều này sẽ giúp ...

+1

Cảm ơn, điều đó đã cho tôi ý tưởng, definatelly :) Tôi không hiểu tại sao bạn cần một isUpdate boolean, và làm thế nào là giá trị thiết lập? Tôi đã kiểm tra 'if (null! == $ this-> getId())'. Bạn có thể kiểm tra gist của tôi https://gist.github.com/3066507. Nó thậm chí còn tuyệt vời hơn trong Symfony 2.0 khi bạn có thể chuyển ngữ cảnh tới trình xác nhận hợp lệ https://gist.github.com/3066488. Cảm ơn một lần nữa. – umpirsky

+0

Ồ, điểm tốt. Bằng cách so sánh id thực thể với null, bạn chắc chắn có thể nói liệu hoạt động là "thêm" hay "cập nhật". Và gist thứ hai là giải pháp hoàn hảo tôi đoán :) –

+0

Vâng, quá xấu họ đã đóng ExecutionContext và không thể đặt đường dẫn thuộc tính từ bên ngoài lớp nữa https://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky

6

Bạn cũng có thể sử dụng Nhóm xác thực cho điều đó. Một nhóm xác thực (có thể là nhóm mặc định) sẽ được tạo và thứ hai để cập nhật.

+0

Nên là câu trả lời được chấp nhận IMO – Shady

+0

Tôi biết điều này thực sự cũ nhưng bạn có thể xây dựng một chút không? Tôi đang đấu tranh để hiểu tài liệu về điều đó, nó không thực sự thân thiện. Nếu bạn có thể làm cho nó v3-compliant nó sẽ thực sự tốt đẹp để –

Các vấn đề liên quan