2013-10-24 43 views
2

我試圖用Symfony2(v2.3.6)創建一個表單並利用自動生成的HTML5約束。Symfony2自動生成的HTML5約束不起作用

所以,我創建了一個非常簡單的形式只用一個領域有RegEx約束:

public function formAction() 
{ 
    $form = $this->createFormBuilder()->add('animalName', 'text', array(
     'constraints' => new \Symfony\Component\Validator\Constraints\Regex('/(cat|dog)/') 
    ))->getForm(); 

    if ($this->getRequest()->isMethod('POST')) { 
     $form->bind($this->getRequest()); 
    } 

    return $this->render('MeTestBundle:Default:form.html.twig', array('form' => $form->createView())); 
} 

而且,嫩枝,沒有什麼不尋常的。

{% extends "::base.html.twig" %} 

{% block body %} 
    {{ form(form) }} 
{% endblock %} 

那麼,作爲一個最終的結果,我期待animalName領域具有pattern屬性與價值(cat|dog)。正如它在this link中所述,Symfony將生成此約束的htmlPattern(我測試了它,它返回.*(cat|dog).*,這沒問題),並且此屬性將用於客戶端驗證,使用input元素上的pattern HTML屬性。但沒有pattern屬性,生成的代碼如下:

<input type="text" id="form_animalName" name="form[animalName]" required="required" /> 

一個小小的研究之後,我認爲負責的猜測pattern屬性的值是Symfony\Component\Form\Extension\Validator\ValidatorTypeGuesser,但這項服務是永遠不會初始化(我寫的一個die在它的構造函數,也迫使容器獲得服務來檢查是否達到die)。

我錯過了什麼嗎?

+0

我在Symfony 2.5中仍然有這個問題。你有沒有解決它? – Paulpro

+0

@Paulpro基本上,Symfony開發人員告訴我,這種行爲是故意的,當你手動設置表單類型時,就會發生這種行爲,這是我的POV的無意義:https://github.com/symfony/symfony/issues/3661 – eagleoneraptor

回答

0

可以嘗試下面的代碼:

$form = $this->createFormBuilder() 
      ->add('animalName', 'text', array(
       'pattern' => '/(cat|dog)/' 
      )) 
      ->getForm(); 

渲染HTML我:

<div id="form"> 
<div><label for="form_animalName" class="required">Animal name</label> 
<input type="text" id="form_animalName" name="form[animalName]" required="required" pattern="/(cat|dog)/"> 
</div> 
<input type="hidden" id="form__token" name="form[_token]" value="kAg4Ww2oH9WQX6fPSyvJd4pNx-xE7B4G0NbIXtUWWDY"> 
</div> 

我得到了答案來自: https://github.com/symfony/symfony/issues/3766 請看看它的詳細信息。