Сортировка списка в Sonata Admin по полям связанных сущностей
Используя Sonata Admin Bundle, который является отличным дополнением для Symfony, я столкнулся с проблемой, описанной ниже.
Допустим, у нас есть 3 объекта: город, штат и страна. Все они имеют свойстваid
а такжеname
, Город имеет отношение многих к одному с государством, а государство имеет отношение многих к одному со страной. Все они должны иметь строковые методы, отображающие значение имени свойства.
Мы можем создать представление списка для объекта City в Sonata Admin следующим образом:
Защищенная функция }
Для иллюстрации вид может выглядеть так:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State || State Country |
|-----||--------------------||--------------------||--------------------|
| 1 || New York || New York || USA |
| 2 || Acapulco || Guerrero || Mexico |
| 3 || Calgary || Alberta || Canada |
| 4 || Tijuana || Baja California || Mexico |
| 5 || Vancouver || British Columbia || Canada |
| 6 || Los Angeles || California || USA |
|-----||--------------------||--------------------||--------------------|
По умолчанию список сортируется по столбцамЯ бы а такженазваниезнак ^ должен изобразить это. Я хотел бы иметь возможность сортировать список по полям связанных сущностей и иметь ссылку, указывающую на действие show для связанной сущности.
Вот как я добился сортировки погосударственный:
//...
->add('state', null, array(
'route' => array('name' => 'show'),
'sortable' => true,
'sort_field_mapping' => array('fieldName' => 'name'), // property name of entity State
'sort_parent_association_mappings' => array(array('fieldName' => 'state')) // property state of entity City
))
//...
Теперь представление списка можно сортировать по свойствуназвание сущностигосударственный и все поля в столбцегосударственный указать на страницу шоу для текущего состояния:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State ^ || State Country |
|-----||--------------------||--------------------||--------------------|
| 3 || Calgary || Alberta || Canada |
| 4 || Tijuana || Baja California || Mexico |
| 5 || Vancouver || British Columbia || Canada |
| 6 || Los Angeles || California || USA |
| 2 || Acapulco || Guerrero || Mexico |
| 1 || New York || New York || USA |
|-----||--------------------||--------------------||--------------------|
Как отсортировать представление списка поСтрана (Город-> Государственно> Страна)? Что-то вроде этого:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State ^ || State Country |
|-----||--------------------||--------------------||--------------------|
| 3 || Calgary || Alberta || Canada |
| 5 || Vancouver || British Columbia || Canada |
| 2 || Acapulco || Guerrero || Mexico |
| 4 || Tijuana || Baja California || Mexico |
| 6 || Los Angeles || California || USA |
| 1 || New York || New York || USA |
|-----||--------------------||--------------------||--------------------|
Когда я пытаюсь что-то вроде приведенного выше фрагмента кода:
//...
->add('state.country', null, array(
'route' => array('name' => 'show'),
'sortable' => true,
'sort_field_mapping' => array('fieldName' => 'country.name'), // property name of entity Country
'sort_parent_association_mappings' => array(array('fieldName' => 'state.country')) // property country of entity State
))
//...
затем выдается ошибка исключения. Я пробовал разные комбинации, но все безуспешно.
Я мог бы сделать:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('name')
->add('state.name')
->add('state.country.name')
;
}
и решить проблему с сортировкой, но тогда нет ссылок на объекты.
Официальная документация очень хорошая, но эта тема отсутствует. Итак, как отсортировать представление списка по иерархическим объектам?