1

Тема: Использование KNP translations в Sonata Admin (datagridFilters)

Здравствуйте,

Использую в проекте библиотеку https://github.com/KnpLabs/DoctrineBehaviors.
Возникла проблема при настройке фильтров в Sonata Admin. Привожу фрагменты.

Структура сущности:

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
 
/**
* @ORM\Entity(repositoryClass="SiteBundle\Entity\Repository\CategoryRepository")
*/

class Category
{
    use ORMBehaviors\Blameable\Blameable,
        ORMBehaviors\Sortable\Sortable,
        ORMBehaviors\Timestampable\Timestampable,
        ORMBehaviors\Translatable\Translatable
        ;
 
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */

    protected $id;
 
    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     */

    private $children;
 
    /**
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id")
     */

    private $parent;
 
    public function __construct()
    {
        $this->children = new ArrayCollection();
    }
 
    public function __call($method, $arguments)
    {   
        if (!method_exists(self::getTranslationEntityClass(), $method)) {
            $method = 'get' . ucfirst($method);
        }
 
        return $this->proxyCurrentLocaleTranslation($method, $arguments);
    }
 
    public function setParent(Category $parent = null)
    {
        $this->parent = $parent;
        return $this;
    }
 
    public function getParent()
    {
        return $this->parent;
    }
 
    /**
     * Add children
     *
     * @param Category $children
     * @return object
     */

    public function addReply(Category $children)
    {
        $this->children[] = $children;
 
        return $this;
    }
 
    /**
     * Remove children
     *
     * @param Category $children
     */

    public function removeReply(Category $children)
    {
        $this->children->removeElement($children);
    }
 
    /**
     * Get children
     *
     * @return \Doctrine\Common\Collections\Collection
     */

    public function getChildren()
    {
        return $this->children;
    }
 
}

Структура сущности переводов:

namespace SiteBundle\Entity;
 
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
use Doctrine\ORM\Mapping as ORM;
 
/**
* @ORM\Entity
*/

class CategoryTranslation
{
    use ORMBehaviors\Translatable\Translation;
 
    /**
     * @ORM\Column(type="string", length=255)
     */

    protected $name;
 
    /**
     * @ORM\Column(type="string", length=255)
     */

    protected $description;
 
    /**
     * @return string
     */

    public function getName()
    {
        return $this->name;
    }
 
    /**
     * @param  string
     * @return null
     */

    public function setName($name)
    {
        $this->name = $name;
    }
 
    /**
     * @return string
     */

    public function getDescription()
    {
        return $this->description;
    }
 
    /**
     * @param  string
     * @return null
     */

    public function setDescription($description)
    {
        $this->description = $description;
    }
}

Конфигурация:

doctrine:
    dbal:
        driver:   pdo_mysql
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
        # if using pdo_sqlite as your database driver:
        #   1. add the path in parameters.yml
        #     e.g. database_path: "%kernel.root_dir%/data/data.db3"
        #   2. Uncomment database_path in parameters.yml.dist
        #   3. Uncomment next line:
        #     path:     "%database_path%"

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        naming_strategy: doctrine.orm.naming_strategy.underscore
        auto_mapping: true

knp_doctrine_behaviors:
    tree: false
    translatable:   true
    blameable:      true
    geocodable:     false
    loggable:       false
    sluggable:      false
    soft_deletable: true
    sortable:       true
    timestampable:  true

Cтруктура класса админа:

namespace SiteBundle\Admin;
 
 
use A2lix\TranslationFormBundle\Form\Type\TranslationsType;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
 
class CategoryAdmin extends AbstractAdmin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('translations', TranslationsType::class, [
                'by_reference' => false,
            ])
            ->add('parent', 'sonata_type_model_autocomplete', [
                'property' => 'translations.name',
                'required' => false
            ])
        ;
    }
 
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper->add('translations.name', null, [
            'label' => 'Name',
        ]);
    }
 
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('name', null, [
                'label' => 'Name'
            ])
            ->add('parent')
            ->add('sort');
    }
}

В итоге в табличном виде вместо названии категории отображается строка вида

SiteBundle\Entity\Category:000000005f0b1...

что скорее всего происходит вследствие того, что метод просто возвращает объект с полями "name" на всех языках. В методе configureListFields() поле name выводится через метод proxyCurrentLocaleTranslation() (посредством волшебного метода __call()), где текущий язык берется из конфигурации. Как в данном случае поступить с фильтрами? Может кто уже сталкивался с такой проблемой. Спасибо заранее всем отозвавшимся.