web-dev-qa-db-ja.com

ノードへのフック/エンティティの作成/挿入

機能的には、作成/挿入時にノードを(異なるノードタイプで)複製することが目的です。

より正確に言うと、私には2つのコンテンツタイプがあります。ニュースとプレスリリースです。私が達成したいのは、管理者でプレスリリースが行われると、ニュースアイテムも自動的に作成されるということです。

私はD8フック(具体的にはhook_ENTITY_TYPE_insert)を調べましたが、機能しません。ドキュメントがわかりにくくなっています。これは私の.themeファイルのようになります:

<?php
/**
 * @file
 * Bootstrap sub-theme.
 *
 * Place your custom PHP code in this file.
 */

/*
 * Implements hook_ENTITY_TYPE_insert().
 */
function hook_persbericht_insert(Drupal\Core\Entity\EntityInterface $entity)
{
    if (isset($entity->field_duplicate_to_news) && $entity->field_duplicate_to_news[0] === 'on')
    {
        // create a new news-article here
    }
}

どんな助けや提案も大歓迎です

4
Martijn Vreeken

drupalドキュメンテーションで「hook_」を使用すると書かれている場合は常に、「hook_」をモジュールまたはテーマの名前に置き換えることを意味します。このサイトでは、「mymodule_」が例:通常「ノード」、「taxonomy_term」、「user」などになるフックの説明に「ENTITY_TYPE」が表示される場合、それはエンティティのバンドルまたはサブタイプではありません。Drupalノードは、バンドルと同じ意味の「コンテンツタイプ」というラベルが付いています。バンドルは、多くの異なるエンティティで使用される用語であり、バックエンドの用語ですが、フロントエンドでは、エンティティタイプごとに異なるものがラベル付けされます。ノードの場合は「コンテンツタイプ」、分類法の場合は「語彙」です。

「ENTITY_TYPE」を探している場合は、フックでバンドルを使用したくないので、「persbericht」(「プレスリリース」)は正しくありません。ノードを使用したいと思います。

テーマは、変更フックなどの少数のフックのみを実装できます。 CRUD操作を実装することはできません。したがって、これをカスタムモジュールに配置します。

use Drupal\node\Entity\Node;
/**
 * Implements hook_ENTITY_TYPE_insert().
 */
function mymodule_node_insert(Node $node) {
  if ($node->bundle() == 'press_release') {
    $copy = Node::create([
      'title' => $node->getTitle() . ' copy!',
      'type' => 'article',
      'status' => 0,
    ]);
    foreach ($node as $key => $value) {
      // Copy values from all fields (fields start with "field_").
      if (strpos($key, 'field_') === 0) {
        if (isset($copy->{$key})) {
          $copy->{$key}->setValue($node->{$key}->getValue());
        }
      }
    }
    $copy->save();
  }
}
2
oknate

テーマ名がデルタの場合、関数名は次のようになります。

delta_node_insert

0
NewZeal