Соната admin - поле "order by" в соответствующей таблице - PullRequest
8 голосов
/ 12 января 2012

У меня есть класс администратора продукта.Сущность Product имеет отношение «многие к одному» с сущностью Category, т. Е. Продукт связан с категорией.

На странице списка продуктов для администратора мне нужно отсортировать по названию категории (в алфавитном порядке), с которым связан каждый продукт.

Установить поле по умолчанию для сортировки легко, если поле находится на самом объекте (см. Порядок администрирования Sonata , как это сделать),Но я не могу понять, как сортировать по полю в связанной таблице.

Любая помощь приветствуется.

Ответы [ 2 ]

6 голосов
/ 15 января 2014

Asume name - это свойство объекта Category, по которому вы хотите отсортировать.Вы можете сделать это за вас ProductAdmin.php

protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category.name', null, array(
            'sortable' => true,
     ));
     ...
}

Таким образом, вы используете ссылки для заказа в заголовке списка, сгенерированного Sonata.1011 *

Если вам также нужна ссылка на название категории в списке продуктов для быстрого редактирования сущности Category, при условии, что вы создали класс CategoryAdmin, вы должны написать свой код следующим образом:

protected function configureListFields(ListMapper $listMapper)
{

     $listMapper->add('category', null, array(
            'sortable' => 'category.name',
     ));
     ...
}

И в вашем классе Category вы должны реализовать метод __toString() следующим образом:

public function __toString()
{
    return $this->getName();
}
6 голосов
/ 15 января 2012

Вроде бы обходной путь, но он работает.Вам нужно добавить метод 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'));
    }
}
...