我目前正在使用 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 中的代码效果很好
感谢您的帮助!
答案 0 :(得分:0)
如果删除实体的翻译(即使我之前收到更新),我发现捕获的唯一方法是检查:
对我来说,代码如下所示:
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是一个存储(自定义)字段对象的数组。