CakePHP3树行为+翻译行为

时间:2015-12-04 14:39:34

标签: php tree cakephp-3.0

我试图创建一个需要翻译的类别列表,并将它们显示为树结构。但到目前为止没有运气,我得到树结构,但是当我创建新的类别时,它会增加到树但不会显示名称,因为它被翻译为i18n并存储在不同的表中......

$ categories_list = $ this-> Categories-> find(' treeList') - > toArray();

这个var存储了它自己的树,其名称在Categories Table ...

$ categories_list = $ this-> Categories-> find(' translations') - > toArray();

这个给了我实际翻译的类别,任何人都知道如何组合它们,CakePhp3对我来说是一个新事物,我无法找到关于将这两种行为结合起来的大量文档。

1 个答案:

答案 0 :(得分:0)

为了使翻译后的字段进入树形列表,您需要将TranslateTrait添加到Category实体中,它应如下所示:

  

Link to CookBook关于翻译行为和TranslateTrait

/src/Model/Entity/Category.php

<?php

    namespace App\Model\Entity;

    use Cake\ORM\Behavior\Translate\TranslateTrait;
    use Cake\ORM\Entity;

    class Category extends Entity{

        use TranslateTrait;

        //translation field must be accessible
        protected $_accessible = [
            'translations' => true,
        ];

    }

然后,您应该堆叠多种查找器方法以实现目标,一种是针对翻译行为,另一种是针对树的行为

  

Link to CookBook关于如何堆叠多个查找器方法

/src/Controller/ArticlesController.php

    use Cake\I18n\I18n;     

    public function foo(){

        /***
        *
        *   1) use translation finder
        *   2) use treeList finder
        *   3) give to treeList finder the translated value to use in the output array as valuePath param
        *
        ***/

        $tree_list = $this->Articles->Categories
            ->find('translations')
            ->find('treeList', ['valuePath' => '_translations.' . I18n::getLocale() . '.title'])
            ->toArray();

    }

您可以保留 I18n :: getLocale(),以自动获取当前语言的树列表或将其替换为您喜欢的语言。