如何在CakePHP 3.x中使翻译字段变得缓慢

时间:2018-03-14 12:20:01

标签: php cakephp internationalization cakephp-3.0 behavior

如果您遇到问题,当您无法在翻译的字段上发出可缓慢的行为时,我会感觉到。

每当您保存实体的翻译时,省略'slug'属性,因为在保存翻译实体时它不脏。

  1. 您保存实体。
  2. 正在创建翻译。
  3. i18n表没有附加可缓存的行为,因此它不知道何时在标题/名称等翻译字段上发出可缓慢的行为。

3 个答案:

答案 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
            ]);
        }
    }

我希望有人有更好的解决方案。但这个作为一种魅力。