2010-07-02 56 views
2

我已經安裝了sfDoctrineGuard插件。一切正常,我可以使用/ sf_guard_user/edit /:id頁面來編輯用戶。symfony覆蓋BaseForm類howto

我不喜歡權限被列爲選擇列表的方式,我想根據權限名稱將它們顯示爲單獨的複選框。爲此,我創建了一個擴展爲sfWidgetFormChoice的自定義小部件。這是工作,我希望它也的樣子,但我的問題是這樣的:

使用個性化的小工具,我編輯該文件中的以下行:

lib/form/doctrine/sfDoctrineGuardPlugin/base/BasesfGuardUserForm.class.php 

前:

 'groups_list'  => new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardGroup')), 
     'permissions_list' => new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardPermission')), 

後:

 'groups_list'  => new sfWidgetFormDoctrineChoice(array('multiple' => true,  'model' => 'sfGuardGroup', 'expanded' => true)), 
     'permissions_list' => new myCustomPermissionWidget(), 

這給出正確的結果。

問題是,我不應該編輯基類,因爲任何時候我建立我的模型文件被覆蓋。

所以我應該修改這個文件:

lib/form/doctrine/sfDoctrineGuardPlugin/sfGuardUserForm.class.php 

    class sfGuardUserForm extends PluginsfGuardUserForm 
    { 
     public function configure() 
     { 
     parent::configure(); 

     $this->setWidgets(array(
      'groups_list'  => new sfWidgetFormDoctrineChoice(array('multiple' => true, 'model' => 'sfGuardGroup', 'expanded' => true)), 
      'permissions_list' => new myCustomPermissionWidget(), 
     )); 
     } 
    } 

但是,這是行不通的。我已經嘗試了一個新的函數setup()中的代碼,在我的代碼之前和之後使用parent :: setup(),但仍然沒有任何結果。

PluginsfGuardUserForm是抽象的,擴展了BasesfGuardUserForm,但我不明白爲什麼會阻止它工作。

任何想法?

感謝

回答

2

相信編輯用戶操作使用類sfGuardUserAdminForm這是在插件目錄

將文件複製

插件/ sfDoctrineGuardPlugin/lib中/形式/doctrine/sfGuardUserAdminForm.class。PHP

LIB /形式/教義/

然後這個行添加到configure()方法

$這 - > setWidget( '權限:PERMISSIONS_LIST'=>新myCustomPermissionWidget()) ;

您不需要添加對parent :: configure()的調用,在表單框架中執行此操作是不好的做法,並且只有在您知道需要時才應該這樣做。

+0

謝謝你,這絕對是我正在尋找的東西,但我現在無法測試。假設你的答案有效,我仍然不確定爲什麼有一個BasesfGuardUser類,然後是一個sfGuardUser類。對我來說,我的改變絕對是在sfGuardUser類中,但似乎並不奏效。它甚至不像它曾經實例化過的那樣可能是以後的問題。 – Serg 2010-07-03 12:21:01

+0

永遠不要觸摸基礎類。巖體使用admin用戶表單在管理區進行編輯。這是因爲它確實是我自己猜想的東西。這意味着您確實需要對管理區域編輯進行更改。 – johnwards 2010-07-03 19:09:56

+0

原諒任何錯別字,我在我的手機上... – johnwards 2010-07-03 19:10:55

0

嘗試編輯

的lib /供應商/ symfony的/ lib目錄/插件/ sfDoctrineGuardPlugin/lib中/表格/教義/ PluginsfGuardUserForm.class.php

「供應商」和「symfony」將會是你安裝時的任何東西。這對我來說,當我想要從登錄表中刪除記住我複選框:

<?php 

/** 
* sfGuardFormSignin for sfGuardAuth signin action 
* 
* @package sfDoctrineGuardPlugin 
* @subpackage form 
* @author  Fabien Potencier <[email protected]> 
* @version SVN: $Id: sfGuardFormSignin.class.php 23536 2009-11-02 21:41:21Z Kris.Wallsmith $ 
*/ 
class sfGuardFormSignin extends BasesfGuardFormSignin 
{ 
    /** 
    * @see sfForm 
    */ 
    public function configure() 
    { 
    $this->widgetSchema->setFormFormatterName('list'); 
    unset($this['remember']); 
    } 
} 

就這麼簡單。

希望它可以幫助

盧克

+0

感謝您的回覆。 我搜索PluginsfGuardUserForm.class.php,發現在這裏: 插件/ sfDoctrineGuardPlugin/lib中/表格/教義/ PluginsfGuardUserForm.class.php 我也找了LIB /供應商/ symfony的/ lib目錄/插件/ sfDoctrineGuardPlugin/lib/form/doctrine,但似乎沒有該目錄。 我得到儘可能的lib /供應商/ symfony的/ lib目錄/插件/ sfDoctrinePlugin/lib中/形成包含2個文件: sfFormDoctrine.class.php sfFormFilterDoctrine.class.php 所以還停留很遺憾。 – Serg 2010-07-02 15:08:56

+0

您是否嘗試編輯您找到的pluginsfGuardUserForm.class.php?如果沒有發生什麼事?這可能只是因爲我們的目錄結構略有不同。 – Luke 2010-07-02 16:32:03