Администратор сонаты: список всегда использует язык по умолчанию - PullRequest
0 голосов
/ 25 сентября 2018

Я использую Sonata Admin Bundle с Symfony 3.4 и knplabs.Все работает отлично, за исключением одной вещи.

Я создал класс Test и список сонат с помощью CRUD.Этот класс имеет переводимый заголовок, когда я нахожусь в режиме редактирования одного на моем тестовом объекте, я могу нажать на флаг для редактирования заголовка на многих языках.

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

Я отлаживаю и обнаруживаю, что в редактируемом виде методы setLocale и getLocal используются для измененияязыки, но в виде списка, они не являются вызовами.

Как я могу перевести свои энты в моем представлении списка?

Здесь мой тестовый класс, тестовый класс перевода и мой testAdmin.

Test.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;
use Sonata\TranslationBundle\Model\TranslatableInterface;

/**
* @ORM\Entity(repositoryClass="App\Repository\TestRepository")
*/
class Test implements TranslatableInterface
    {
    use ORMBehaviors\Translatable\Translatable;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="boolean")
     */
    private $is_enable;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getTitle(): ?string
    {
        return $this->translate(null, false)->getTitle();
    }

    public function setTitle(string $title): self
    {
        $this->translate(null, false)->setTitle($title);

        return $this;
    }

    public function getIsEnable(): ?bool
    {
        return $this->is_enable;
    }

    public function setIsEnable(bool $is_enable): self
    {
        $this->is_enable = $is_enable;

        return $this;
    }

    /**
     * @param string $locale
     */
    public function setLocale($locale)
    {
        $this->setCurrentLocale($locale);

        return $this;
    }

    /**
     * @return string
     */
    public function getLocale()
    {
        return $this->getCurrentLocale();
    }

    /**
     * @return string
     *
     * Set this to have a correct name display on BO (sonata translation add some weird id key after the name)
     */
    public function __toString()
    {
        if (empty($this->getTitle())){
            return '';
        }
        else{
            return $this->getTitle();
        }
    }
}

TestTranslation.php

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;

/**
 * @ORM\Table(name="test_translation")
 * @ORM\Entity
 */
class TestTranslation
{
    use ORMBehaviors\Translatable\Translation;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    /**
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @param string $title
     *
     * @return TestTranslation
     */
    public function setTitle($title)
    {
        $this->title = $title;

        return $this;
    }

}

TestAdmin.php

<?php

namespace App\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Sonata\AdminBundle\Datagrid\DatagridMapper;

class TestAdmin extends AbstractAdmin
{
    protected $baseRoutePattern = 'test';
    protected $baseRouteName = 'test';

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('title', TextType::class)
            ->add('is_enable', TextType::class)
        ;
    }

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('id')
            ->add('title')
            ->add('is_enable')
            ->add('_action', 'actions', array(
                'actions' => array(
                    'edit' => array(),
                    'delete' => array(),
                )
            ))
        ;
    }

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper->add('id');
        $datagridMapper->add('translations.title', null, array('label' => 'Title'));
        $datagridMapper->add('is_enable');
    }
}

1 Ответ

0 голосов
/ 25 сентября 2018
return (string)$this->getTranslations()->get($locale);

используйте приведенный выше код в методе __toString Test.php

...