Настраиваемые столбцы в виде списка в администраторе Symfony - PullRequest
0 голосов
/ 28 июля 2011

tl; dr: Мне нужно показать данные из двух разных таблиц в виде списка генератора администратора Symfony (желательно с помощью оператора JOIN)

Я использую sfDoctrineGuardPlugin для управления пользователями моего приложения.У каждого пользователя также есть свой профиль, который он может заполнить.Схема (schema.yml) для таблицы профиля выглядит следующим образом:

sfGuardUserProfile:
  connection: doctrine
  tableName: sf_guard_user_profile
  columns:
    sf_guard_user_id: integer(8)
    client_id: string(128)
  relations:
    sfGuardUser:
      local: sf_guard_user_id
      foreign: id
      foreignType: one
      onDelete: CASCADE

В данный момент таблица - это client_id и внешний ключ к столбцу id в таблице sfGuardUser. (Да, я знаю, что мне нужен столбец id там только для доступности БД, а больше будет позже)

Я создал администратора для своей таблицы профилей, используя генератор администраторов Symfony,Мне бы хотелось, чтобы мой список в админке выглядел следующим образом (generator.yml):

config:
  ...
  list:
    title:   Clients
    display: [client_id, sf_guard_user_id, username]
    table_method: retrieveProfileList

Однако мой столбец с именем пользователя не работает, и я получаю Doctrine_Record_UnkownPropertyException из:

Unknown record property / related component "username" on "sfGuardUserProfile"

Я надеялся, что пользовательский метод table_method для заполнения данных для представления списка поможет мне, но мой метод таблицы (в lib/model/sfGuardUserProfileTable.class.php), похоже, не помогает.Я следовал примеру в Книге Symfony , и этот метод:

public static function retrieveProfileList(Doctrine_Query $q)
{
  $rootAlias = $q->getRootAlias();

  $q->leftJoin($rootAlias . '.sfGuardUser id');

  return $q;
}

Есть какие-нибудь идеи о том, как заставить генератор администратора Symfony отображать представление списка на основе объединения?Или, альтернативно, как вытащить из отдельной модели?

1 Ответ

2 голосов
/ 28 июля 2011

Я ответил на свой вопрос!

Я изменил метод соединения в своем классе sfGuardUserProfileTable на что-то, что смогу лучше понять (благодаря этой полезной ссылке):

public static function retrieveProfileList(Doctrine_Query $q)
{
  return $q->select('r.*, u.username')
          ->leftJoin('r.sfGuardUser u');
}

И добавили getUsername метод в мою sfGuardUserProfile модель класса

  public function getUsername()
  {
      return $this->sfGuardUser->username;
  }

Спасибо за то, что я моя резиновая утка, ТАК!

...