2012-02-10 29 views
0

我已经继承了symfony 1.4应用程序的开发(尽管这是我的第一个symfony项目)。根据模式填充symfony管理生成器的选择字段

在挖掘了那个应用程序后,我发现了一个让我疯狂的bug。

在模块的管理生成器列表页面上,筛选器表单中有两个选择字段,应该列出每种类型的用户(合作伙伴和客户端),但是这两个列表都会显示所有用户。

generator.yml表明,无论选择字段应该由parter_idclient_id

[...] 
    filter: 
    display: [date, client_id, partner_id, ...] 
    form: ~ 
    edit: ~ 
    new:  ~ 
[...] 

望着模块的架构来填充很明显为什么symfony的是相同的内容,因为关系填充选择字段的client_id和partner_id是等效的:

SomeModule: 
    tableName: client_requests 
    columns: 
    id: {type: integer, primary: true, autoincrement: true} 
    partner_id: {type: integer, notnull: true} 
    client_id: {type: integer, notnull: true} 
    date: {type: timestamp} 
    ... 
    relations: 
    partner: 
     class: sfGuardUser 
     local: partner_id 
     foreign: id 
     type: one 
    client: 
     class: sfGuardUser 
     local: client_id 
     foreign: id 
     type: one 

根据上述模式symfony没有其他选择但产生的选择字段:

select * from sf_guard_user; 

的合作伙伴和客户之间的差异是由sfGuardGroupsfGuardUserGroup提出,从./plugins/sfDoctrineGuardPlugin/config/doctrine/schema.yml架构的相关部分是:

sfGuardGroup: 
    actAs: [Timestampable] 
    columns: 
    name: 
     type: string(255) 
     unique: true 
    description: string(1000) 
    relations: 
    Users: 
     class: sfGuardUser 
     refClass: sfGuardUserGroup 
     local: group_id 
     foreign: user_id 
     foreignAlias: Groups 
    ... 
sfGuardUser: 
    actAs: [Timestampable] 
    columns: 
    first_name: string(255) 
    last_name: string(255 
    ... 
    relations: 
    Groups: 
     class: sfGuardGroup 
     local: user_id 
     foreign: group_id 
     refClass: sfGuardUserGroup 
     foreignAlias: Users 
    Permissions: 
     class: sfGuardPermission 
     local: user_id 
     foreign: permission_id 
     refClass: sfGuardUserPermission 
     foreignAlias: Users 
    ... 

我想是使用如下查询生成这些字段:

select u.* 
from sf_guard_user as u 
JOIN (sf_guard_user_group as ug JOIN sf_guard_group as g 
ON (ug.group_id = g.id)) ON (u.id = ug.user_id) 
where g.name = 'partner'; 

我研究了一种编辑模块的Sche马以反映client_idpartner_id与他们的组名之间的关系,以获得滤波器形式选择字段的权利,但我已经结束认为这是一个错误的做法

¿是否有可能修改模块的架构允许的symfony正确填充选择字段?

¿或者那种方法是完全错误的,我应该破解那些渲染这些字段来填充正确查询的方法?如果这样的暗示,将不胜感激。

感谢

回答

1

只要编辑表单(可能sfGuardUserForm)和查询添加到PARTNER_ID部件。喜欢的东西:

$query = Doctrine::getTable('sfGuardUser')->createQuery('u')->etc etc... 
$this->widgetSchema['partner_id']->setOption('query', $query) 

你可能需要做同样验证该字段:

$this->validatorSchema['partner_id']->setOption('query', $query) 

如果您不能编辑特殊形式(不知是不是在的另一部分用于应用程序),只是做一个新的扩展它。然后,你只需要在generator.yml文件中指定表单类。