2012-03-14 76 views
2

我有一個Symfony2中沒有連接到任何實體的表單。它有一個子表單,其中1..n個實例可以在前端動態添加。驗證未連接到Symfony 2中的實體的子表單

$builder 
    //car data 
     ->add('cars', 'collection', array(
      'label' => ' ', 
      'type' => new CarLeasingType(), 
      'allow_add' => true, 
      'prototype' => true, 
     )) 

父窗體有它的驗證來驗證窗體中的其他字段。

public function getDefaultOptions(array $options) 
{ 
    $collectionConstraint = new Collection(array(
     'fields' => array(
      //some fields an their validation 
     ), 
     'allowExtraFields' => true, 
    )); 

    return array('validation_constraint' => $collectionConstraint); 
} 

子窗體(CarLeasingType類型)有它自己的驗證。我現在的問題有兩個層次:

  • 我必須設置「allowExtraFields」爲true父窗體驗證約束,否則我得到了像The fields 0, 1 were not expected
  • 子窗體驗證約束的消息完全不執行。

要解釋爲什麼從子窗體的cars領域被確定爲01這裏是JavaScript函數我用從data-prototype屬性動態生成的子窗體:

function add_dynamic_field(holderId) { 
    var collectionHolder = $('#' + holderId); 
    if (0 === collectionHolder.length) return false; 
    var prototype = collectionHolder.attr('data-prototype'); 
    form = prototype.replace(/<label class=" required">\$\$name\$\$<\/label>/, ''); 
    form = form.replace(/\$\$name\$\$/g, collectionHolder.children().length); 
    collectionHolder.append(form); 
} 

我如何可以驗證也每個子表單動態添加?

回答

1

也許這些方針的東西可能有幫助:

public function somexAction() 
{ 

    //get objects through the $form object 

    //get validator service 
    $validator = $this->get('validator'); 

    //validate objects manually 
    foreach object as obj 
     $errors = $validator->validate($obj); 
    if (count($errors) > 0) { 
     //... 
    } else { 
     //.... 
    } 
} 

基本上,這意味着以驗證服務的優勢。

http://symfony.com/doc/current/book/validation.html

採取有關驗證方法/詳細信息等,檢查出api