如何使用knplabs教义行为对奏鸣曲管理员中的可翻译数据进行排序

时间:2013-07-19 18:56:31

标签: symfony doctrine-orm translation sonata-admin

我正在寻找在SonataAdmin中使用KnplabsDoctrineBehaviors的好方法。

我已经在这个包的帮助下在sonata管理包中呈现了一个表单:https://github.com/a2lix/TranslationFormBundle 它工作正常,并正确添加一个实体及其翻译。

要列出奏鸣曲中的实体,我发现了来自this的黑客攻击,但是当我在Sonata-admin的listMapper中向Nom添加sortable属性时,它无效。

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;
     }
}

当我尝试按Nom排序时,我收到此错误:

Catchable Fatal Error: Argument 1 passed to
Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery::entityJoin()
must be of the type array, null given, called in
.../vendor/sonata-project/doctrine-orm-admin-bundle/Sonata/DoctrineORMAdminBundle/Datagrid/ProxyQuery.php
on line 140
and defined in
.../vendor/sonata-project/doctrine-orm-admin-bundle/Sonata/DoctrineORMAdminBundle/Datagrid/ProxyQuery.php
line 245

我想这是因为Nom不在体育界,我不知道如何处理。

2 个答案:

答案 0 :(得分:1)

响应有点慢,因为我自己刚刚遇到这个问题。我发现解决方案实际上相当简单。在我的情况下,我希望能够按文章状态和标题进行过滤,其标题是可翻译字段。我设法使其工作的方式是明确使用翻译关系并在此子实体上指定字段,如下所示:

protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper
        ->add('translations.title', null, array('label' => 'Title'))
        ->add('status');
}

我希望在这种情况下这有助于其他人...

答案 1 :(得分:0)

我终于切换到https://github.com/symfony2admingenerator/AdmingeneratorGeneratorBundle,这在我看来更灵活。不知道你的解决方案是否有效,但在大部分时间进行排序时都需要考虑所有的翻译。

例如:

  • Nom1:fr:test1
  • Nom1:en:test1
  • Nom2:fr:test2
  • Nom2:en:test0

当你想按nom排序时,它会产生:

  • Nom2:en:test0
  • Nom1:fr:test1
  • Nom1:en:test1
  • Nom2:fr:test2

这样:

  • Nom2:en:test2
  • Nom1:fr:test1
  • Nom1:en:test1
  • Nom2:fr:test0

所以它总是在Nom1之前显示Nom2,因为它没有考虑语言。我能够使用symfony2admingenerator轻松解决这个问题,所以我切换: - )