プログラムでコンテンツを作成する


9

Drupal 8では、プログラムでコンテンツをどのように作成できますか?「Drupal 8」の管理から、新しいタイプの「家」を作成しました(説明、画像、ユーザーへの参照フィールドを含む...)。カスタムモジュールからエンティティタイプ「ハウス」を作成するにはどうすればよいですか?

私のカスタムモジュールには、フォームファイルがあります(FormBaseを拡張するクラスが含まれています)。送信コールバックで、新しい「家」を作成して値を設定し、新しいエンティティを保存します。

コアにはWeb上の例はありません...


2番目の質問「エンティティタイプ「家」を作成するにはどうすればよいですか?」少し混乱しています。問題は、「カスタムモジュールからノードタイプ「ハウス」のノードを作成するにはどうすればよいですか?」あいまいさは、Drupalで非常に具体的な意味を持つ「エンティティタイプ」の使用に起因し、「カスタムモジュールから 'House'というカスタムエンティティタイプを作成するにはどうすればよいですか?」または「バンドル「ハウス」を使用するカスタムエンティティを作成するにはどうすればよいですか?」
mradcliffe、2015年

回答:


15

Drupal 8でノードを作成する簡単な例を次に示します。

$data = [
  'type' => 'article', 
  'title' => 'My new title', 
  'uid' => 1
];
$node = Drupal::entityTypeManager()
  ->getStorage('node')
  ->create($data);
$node->save();

@mradcliffeのコメントにある非推奨関数を削除するために更新されました。ありがとう!

参考までに、このようなコードの小さなスニペットをテストする場合、drush core-cliコマンドはうまく機能します。参照:http : //www.drushcommands.com/drush-7x/core/core-cli


1
保存する前に、entityManagerを使用して、各フィールドについて知ることができますか:どのタイプのデータを設定する必要がありますか?(テキストフィールドのテキスト、ファイルのfidなど...)
matthieu lopez

現時点で私が知っている唯一の方法は、非推奨の別のメソッドであるEntityManager :: getDefinitions()を使用することですが、静的なcreateメソッドを介してEntityDataDefinitionをインスタンス化すると、getPropertyDefinitions()を呼び出すことができると思います。どちらも、タイトルやフィールドなどの各プロパティの定義を返します。同じものを返しますが、ストレージエンティティからのgetFieldStorageDefinitions()もあります(上記のgetStorage( 'node')を参照)。ただし、これは非SQLドライバーでは使用できない場合があります。
mradcliffe、2015年

0

Drupal 8以降、ノードはエンティティーとして扱われるようになりました。次のコードでノードを簡単に作成できます

$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
entity_create()は、使用を避けるべき非推奨のメソッドです。EntityManagerをFormクラスに挿入するか、\ Drupal :: entityManagerを使用することは、エンティティを管理する標準的な方法です。
mradcliffe、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.