2011-11-05 34 views
7

我認爲在symfony2 FormValidator組件上創建客戶端表單驗證將非常有用。在Symfony2中創建組合的客戶端和服務器端驗證

做到這一點的最好方法是將驗證約束傳遞給窗體視圖。 有了這些信息,將有可能使呈現一個表單域是這樣一個模板:

<div> 
    <label for="form_email">E-Mail</label> 
    <input 
     id="form_email" type="text" name="form[email]" value="" 
     data-validation-constraints='{"NotBlank":{},"MinLength":{"limit":6}}' 
    /> 
</div> 

然後JavaScript的部分將是找到具有data-validation-constraints屬性的所有<input>元素和創建正確的驗證爲他們。

要將驗證約束傳遞給窗體視圖,我認爲最好的方法是創建一個窗體類型的擴展。這是我的問題的重點:這是正確的方法嗎?這怎麼可能?

此刻我的表單類型的擴展名看起來像這樣:

use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormBuilder; 

class FieldTypeExtension extends \Symfony\Component\Form\AbstractTypeExtension{ 

    public function getExtendedType(){ 
     return 'field'; 
    } 

    public function buildView(FormView $view, FormInterface $form) 
    { 
     // at this point i didn't find a way to get the 
     // validation constraints out of the $form 
     // the `getAllValidationConstraints` here is just an example 
     $view->set('validation_constraints', $form->getAllValidationConstraints()); 
    } 

} 

我怎樣才能得到應用到一個表單字段都驗證約束了FormInterface對象的?

+0

@ alessandro1997這束試圖解決正如我所描述的同樣的問題,但在一個非常不同的方式新的Symfony 2束。它目前僅適用於實體中註釋中定義的約束條件。我想得到所有的限制,不管它們來自哪裏。我想用'isValid'方法使用相同的機制來查找constaints。 – ausi

回答

0

你可以做一些事情simplier:

的的FieldType已經通過一個ATTR屬性,這是直接爲ATTR VAR查看傳遞的形式。您最好修改此表單的屬性以便添加您的數據驗證約束條件屬性,因爲它可以避免您還需要自定義表單主題以處理新的var。

<?php 

namespace MyBundle\Form\Type; 

use Symfony\Component\Form\AbstractTypeExtension; 
use Symfony\Component\Form\FormBuilder; 

class FieldTypeJsValidationExtension extends AbstractTypeExtension 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $attr = $builder->getAttribute('attr'); 
     $attr = array_merge(
      array(
       'data-validation-constraints' => $this->aMethodThatRenderTheFinalContentOfTheValidationAttribute(), 
      ), 
      $builder->getAttribute('attr') 
     ); 

     $builder->setAttribute('attr', $attr); 
    } 

    public function getExtendedType() 
    { 
     return 'field'; 
    } 

} 
+0

您正在使用buildForm方法。此時你沒有對FormInterface對象的引用。我想我需要一個對這個對象的引用來獲得當前表單域的所有約束。但我不知道... 我的問題是如何將所有驗證約束應用於FormInterface對象之外的一個表單字段 – ausi

2
檢查

相應的開問題"[Form] JavaScript validation"其中包含這是否一個參考SimpleThingsFormExtraBundle(或更確切地說一個具體的,該束的開放PR)。