奏鸣曲管理员:列表始终使用默认语言

Posted

技术标签:

【中文标题】奏鸣曲管理员:列表始终使用默认语言【英文标题】:Sonata admin : list always use defaut language 【发布时间】:2019-02-28 17:13:31 【问题描述】:

我将奏鸣曲管理包与 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');
    

【问题讨论】:

【参考方案1】:
return (string)$this->getTranslations()->get($locale);

在 __toString 方法 Test.php 中使用上述代码

【讨论】:

这不是我的问题,__toString 没有在列表视图中调用,您的代码在我的添加和编辑表单中出错 __tostring 在列表视图中被调用你写在实体类吗? 这只是提示您必须使用它,因为您想使用它正在我的 2 个项目中工作 我认为不是,我添加了一个断点,它忽略了它,我死了();里面并没有在列表视图中发生任何事情。如果你愿意,我可以删除它。是的,我在我的测试类中添加了 能否请您返回一个常量字符串进行检查?比如返回“检查我在这里”;在 __toString 里面?

以上是关于奏鸣曲管理员:列表始终使用默认语言的主要内容,如果未能解决你的问题,请参考以下文章

奏鸣曲默认过滤器值

如何使用奏鸣曲管理员创建自定义列表

在块中渲染奏鸣曲管理员列表

奏鸣曲管理员获取所有列表项

如何在奏鸣曲管理员中为路由设置主机?

奏鸣曲管理员列表可编辑与编辑/显示冲突