プログラムでコンテンツタイプの複製ノードを作成したい。
これを行う方法はありますか?
注:これを行うためにモジュールを使用したくありません。
Drupal 8では、EntityInterface :: createDuplicate()を使用して任意のエンティティを複製できます。ノードオブジェクトの場合:$ cloned_node = $ node-> createDuplicate()。$ cloned_node-を呼び出します> save()は、別のIDで新しいノードを保存します。
配列内の元のノードから値を読み取り、そのデータを使用して新しいノードを作成できます。
$storage = \Drupal::entityTypeManager()->getStorage('node');
$node = $storage->load($nid);
$original_values = $node->toArray();
// assign content type as string, the array causes an error when creating a new node
$original_values['type'] = $node->bundle();
// change title
$original_values['title'] = $node->label() . ' (cloned)';
// remove nid and uuid, the cloned node is assigned new ones when saved
unset($original_values['nid']);
unset($original_values['uuid']);
// remove revision data, the latest revision becomes the only one in the new node
unset($original_values['vid']);
unset($original_values['revision_translation_affected']);
unset($original_values['revision_uid']);
unset($original_values['revision_log']);
unset($original_values['revision_timestamp']);
$node_cloned = $storage->create($original_values);
$node_cloned->save();
はい、Drupal 8でもノードを複製できます。以下の例を確認してください:
注:このコードを完全にテストしていません。これがクローンされるノードにも影響するかどうかはわかりません。
use Drupal\node\Entity\Node;
$node_clone = Node::load($id);
$node_clone->nid = NULL;
$node_clone->vid = NULL;
$node_clone->tnid = NULL;
$node_clone->log = NULL;
// Also handle modules that attach a UUID to the node.
$node_clone->uuid = \Drupal::service('uuid')->generate();
$node_clone->vuuid = NULL;
// Anyonmymous users don't have a name.
$node_clone->name = 'Anonymous';
$node_clone->uid = 0;
$node_clone->created = time();
$node_clone->path = NULL;
$node_clone->files = array();
$node_clone->setTitle('Clone Node');
$node_clone->save();