機能的には、作成/挿入時にノードを(異なるノードタイプで)複製することが目的です。
より正確に言うと、私には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
}
}
どんな助けや提案も大歓迎です
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();
}
}
テーマ名がデルタの場合、関数名は次のようになります。
delta_node_insert