英語のコンテンツが非公開の場合、翻訳を非公開にするにはどうすればよいですか? hook_node_update()
で英語のコンテンツを非公開にすると、プログラムで言語コンテンツを非公開にしようとしましたが、以下のエラーが返されます。
$languages = getLanguageList();
$currLanguage = \Drupal::languageManager()->getCurrentLanguage()->getId();
if (!$node->status->value) {
foreach ($languages as $languageId => $language) {
if ($languageId != 'en' && $currLanguage == 'en') {
if ($node->hasTranslation($languageId)) {
$transNode = $node->getTranslation($languageId);
$transNode->setPublished(false);
$transNode->save();
}
}
}
}
エラー:
Uncaught PHP Exception Drupal\\Core\\Entity\\EntityStorageException: "Update existing 'node' entity revision while changing the revision ID is not supported."
したがって、ノードを保存した後にこれが機能するかどうかを確認します。保存後にノードのフックはありますか?または、ソース言語(英語)を非公開にしてノードの言語コンテンツを非公開にする方法はありますか?
あなたが探しているのはこれでしょうか:
Entity :: postSave(EntityStorageInterface $ storage、$ update = TRUE)
あなたはhook_pre_saveを試すことができますので、それはメインノードが影響を受ける前でなければなりません
Drupal 8では、hook_entity_update()を使用する必要があります。
このフックは、エンティティストレージが更新されると実行されます。
/**
* Respond to creation of a new entity.
*
* This hook runs once the entity has been stored. Note that hook
* implementations may not alter the stored entity data.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity object.
*
* @ingroup entity_crud
* @see hook_ENTITY_TYPE_insert()
*/
function hook_entity_insert(Drupal\Core\Entity\EntityInterface $entity) {
// Insert the new entity into a fictional table of all entities.
\Drupal::database()->insert('example_entity')
->fields([
'type' => $entity->getEntityTypeId(),
'id' => $entity->id(),
'created' => REQUEST_TIME,
'updated' => REQUEST_TIME,
])
->execute();
}