如何使用来自kpnlabs的DoctrineBehaviors在sonata admin中打印可翻译数据

时间:2013-07-01 16:44:46

标签: symfony translation sonata-admin

我正在寻找通过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方法,它工作正常)。

但问题显然来自奏鸣曲管理员套装,我检查模板代码,不知道它为什么不起作用。

我将保持这种丑陋的方法,直到我找到更好的解决方案。

目前,它是在管理列表模板中打印价值的唯一方法。

如果我找到更好的东西,我会更新这篇文章。

2 个答案:

答案 0 :(得分:3)

如何使用Knp \ DoctrineBehaviors魔术代理翻译

鉴于你有MyClassMyClassTranslation遵循命名约定(翻译类后缀为翻译)。

只有的属性需要在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