Как сделать поле перевода медленным в CakePHP 3.x

если вы когда-либо сталкивались с проблемой, когда вы не можете выполнить медлительное поведение в переведенном поле, я чувствую, что вы.

Всякий раз, когда вы сохраняете перевод для сущности, свойство ‘slug’ опускается, потому что оно не является грязным во время сохранения сущности перевода.

  1. Вы сохраняете сущность.
  2. Переводы создаются.
  3. К таблице для i18n не прикреплено медленное поведение, поэтому оно не знает, когда выдавать медленное поведение для переведенного поля, такого как заголовок / имя и т. Д.

1

Решение

Я думаю, что нашел лучшее решение:

В моем классе SluggableBehavior я обновил поведение, добавив также переводы:

public function beforeSave(Event $event, EntityInterface $entity) {
$this->slug($entity);
if($entity->get('_translations')) {
foreach($entity->get('_translations') as $key=>$translation) {
$this->slug($translation);
}
}
}

Конечно, просто, как это может быть, ему не нужна отдельная таблица 🙂 Но спасибо @ndm.

1

Другие решения

Вы можете создать и использовать конкретный класс таблиц для таблицы перевода, где вы можете создавать слагов.

По умолчанию имя, которое использует поведение translate для поиска табличных классов: I18n, так что если вы хотите, чтобы это применялось ко всем переведенным таблицам, создайте App\Model\Table\I18nTableили, если вы хотите, чтобы это применялось только к конкретным переведенным таблицам, создайте отдельную таблицу и класс перевода базы данных и соответственно настройте поведение перевода с помощью translationTable опция:

// looks up `App\Model\Table\CustomI18nTable`
'translationTable' => 'CustomI18n'

Смотрите также

0

Решение, о котором я думаю, может быть, и оно проверено:

вы указываете защищенное свойство в вашей сущности, например:

protected $_sluggable = 'title';

тогда вы создаете геттер:

public function _getSluggableField() {
return $this->_sluggable;
}

как только вы это сделаете, вам нужно обновить файл вендора:

vendor/cakephp/cakephp/src/ORM/Behavior/TranslateBehavior.php

и изменить:

foreach ($translations as $lang => $translation) {
foreach ($fields as $field) {
if (!$translation->isDirty($field)) {
continue;
}
$find[] = ['locale' => $lang, 'field' => $field, 'foreign_key' => $key];
$contents[] = new Entity(['content' => $translation->get($field)], [
'useSetters' => false
]);
}
}

чтобы:

foreach ($translations as $lang => $translation) {
foreach ($fields as $field) {
if($field==='slug' && (method_exists($entity, '_getSluggableField') && $entity->_getSluggableField())) {
$translation->set('slug', \Cake\Utility\Text::slug($translation->get($entity->_getSluggableField())));
}
if (!$translation->isDirty($field)) {
continue;
}
$find[] = ['locale' => $lang, 'field' => $field, 'foreign_key' => $key];
$contents[] = new Entity(['content' => $translation->get($field)], [
'useSetters' => false
]);
}
}

Я надеюсь, что у кого-то есть лучшее решение. Но этот работает как шарм.

-1
По вопросам рекламы [email protected]