2011-08-04 61 views
0

我的行動:Symfony:如何將Doctrine Collection傳遞給Form作爲默認值?

public function executeEdit(sfWebRequest $request) 
{ 
    // Get the object 
    $article = $this->getRoute()->getObject(); 

    // Create the form 
    $this->form = new ArticleEditForm($article); 
} 

你可以看到,$article是獲取傳遞給窗體作爲默認值學說集合。該$article對象包含了諸如「標題」,「文本」,「作家」等

一個領域但這會導致錯誤表單製作:

500 | Internal Server Error | Doctrine_Record_UnknownPropertyException 
Unknown record property/related component "_csrf_token" on "article" 

所以基本上,形式試圖使用Doctrine Collection來填充表單元素的默認值。但在那個對象中顯然沒有csrf_token ...但它仍然試圖找到一個用作默認值...

然後會發生什麼,如果你有一個窗體總是有額外的空字段是空的,但其他人有傳遞的默認值。如果這些空字段沒有在教義收集組值,那麼你會得到一個錯誤...

現在,很明顯我可以做一個簡單的陣列的時間提前,我指定默認值,並傳遞:

$defaults = array('title' => $article->title, 'text' => $article->text, 'author' => $article->author); 
$this->form = new ArticleEditForm($defaults); 

This Works。我的問題是,出於簡單的原因,上面的「文章」就是一個例子。實際上我的表格裏面有大約30個字段。所以這個解決方案工作的唯一方法就是不得不在數組中手動​​指定30個單獨的默認值。顯然,從維護角度來看,這是一個糟糕的解決方案。

我想Symfony的開發人員很聰明,想出一個好的解決方案,但我找不到它......任何線索?

回答

0

我發現我的問題。我的自定義表單正在擴展BaseForm。一旦我改變了這個擴展BaseArticleForm然後我能夠成功地將文章Doctrine Collections作爲默認值傳遞。

0

這個問題是關於你的表單不會創建_csrf_token。您可以在模板頁面創建表單時添加它:

<?php 
    echo $form->renderFormTag(url_for('article/edit')) 
    echo $form->render(); 
?> 
    <input type="hidden" name="form[_csrf_token]" value="<?= $form->getCSRFToken(); ?>"> 
    <input type="submit" value="Submit" /> 
</form> 
+0

這是不正確的。 CSRF令牌由表單創建。它使用上面提到的代碼進行渲染,或者在模板中使用'echo $ form-> renderHiddenFields();'。無論您是否選擇渲染,錯誤依然存在。 –

相關問題