2012-05-27 77 views
4

我在我的Symfony2項目中有一個「評級」實體的自定義表單類型。它有一個字段,即整數。然後,我爲此實體創建了表單。這裏下面的代碼:當我按下在我的html頁面提交按鈕Symfony2 - 爲什麼隱藏字段中的整數值不被識別爲整數?

class RatingType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options){ 
    $builder->add('value', 'hidden', array('data' => 113)); 
    } 

    public function getDefaultOptions(array $options){ 
    return array(
     'data_class' => 'Acme\ArticleBundle\Entity\Rating', 
    ); 
    }  

    public function getName() { 
    return 'spesax_productbundle_pratingtype'; 
    } 
} 

,形式不進行驗證,並在屏幕上顯示一個「不是一個整數」錯誤信息!
爲什麼Symfony2不會將值轉換爲整數? 我能做些什麼來解決這個問題?

+0

它使用整數字段類型進行驗證嗎? ('$ builder-> add('value','integer'...') – bostaf

+0

當然,它在這種情況下有效 – JeanValjean

+0

我這麼認爲,但我不得不問,我試圖找到一種方法來設置字段如果你使用[Type constraint](http://symfony.com/doc/current/reference/constraints/Type.html)來嘗試你的表單嗎? ? – bostaf

回答

7

當在FormType中使用hidden而不是integer類型時,symfony不知道該字段的期望值,因此它假設一個字符串。將表單綁定到實體時,隱藏字段以字符串形式存儲到實體字段中。

如果您使用type="integer"進行驗證,驗證實體失敗,因爲該值不是一個整數,而是一個可以轉換爲整數的字符串(因爲doctrine看起來是否可以轉換爲給定類型,所以保存它將起作用)。

訣竅是在實體的驗證註解使用type="numeric這將檢查如果該字段可以轉化爲一個整數,而不是如果該值是一個真正的整數現在。

+0

這也適用於如果表單字段被定義爲類型'integer',但具有選項'disabled = true' ... – SimonSimCity

+0

'numeric'是否允許小數位?我如何在一個註釋中指定它應該允許小數位(因爲它實際上是一個'float'),但在另一個註釋中它不應該(因爲它實際上是一個'integer')? – Timwi

1

感謝Sgoettschkes 。回答這個工作對我來說這是一個例子:

/** 
* @var integer 
* @Assert\NotBlank() 
* @Assert\Type(type="numeric") 
* 
* @ORM\Column(name="value", type="integer", nullable=false) 
*/ 

private $value; 
0

下次使用:

$builder->add('fieldname', 'integer', array('attr' => array('style' => 'display: none'))) 
+1

雖然這是一個巧妙的把戲,但它是一個關注分離違規:你不應該控制從PHP代碼的視圖狀態。 –

0

另一種替代方法是在其集合方法中對實體的參數進行類型轉換。例如:

/** @var integer $value */ 
private $value; 

public function setValue($val){ 
    $this->$val = (int) $val; 
    return $this; 
} 
0

Beltouche的回答爲我工作:通過在實體它類型轉換爲整數它保存在數據庫更新時,另有學說認爲字段不匹配。

因爲12345!=='12345'我看到一個不必要的更新我的$ id字段,即使沒有其他的形式/實體正在改變。

/** @param int $id */ 
private $id; 

public function setId($id){ 
    $this->$id = (int) $id; 
    return $this; 
} 
相關問題