根据模式填充symfony管理生成器的选择字段

时间:2012-02-10 12:45:33

标签: symfony1 doctrine symfony-1.4

我继承了symfony 1.4 app的开发(尽管这是我的第一个symfony项目)。

在对该应用程序进行了一些挖掘之后,我发现了一个让我疯狂的错误。

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

generator.yml表示两个选择字段都应填充parter_idclient_id

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

查看模块的模式很明显为什么symfony填充具有相同内容的select字段,因为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';

我研究了一种编辑模块架构的方法,以反映client_idpartner_id之间的关系以及它们的组名来获取过滤器表单选择字段,但我结束了相信这是一种错误的方法

¿是否可以修改模块的模式以允许symfony正确填充选择字段?

¿或者那种方法是完全错误的,而是我应该破解那些使用正确的查询来填充它们的方法?如果有这样的暗示将会受到赞赏。

由于

1 个答案:

答案 0 :(得分: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文件中指定表单类。