如果您遇到问题,当您无法在翻译的字段上发出可缓慢的行为时,我会感觉到。
每当您保存实体的翻译时,省略'slug'属性,因为在保存翻译实体时它不脏。
答案 0 :(得分: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 :(得分:0)
您可以为转换表创建和使用具体的表类,然后您可以在其中创建slugs。
默认情况下,翻译行为用于查找表类的名称为I18n
,因此如果您希望将其应用于所有已翻译的表,请创建App\Model\Table\I18nTable
,或者如果您希望应用此名称仅对特定的翻译表,创建单独的数据库转换表和类,并通过translationTable
选项相应地配置翻译行为:
// looks up `App\Model\Table\CustomI18nTable`
'translationTable' => 'CustomI18n'
另见
答案 2 :(得分:-1)
我想到的解决方案可能已经过测试了:
您在实体中指定受保护的属性,例如:
protected $_sluggable = 'title';
然后你创建一个getter:
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
]);
}
}
我希望有人有更好的解决方案。但这个作为一种魅力。