CakePHP3 поведение на дърво + поведение при превод

Опитвам се да създам списък с категории, които трябва да бъдат преведени и да ги покажа като дървовидна структура. Но засега нямам късмет, имам дървовидна структура, но когато някога създам нова категория, тя се добавя към дървото, но няма да показва името, защото се превежда с i18n и се съхранява в различна таблица...

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

Тази променлива сама съхранява дърво с имена, които имам в таблицата с категории...

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

И това ми дава действителните преведени категории, някой има някаква идея как да ги комбинирам, CakePhp3 е нещо ново за мен и не мога да намеря много документация за комбинирането на тези две поведения.


person Andriy Anulich    schedule 04.12.2015    source източник


Отговори (1)


За да получите преведени полета в дървовиден списък, трябва да добавите TranslateTrait към обект Category, трябва да изглежда така:

Връзка към CookBook относно поведението на Translate и 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,
        ];

    }

След това трябва да стекате няколко метода за намиране, за да постигнете целта си, един за поведение при превод и един поведение на дърво

Връзка към 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() както си е, за да получите автоматично дървовидния списък на текущия език или да го замените с езика, който предпочитате.

person David A.    schedule 03.09.2018