если вы когда-либо сталкивались с проблемой, когда вы не можете выполнить медлительное поведение в переведенном поле, я чувствую, что вы.
Всякий раз, когда вы сохраняете перевод для сущности, свойство ‘slug’ опускается, потому что оно не является грязным во время сохранения сущности перевода.
Я думаю, что нашел лучшее решение:
В моем классе 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.
Вы можете создать и использовать конкретный класс таблиц для таблицы перевода, где вы можете создавать слагов.
По умолчанию имя, которое использует поведение translate для поиска табличных классов: I18n
, так что если вы хотите, чтобы это применялось ко всем переведенным таблицам, создайте App\Model\Table\I18nTable
или, если вы хотите, чтобы это применялось только к конкретным переведенным таблицам, создайте отдельную таблицу и класс перевода базы данных и соответственно настройте поведение перевода с помощью translationTable
опция:
// looks up `App\Model\Table\CustomI18nTable`
'translationTable' => 'CustomI18n'
Смотрите также
Решение, о котором я думаю, может быть, и оно проверено:
вы указываете защищенное свойство в вашей сущности, например:
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
]);
}
}
Я надеюсь, что у кого-то есть лучшее решение. Но этот работает как шарм.