Заполните поле выбора генератора админки Symfony на основе схемы - PullRequest
0 голосов
/ 10 февраля 2012

Я унаследовал разработку приложения Symfony 1.4 (хотя это мой первый проект 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 правильно заполнять поля выбора?

¿или этот подход совершенно неправильный, и вместо этого я должен взломать методы, которые визуализируют эти поля, чтобы заполнить их правильными запросами?Если это так, намеки в этом направлении будут оценены.

Спасибо

1 Ответ

1 голос
/ 10 февраля 2012

Просто отредактируйте свою форму (возможно, 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.

...