2011-04-04 73 views
1

編輯。總結:我只是想要將我的DoctrineForms擴展爲不包含某些字段的SomeForm。他們不可編輯。我想在代碼中設置固定值。希望這應該是足夠的信息,你不需要閱讀這篇文章的其餘部分...symfony 1.4教條形式 - 引入固定值字段

嗨那裏。這裏是我的情況:

  • 我已經學說產生SomeModel
  • 我對這種模式在我的兩個前端和後端應用
  • 從審美的差異這兩個CRUD屏幕之間唯一的區別(除了CRUD屏幕)在前端,一個特定的字段是FIXED。即管理員可以根據需要更改該值,但常規用戶不能。該值只是我在代碼中定義的常量。該字段不應顯示在前端添加/編輯屏幕中。

我想知道的是,什麼是「正確」的方式來做到這一點?我可以想到幾種方法來破解它,但我所做的任何事情都感覺像是一種尷尬的解決方法。

是否有任何適當的方式來做到這一點擴展我的Form類(BaseFormDoctrine)或其他適當的地方?

編輯:正如在下面的評論中指出的,我實際上是在使用教條:生成模塊顯然不同於「CRUD」。

ALSO:雖然我到現在還沒解決了這個理想,我想我知道解決的辦法是,我必須深入挖掘symfony的形式: http://www.symfony-project.org/forms/1_4/en/02-Form-Validation

+0

好的,只是爲了清除:請使用使用CRUD或Doctrine的管理生成器? – Darmen 2011-04-05 03:51:03

+0

主義管理生成器我認爲。即php的symfony教條:generate-module appname modulename ModelName – captainclam 2011-04-05 08:36:22

+0

'doctrine:generate-module'生成CRUD,而不是管理模塊。要生成管理模塊,你必須使用'doctrine:generate-admin'。我知道如何用管理模塊來幫助你,而不是CRUD,對不起。 – Darmen 2011-04-05 09:22:06

回答

3

在你的/ lib目錄/表單創建另一種形式該文件夾可以擴展您的常規表單,然後覆蓋相應的字段。以下內容將從窗體中刪除該字段,以便根本不顯示該字段。

<?php 

class FrontendSomeModelForm extends SomeModelForm { 

    public function configure() 
    { 
    unset($this["some_field"]); 
    } 

} 

或者,如果你想呈現的價值,但不允許它進行編輯,你可以做到以下幾點:

<?php 

class FrontendSomeModelForm extends SomeModelForm { 

    public function configure() 
    { 
    $this->setWidget("some_field", new sfWidgetFormPlain()); 
    } 

} 

,然後創建一個sfWidgetFormPlain小部件,只是輸出值和把它放在symfony可以找到的地方(lib/form/widget或其他東西)。

<?php 

class sfWidgetFormPlain extends sfWidgetForm 
{ 
    /** 
    * Constructor. 
    * 
    * @param array $options  An array of options 
    * @param array $attributes An array of default HTML attributes 
    * 
    * @see sfWidgetForm 
    */ 
    protected function configure($options = array(), $attributes = array()) 
    { 
     $this->addOption('value'); 
    } 

    /** 
    * @param string $name  The element name 
    * @param string $value  The value displayed in this widget 
    * @param array $attributes An array of HTML attributes to be merged with the default HTML attributes 
    * @param array $errors  An array of errors for the field 
    * 
    * @return string An HTML tag string 
    * 
    * @see sfWidgetForm 
    */ 
    public function render($name, $value = null, $attributes = array(), $errors = array()) 
    { 
    //optional - for easy css styling 
    $attributes['class'] = 'plain'; 

    return $this->renderContentTag('div', $value, $attributes); 
    } 
} 

然後,您使用此表單,而不是您正常的那個,而您不希望能夠編輯該表單。檢查symfony文檔以瞭解如何執行此操作,具體取決於您是在模塊中顯示它還是通過管理生成器。

+0

這很酷,接近我想要的。感謝您的詳細回覆。但是,我不想讓它渲染。有什麼辦法可以在我的新窗體的configure()方法中,我可以說像$ this-> deleteWidget(「password_md5」)? – captainclam 2011-04-05 17:20:08

+0

另外,對於我在這裏缺乏的知識感到抱歉,這只是sfForm小部件渲染的深度,現在對我來說似乎完全像伏都教。 – captainclam 2011-04-05 17:20:46

+0

詳細說明這一點。我注意到,如果我改變你的sfWidgetFormPlain render()方法返回而沒有做任何事情,那麼它*幾乎*做我想要的...但我仍然得到標籤呈現...我只是想完全刪除此字段。 – captainclam 2011-04-05 17:27:05