2012-10-25 55 views
2

我的Symfony2應用程序中有一個表單,主要用於保存實體,但我添加了一個額外的非映射字段用於上傳文件,然後處理和刪除。但是,我無法弄清楚如何驗證這個額外的字段。當所有其他字段映射到實體時,驗證Symfony2表單類中的非映射字段

這是在我的表單類的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, 
     )); 
} 

我最初嘗試添加驗證了這一領域的bundle的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();驗證自身多餘的領域,但我還蠻想一次驗證整個形式和顯示與非映射任何錯誤領域本身。

有沒有人有任何想法?

+0

Symfony 2.0或2.1? –

+0

Symfony 2.1.3-DEV – Kris

回答

7

您可以簡單地將property_path = null傳遞給數據表單字段。屬性路徑用於確定相關實體字段,通過將其值設置爲空,您可以告訴表單不向實體提供字段值。

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

UPD:

爲了驗證這一領域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, 
)); 
+2

''mapped'=> false'做同樣的事情,但我的問題是如何驗證這個字段,而不是如何將它添加到窗體而不將它鏈接到實體。 – Kris

+0

嗯,你是對的。我有解決方案,讓我更新我的答案 –

+0

這樣做的伎倆,謝謝! – Kris