Drupal - hook翻译 - 删除

时间:2018-05-04 10:23:43

标签: php drupal hook drupal-8

我目前正在使用 Drupal 8 API ,我需要在数据库中存储 menu_link_content 类型。为此,我在 entity_presave &的 entity_predelete 即可。因为我不想在数据库和数据库之间松开同步。 Drupal,当我的代码出错时我停止Drupal保存实体。这就是为什么我迷上了preave而不是保存。反正...

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 (或任何类型)的翻译时,事件&#34; presave&#34;触发并且实体langcode从翻译的langcode(例如&#39; fr&#39;)更改为默认的langcode(例如&#39; en&#39;)然后 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查询我的数据库时(例如&#39; fr&#39;)我什么都没得到...因为该行已经更新了。所以我无法将其从我的数据库中删除

我想到了一种方法,可以在更新期间更改实体的langcode以触发remove函数(因为我认为实体的lancode不能更改,我唯一一次看到是我删除翻译时)。但我不认为这是最好的方法..是否有某种 hook_entity_translation_predelete

Drupal hook list没有显示任何内容

如果我不更新数据库中的行(通过注释更新行), modulename_entity_translation_delete 中的代码效果很好

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果删除实体的翻译(即使我之前收到更新),我发现捕获的唯一方法是检查:

  • 我更新的数据的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是一个存储(自定义)字段对象的数组。