奏鸣曲管理员:列表始终使用默认语言
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 里面?以上是关于奏鸣曲管理员:列表始终使用默认语言的主要内容,如果未能解决你的问题,请参考以下文章