Drupal - перехватить перевод - удаление - PullRequest
0 голосов
/ 04 мая 2018

В настоящее время я работаю с Drupal 8 API , и мне нужно сохранить в базе данных мой тип menu_link_content . Для этого у меня есть хук на entity_presave & entity_predelete . Поскольку я не хочу терять синхронизацию между базой данных и Drupal, когда мой код получил ошибку, я не позволяю Drupal сохранить сущность. Именно поэтому я подсел предварительно, а не сохранить. в любом случае ...

function modulename_entity_presave(\Drupal\Core\Entity\EntityInterface $entity) : void
{
    $class = get_class($entity);

    if ($entity->isNew()) {
        switch ($class) {
            case 'Drupal\menu_link_content\Entity\MenuLinkContent':
                //dispatch event menu link content insert
                //listener on that event that insert the entity in DB
                break;
        }
    }

    if (isset($entity->original)) {
        switch ($class) {
            case 'Drupal\menu_link_content\Entity\MenuLinkContent':
                //dispatch event menu link content update <- this one triggered
                //listener on that event that update the entity in DB
                break;
        }
    }
}

Моя проблема в том, что когда я удаляю перевод моего menu_link_content (или любого другого типа), запускается событие «presave», и langcode объекта изменяется с переведенного langcode (например, «fr») на langcode по умолчанию (например, 'en'), а затем срабатывает ловушка entity_translation_delete .

function modulename_entity_translation_delete(\Drupal\Core\Entity\EntityInterface $translation)
{
    $class = get_class($translation);

    switch ($class) {
        case 'Drupal\menu_link_content\Entity\MenuLinkContent':
            // get the langcode && the uuid of the $translation entity
            // deleting the row from database using langcode && uuid as key
            break;
    }
}

Поэтому, когда я запрашиваю свою базу данных с переведенным langcode (например, 'fr'), я ничего не получаю ... так как строка уже обновлена. Поэтому я не могу удалить его из моей базы данных

Я думаю о способе перехвата, если во время обновления изменяется langcode объекта, чтобы вызвать функцию удаления (так как я думаю, что lancode объекта не может быть изменен, единственный раз, когда я видел это, это когда Я удалил перевод). Но я не думаю, что это лучший способ сделать это .. Есть ли какой-нибудь hook_entity_translation_predelete ?

Список хуков Drupal ничего не отображается

Код из modulename_entity_translation_delete работает хорошо, если я не обновляю строку в БД (комментируя строку обновления)

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 15 мая 2018

Единственный способ, который я нашел, чтобы поймать, если я удаляю перевод сущности (даже если я ловлю обновление раньше), это проверить, что:

  • langcode моих обновленных данных - язык по умолчанию
  • У меня были ранее зарегистрированные данные (поэтому объект не новый)
  • предыдущий зарегистрированный langcode больше не доступен в доступных переводах

Для меня код выглядит так:

if (\Drupal::languageManager()->getDefaultLanguage()->getId() === $data['langcode']->getValue()
            && $data['langcode']->getOriginalData() !== null
            && $data['langcode']->getAvailableTranslations() !== $data['langcode']->getOriginalData()) {
            // do what you want of the matching data in DB
        }

Здесь $ data - это массив, в котором хранятся (пользовательские) объекты полей.

...