web-dev-qa-db-ja.com

プログラムでノードを複製する方法は?

プログラムでコンテンツタイプの複製ノードを作成したい。

これを行う方法はありますか?

注:これを行うためにモジュールを使用したくありません。

3
Ashish Deynap

Drupal 8では、EntityInterface :: createDuplicate()を使用して任意のエンティティを複製できます。ノードオブジェクトの場合:$ cloned_node = $ node-> createDuplicate()。$ cloned_node-を呼び出します> save()は、別のIDで新しいノードを保存します。

からの回答はこちら

4
Ivan Tibezh

配列内の元のノードから値を読み取り、そのデータを使用して新しいノードを作成できます。

$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();
4
4k4

はい、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();
1
Yogesh