0
votes

I've inherited the development of a symfony 1.4 app (though It's my first symfony project).

After digging a bit on that app I've discovered a bug that is driving me nuts.

On the admin generator list page of a module there are two select fields in the filter form that should list each one a type of users (partners and clients), however both listings show all the users.

The generator.yml shows that both select fields should be populated by parter_id and client_id

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

Looking at the schema of the module it's obvious why symfony is populating the select fields with the same content because the relations of both client_id and partner_id are equivalent:

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

As per the above schema symfony has no other choice but to generate the select fields as:

select * from sf_guard_user; 

The difference between partner and client is made by sfGuardGroup and sfGuardUserGroup, the related parts of the schema from ./plugins/sfDoctrineGuardPlugin/config/doctrine/schema.yml are:

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
    ...

What I would like to is to generate those fields with a query like:

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';

I've researched for a way to edit the module's schema to reflect the relation between client_id and partner_id with their group name to get the filter form select fields right, but I've ended believing that that is a wrong approach

¿is it possible to modify the module's schema to allow symfony to populate correctly the select fields?

¿or that approach is completely wrong and instead I should hack the methods that render those fields to populate them with the right queries? If so hints in that direction would be appreciated.

Thanks

1

1 Answers

1
votes

Just edit your form (probably sfGuardUserForm) and add the query to the partner_id widget. Something like:

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

You'll probably need to do the same to the validator for that field:

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

If you cannot edit that specific form (maybe it is used in another part of the app), just make a new one that extends it. And then, you just need to specify the form class in the generator.yml file.