Администратор сонаты: в списке всегда используется язык по умолчанию

Я использую админку сонаты с Symfony 3.4 и knplabs. Все работает нормально, кроме одного.

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

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

Я отлаживаю и обнаруживаю, что в режиме редактирования методы 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');
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
408
1

Ответы 1

return (string)$this->getTranslations()->get($locale);

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

Это не моя проблема, __toString не вызывается в представлении списка, и ваш код делает ошибку в моей форме добавления и редактирования

Dessauges Antoine 25.09.2018 14:39

__tostring вызывается в виде списка, вы писали его в классе сущности?

M Maavia 25.09.2018 14:42

это был всего лишь намек на то, что вы должны использовать его так, как хотите, это работает над двумя моими проектами.

M Maavia 25.09.2018 14:43

Я думаю, что это не так, я добавляю точку останова, а она игнорируется, я умираю (); внутри, и в списке ничего не произошло. Я могу убрать его, если хочешь. И да, я добавляю в свой тестовый класс

Dessauges Antoine 25.09.2018 14:44

не могли бы вы вернуть постоянную строку, чтобы проверить это? вроде return "проверьте, что я здесь"; внутри __toString?

M Maavia 25.09.2018 14:47

Он возвращает заголовок объекта из БД в моем представлении списка, но в моей форме редактирования хлебные крошки возвращают «проверьте, я здесь». Вот почему я думаю, что это не вызов в списке

Dessauges Antoine 25.09.2018 14:49

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

Dessauges Antoine 25.09.2018 14:53

Другие вопросы по теме