我继承了symfony 1.4 app的开发(尽管这是我的第一个symfony项目)。
在对该应用程序进行了一些挖掘之后,我发现了一个让我疯狂的错误。
在模块的管理生成器列表页面上,过滤器表单中有两个选择字段,应该列出每个用户类型(合作伙伴和客户端),但两个列表都显示所有用户。
generator.yml
表示两个选择字段都应填充parter_id
和client_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;
合作伙伴和客户之间的区别由sfGuardGroup
和sfGuardUserGroup
生成,./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_id
和partner_id
之间的关系以及它们的组名来获取过滤器表单选择字段,但我结束了相信这是一种错误的方法
¿是否可以修改模块的模式以允许symfony正确填充选择字段?
¿或者那种方法是完全错误的,而是我应该破解那些使用正确的查询来填充它们的方法?如果有这样的暗示将会受到赞赏。
由于
答案 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文件中指定表单类。