我正在寻找通过knplabs使用DoctrineBehaviors的好方法。
我已经在这个包的帮助下在sonata管理包中渲染了一个表单:https://github.com/a2lix/TranslationFormBundle
现在,我希望将我的翻译字段放在管理列表中。
此时,它使用此方法:
/**
* @ORM\Entity
* @ORM\Table(name="sport")
*/
class Sport
{
...
public function getNom(){
return $this->translate()->getNom();
}
}
它的工作但是,我必须重新映射原始实体中的所有翻译字段。我很确定我错过了一些东西,特别是代理翻译的 magic 。
更新:
class Sport
{
use \Knp\DoctrineBehaviors\Model\Translatable\Translatable;
public function __call($method, $arguments)
{
return $this->proxyCurrentLocaleTranslation($method, $arguments);
}
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
// Need this method for the admin list template
public function getNom(){
return $this->translate()->getNom();
}
// Work even the precedent method not here, the proxy call work fine.
public function __toString(){
return $this->getNom();
}
}
class SportTranslation
{
use ORMBehaviors\Translatable\Translation;
/**
* @ORM\Column(type="string", length=255)
*/
protected $nom;
/**
* @return string
*/
public function getNom()
{
return $this->nom;
}
/**
* @param string
* @return null
*/
public function setNom($nom)
{
$this->nom = $nom;
}
}
感谢您快速回复@nifr!代理方法在控制器中工作(我尝试运动的__toString方法,它工作正常)。
但问题显然来自奏鸣曲管理员套装,我检查模板代码,不知道它为什么不起作用。
我将保持这种丑陋的方法,直到我找到更好的解决方案。
目前,它是在管理列表模板中打印价值的唯一方法。
如果我找到更好的东西,我会更新这篇文章。
答案 0 :(得分:3)
鉴于你有MyClass
和MyClassTranslation
遵循命名约定(翻译类后缀为翻译)。
只有不的属性需要在MyClass
中实时翻译,并且所有可翻译的属性都位于MyClassTranslation
。
假设可翻译属性为description
。
MyClass.php
注意:description
.... description
中的MyClass
的属性__call()
和getter / setter都不会被调用正确!
class MyClass
{
use \Knp\DoctrineBehaviors\Model\Translatable\Translatable;
public function __call($method, $arguments)
{
return $this->proxyCurrentLocaleTranslation($method, $arguments);
}
protected $nonTranslatableProperty;
// ...
MyClassTranslation.php
use Doctrine\ORM\Mapping as ORM;
class MyClassTranslation
{
use \Knp\DoctrineBehaviors\Model\Translatable\Translation;
/**
* @var string
*/
protected $description;
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @param string $description
*
* @return MyClassTranslation
*/
public function setDescription($description)
{
$this->description = $description;
return $this;
}
现在调用MyClass::getDescription()
将调用魔术方法__call()
,该方法将使用当前区域设置返回翻译,因为getDescription()
中没有MyClass
方法。
<强>解决方案:强>
您应该从SportTranslation
课程中移除Sport
中存在的所有可翻译的getter / setters / properties,而是添加神奇的__call()
方法。
答案 1 :(得分:2)
此时,这是在管理列表模板中打印值的唯一方法。
如果您想要所有翻译,只需添加您的运动管理类:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('translations')
}
这样结果将取决于SportTranslation类的__toString函数。
否则,如果你想打印当前的翻译,我想你应该使用自定义模板。 例如,我将删除Sport中的getNom方法。
然后在你的运动管理课程中:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('translations', null, array(
'template' => 'YourAdminBundle:CRUD:translatable.html.twig'
));
}
在您的模板中
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% block field%}
{{ object }}
{% endblock %}
这样它会调用你的运动类的__toString,并且它在没有getNom方法的情况下工作。
很遗憾,它无法解决我的问题链接:How to sort translatable data in sonata admin using knplabs doctrine behavior