Как удалить перевод с помощью CakePHP 3 TranslateBehavior - PullRequest
0 голосов
/ 30 мая 2019

Я использую TranslateBehavior, и он в основном работает отлично. Однако существует проблема удаления переводов. У меня была проблема, когда пустые строки возвращались, если они присутствовали в таблице i18n, что имеет смысл. Я установил

allowEmptyTranslations => false

флаг, и он решил проблему, но создал другой. Теперь я не могу удалить переводы. Я попытался оставить поля пустыми или сохранить один пробел. Первая техника вообще не меняла поля, другая сохраняла, но я не мог тогда изменить пространство на что-либо еще. Если я пытаюсь ввести новое значение, я получаю ошибку дублирующейся строки непосредственно из базы данных, поэтому я предполагаю, что фактическое поле было предварительно не установлено, если был только пробел (Translate должен был обработать его как пустое). Поэтому кажется, что allowEmptyTranslations работает как для сохранения, так и для извлечения.

Короче говоря, кто-нибудь знает способ удалить переводы?

1 Ответ

0 голосов
/ 30 мая 2019

Я уверен, что проблема с ошибками в дублирующихся строках, но если вы хотите сохранить пустые строки (или null s), вам нужно будет включить allowEmptyTranslations, вы можете сделать это намуха, если хотите.

Вот быстрый и грязный пример, где $table будет табличным объектом с прикрепленным поведением перевода, а $entity будет сущностью, для которой вы хотитесохранить переводы:

// ...

$translateBehavior = $table->behaviors()->get('Translate');
$allowEmptyTranslations = $translateBehavior->getConfig('allowEmptyTranslations');
$translateBehavior->setConfig('allowEmptyTranslations', true);

$result = $table->save($entity);
// ...

$translateBehavior->setConfig('allowEmptyTranslations', $allowEmptyTranslations);

В качестве альтернативы вы также можете удалить записи перевода, здесь $entity будет сущностью, для которой вы хотите удалить перевод, скажем, она принадлежит классу таблицы с именем ArticlesTable и вы хотите удалить перевод на французский язык для поля title:

$translateBehavior = $table->behaviors()->get('Translate');
$translationTable = $translateBehavior->getTableLocator()->get(
    $translateBehavior->getConfig('translationTable')
);

$translationEntity = $translationTable
    ->find()
    ->where([
        'foreign_key' => $entity->id,
        'model' => 'Articles',
        'field' => 'title',
        'locale' => 'fr_FR',
    ])
    ->firstOrFail();

$result = $translationTable->delete($translationEntity);

Примеры не проверены, но вы поймете идею.

...