Соната admin - поле "order by" в соответствующей таблице
У меня есть класс администратора продукта. Сущность Product имеет отношение "многие к одному" с сущностью Category, то есть продукт связан с категорией.
На странице списка администраторов для продуктов мне нужно отсортировать по названию категории (в алфавитном порядке), с которым связан каждый продукт.
Установить поле по умолчанию для сортировки легко, если поле находится на самом объекте (см. Порядок комплектации администратора Sonata, как это сделать). Но я не могу понять, как сортировать по полю в связанной таблице.
Любая помощь приветствуется.
2 ответа
Это кажется обходным путем, но это работает. Вам нужно добавить метод createQuery(), переопределяющий объединение, а затем назначить переопределение $datagridValues по умолчанию для sortBy:
<?php
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery;
class ExpenseAdmin extends Admin
{
protected $datagridValues = array(
'_page' => 1,
'_sort_order' => 'ASC', // sort direction
'_sort_by' => 'c.name' // field name
);
/**
* @return \Sonata\AdminBundle\Datagrid\ProxyQueryInterface
*/
public function createQuery($context = 'list')
{
$query = parent::createQuery($context);
return new ProxyQuery($query
->join(sprintf('%s.category', $query->getRootAlias()), 'c'));
}
}
Предполагаю name
является собственностью юридического лица Category
по которому вы хотите отсортировать. Вы можете сделать это в себе ProductAdmin.php
protected function configureListFields(ListMapper $listMapper)
{
$listMapper->add('category.name', null, array(
'sortable' => true,
));
...
}
Таким образом, вы используете ссылки для упорядочивания в заголовке списка, созданного Sonata.
редактировать
Если вы также хотели бы иметь ссылку на название категории в списке продуктов для быстрого редактирования Category
сущность, если вы создали CategoryAdmin
класс, вы должны написать свой код следующим образом:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper->add('category', null, array(
'sortable' => 'category.name',
));
...
}
И в твоем Category
класс вы должны реализовать __toString()
метод как это:
public function __toString()
{
return $this->getName();
}