Cakephp find ('list') и поведение Translate

Я использую CakePHP 3.

У меня есть таблица счетов. Каждая учетная запись принадлежит стране. Таблица стран интернационализирована с использованием функции Translate Behavior, поэтому в ней могут храниться названия стран для каждого языка.

     class CountriesTable extends Table
     {
        public function initialize(array $config)
        {
        $this->table('countries');
        $this->displayField('name');
        $this->primaryKey('id');
        $this->addBehavior('Translate', ['fields' => ['name']]);
        }

Обратите внимание, что поле «name» интернационализировано с помощью поведения Translate, поэтому его нет в таблице стран.

Затем в AccountsController я хочу получить список стран, использующих активный язык:

....
$countries = $this->Accounts->Countries->find('list', ['limit' => 200]);
.....

Проблема в том, что он не получает переводы из таблицы i18n, как ожидалось. Я уже закодировал действия по обслуживанию для таблицы интернационализированных стран, и все работает нормально, но этот простой find('list') не работает.

Еще одна деталь: в журналах Mysql я вижу, что он запустил этот запрос. Обратите внимание, что в таблице стран есть только два поля: id и code, но displayField - это name.

SELECT Countries.id AS `Countries__id`, Countries.code AS `Countries__code` FROM countries Countries LIMIT 200

кстати, становится действительно сложно переключиться с 2.x на 3.x.


person pperejon    schedule 06.08.2015    source источник
comment
Проверить класс объекта debug($this->Accounts->Countries) - это объект CountryTable? Обычная причина того, что код в классах модели не имеет никакого эффекта - они вообще не загружаются (я имею в виду the countries table has only two fields: id and code, but the displayField is name и не совпадающий sql)   -  person AD7six    schedule 06.08.2015
comment
В выражениях отладчика Eclipse $this->Accounts->Countries он возвращает Cake\ORM\Association\BelongsTo. После выполнения кода переменная $countries имеет тип Cake\ORM\Query. В любом случае, как его нельзя загрузить, если он хорошо связан в AccountsTable с $this->belongsTo('Countries', [ 'foreignKey' => 'country_id', 'joinType' => 'INNER' ]);   -  person pperejon    schedule 06.08.2015


Ответы (1)


Я нашел проблему после долгих исследований. В моем случае таблица счетов не интернационализирована, но страны связанной таблицы - это.

Проблема в том, что я не установил языковой стандарт в контроллере учетных записей. После помещения этой строчки перед находками все заработало:

I18n::locale('spa');

Поэтому я предполагаю, что если вы не установите языковой стандарт с помощью I18n, поведение Перевести вообще не будет работать. Я должен загрузить его в AppController, чтобы сделать его доступным для всех приложений.

Спасибо большое за вашу помощь!!

person pperejon    schedule 06.08.2015
comment
Если во время выполнения языковой стандарт является локалью по умолчанию поведение translate ничего не даст - я думаю, это основная причина путаницы. - person AD7six; 06.08.2015
comment
Да, вот в чем проблема. Я не уверен, что это правильное поведение ... Я имею в виду, он всегда должен принимать переводы, даже если я не менял язык с языка по умолчанию. Кроме того, в CakePHP-2 Локаль .x была взята из Config.language в качестве запасного варианта для локали собственной модели, поэтому она всегда задавалась. Я решил, что это установка языка во всех случаях в AppController beforeFind. - person pperejon; 07.08.2015
comment
I'm not sure that this is the right behavior - Это спланированное поведение. Поведение перевода предполагает, что содержимое на языке по умолчанию находится на исходной таблицы, если вы не измените языковой стандарт или не измените его на значение по умолчанию - попытки получить переведенные значения не будут. - person AD7six; 07.08.2015
comment
В этом есть смысл, особенно с точки зрения эффективности. Я много лет работал с сериями CakePHP 1.x и 2.x и всегда удалял переведенные поля из исходной таблицы, поэтому мне всегда нужно переходить к таблице переводов. Не могу вспомнить, где я это читал или зачем я это делал ... - person pperejon; 07.08.2015
comment
@ AD7six Я ​​пытался реализовать это поведение, но теперь я понимаю, почему текущий языковой стандарт и языковой стандарт по умолчанию никогда не отличаются, если вы не вызываете I18n::locale(). Это потому, что я использую DispatcherFactory::add('LocaleSelector'); в своей начальной загрузке. Он берет языковой стандарт из HTTP-запроса и устанавливает языковой стандарт по умолчанию. Если вы не измените его с помощью I18n :: locale (), поведение Translate никогда ничего не сделает. - person pperejon; 10.08.2015
comment
Наверное, стоит купить билет. - person AD7six; 10.08.2015
comment
@ AD7six Я ​​открыл этот билет в CakePHP github. Спасибо и привет. - person pperejon; 10.08.2015