web-dev-qa-db-ja.com

保存後にノードのフックはありますか?

英語のコンテンツが非公開の場合、翻訳を非公開にするにはどうすればよいですか? 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."

したがって、ノードを保存した後にこれが機能するかどうかを確認します。保存後にノードのフックはありますか?または、ソース言語(英語)を非公開にしてノードの言語コンテンツを非公開にする方法はありますか?

1
i am batman

あなたが探しているのはこれでしょうか:

Entity :: postSave(EntityStorageInterface $ storage、$ update = TRUE)

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21Entity.php/function/Entity%3A%3ApostSave/8.6.x

1
Matoeil

あなたはhook_pre_saveを試すことができますので、それはメインノードが影響を受ける前でなければなりません

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21entity.api.php/function/hook_entity_presave/8.6.x

1
Leigh

Drupal 8では、hook_entity_update()を使用する必要があります。
このフックは、エンティティストレージが更新されると実行されます。

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21entity.api.php/function/hook_entity_update/8.3.x

1
/**
 * 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();
}
0
Mykola Veriga