web-dev-qa-db-ja.com

プログラムでDrupal 8にノードを作成する方法は?

Drupal 8で新しいモジュールを設計しています。これは、少なくとも数か月は公開されない長期的なプロジェクトなので、次の方法として使用しています。何が新しいかを理解します。

このモジュールでは、プログラムでノードを作成できるようにしたいと思います。 Drupal 7では、オブジェクトを作成してから、「node_submit」と「node_save」を呼び出すことでこれを行います。

これらの関数はDrupal 8には存在しません。代わりに、ドキュメントによると、「モジュールとスクリプトは、通常のフォームAPIパターンを使用してプログラムでノードを送信できます。」私は途方に暮れています。これはどういう意味ですか?私はFormAPIを使用してDrupal 7でフォームを作成しましたが、ドキュメントがここで言っていることを理解できません。

私が探しているのは、ユーザーが提示したフォームから直接取得されていない情報に基づいて、少なくとも1つ、場合によっては複数の新しいノードをプログラムで作成することです。私はできる必要があります:

1)コンテンツタイプを指定します

2)URLパスを指定します

3)以前は廃止されたnode_object_prepare()によって処理されていたその他の必要な変数を設定します。

4)新しいノードオブジェクトをコミットします

特定のブロックやフォームに関連付けられていない、独立した高度に抽象化された関数でこれを実行できるようにしたいと思います。

だから私は何が欠けていますか?

11
chapka

理解した。この問題を抱えている他の人にとっては、ノードはエンティティとして扱われるようになり、エンティティモジュールはコアの一部になりました。したがって、私のコードは次のようになりました。

$new_page_values = array();
$new_page_values['type'] = 'my_content_type';
$new_page_values['title'] = $form_state['values']['page_title'];
$new_page_values['path'] = $new_page_path;

$new_page = entity_create('node', $new_page_values);
$new_page->save();
2
chapka
use Drupal\node\Entity\Node;

$node = Node::create(array(
    'type' => 'your_content_type',
    'title' => 'your title',
    'langcode' => 'en',
    'uid' => '1',
    'status' => 1,
    'field_fields' => array(),
));

$node->save();
18
Rookie Rod

RE:非推奨のエンティティの作成

これは、非推奨の関数を使用しない場合の簡単な使用例です。これは、動的な作成に特に役立ちます。

//define entity type and bundle
$entity_type="node";
$bundle="article";

//get definition of target entity type
$entity_def = \Drupal::entityManager()->getDefinition($entity_type);

//load up an array for creation
$new_node=array(
  //set title
  'title' => 'test node',

  //set body
  'body' => 'this is a test body, can also be set as an array with "value" and "format" as keys I believe',

  //use the entity definition to set the appropriate property for the bundle
  $entity_def->get('entity_keys')['bundle']=>$bundle
);

$new_post = \Drupal::entityManager()->getStorage($entity_type)->create($new_node);
$new_post->save();
5
Trey

Devel/devel_generateモジュールのD8バージョンには、この良い例があります。

から devel_generate

  $edit_node = array(
    'nid' => NULL, 
    'type' => $node_type, 
    'uid' => $users[array_Rand($users)], 
    'revision' => mt_Rand(0, 1), 
    'status' => TRUE, 
    'promote' => mt_Rand(0, 1), 
    'created' => REQUEST_TIME - mt_Rand(0, $results['time_range']), 
    'langcode' => devel_generate_get_langcode($results),
  );
  if ($type->has_title) {
    // We should not use the random function if the value is not random
    if ($results['title_length'] < 2) {
      $edit_node['title'] = devel_create_greeking(1, TRUE);
    }
    else {
      $edit_node['title'] = devel_create_greeking(mt_Rand(1, $results['title_length']), TRUE);
    }
  }
  else {
    $edit_node['title'] = '';
  }
  // @todo Remove once comment become field. http://drupal.org/node/731724
  if (Drupal::moduleHandler()->moduleExists('comment')) {
    $edit_node['comment'] = variable_get('comment_' . $node_type, COMMENT_NODE_OPEN);
  }
  $node = entity_create('node', $edit_node);

フォーマットされたテキストの使用

前後のコード行でgrepを使用すると、「full_html」を使用してノードを追加する方法を理解するのに役立ちました。

これでDrupalコアコードを検索します:

$ cd drupal/core
$ grep -B 5 -A 5 -r entity_create.*node * > /tmp/temp-grep.txt

次に、テキストエディタで/tmp/temp-grep.txtを開きます。あちこちを少し突くと、これが表示されます:

--
modules/editor/src/Tests/EditorFileUsageTest.php-    $body_value .= '<img src="awesome-llama.jpg" data-editor-file-uuid="invalid-editor-file-uuid-value" />';
modules/editor/src/Tests/EditorFileUsageTest.php-    // Test handling of a non-existing UUID.
modules/editor/src/Tests/EditorFileUsageTest.php-    $body_value .= '<img src="awesome-llama.jpg" data-editor-file-uuid="30aac704-ba2c-40fc-b609-9ed121aa90f4" />';
modules/editor/src/Tests/EditorFileUsageTest.php-    // Test editor_entity_insert(): increment.
modules/editor/src/Tests/EditorFileUsageTest.php-    $this->createUser();
modules/editor/src/Tests/EditorFileUsageTest.php:    $node = entity_create('node', array(
modules/editor/src/Tests/EditorFileUsageTest.php-      'type' => 'page',
modules/editor/src/Tests/EditorFileUsageTest.php-      'title' => 'test',
modules/editor/src/Tests/EditorFileUsageTest.php-      'body' => array(
modules/editor/src/Tests/EditorFileUsageTest.php-        'value' => $body_value,
modules/editor/src/Tests/EditorFileUsageTest.php-        'format' => 'filtered_html',
--

'body'が 'value'と 'format'の配列になることに注意してください。

5
David Luhman

コアサービスを使用してDrupal 8でノードを作成する最良の方法

$node = \Drupal::entityTypeManager()->getStorage('node')->create([
  'type'       => 'content_type_machine_name',
  'field_text' => 'Foo',
  'title'      => 'Text Title',
]);
$node->save();
1
Vernit Gupta