Drupal8のカスタムモジュールでコンテンツを追加・読取・編集・削除

  •  
 
トビウオ に投稿
基礎知識
  • Drupalでは、「コンテンツ」≒「ノード」です
  • ノードの種類は「コンテンツタイプ」と呼ばれ、プログラミングせずとも、Drupalの管理画面から自由に作成できます
  • コンテンツタイプには1つ以上の「フィールド」が含まれます
  • フィールドの種類は様々で、数字や文字列や真偽値やタクソノミーや他コンテンツなど、様々な種類のデータに対応したフィールドがあります
  • ノードはノードIDによって管理されています
追加

 Nodeクラスのcreateメソッドを使えば、任意のコンテンツタイプからなるコンテンツを作り出せます。

use Drupal\node\Entity\Node;
$node = Node::create([
    'type' => 'sample_content_type',
    'title' => 'テスト',
    'sample_text' => "本日は\n晴天なり",
    'sample_flg' => true,
]);
$node->save();
読み取り

 フィールドの値を読み出すには、ノードのストレージを取り出してから読み込む方法と、Nodeクラスのloadメソッドを使う方法があります。Drupalの公式掲示板のコメントによれば、前者はDrupal 8が依存性の注入にこだわった結果生み出された「正統な」文法で、後者はそれがあまりに長ったらしいので生み出されたメソッドとのこと。

// 長め
$nid = 123;  //ノードID
$node = \Drupal::entityManager()->getStorage('node')->load($nid);

// 短め
use Drupal\node\Entity\Node;
$node = Node::load($nid);

 ただし、前者は複数同時に読み込む機能と検索機能が付いています。

$node_storage = \Drupal::entityTypeManager()->getStorage('node');  //変数として蓄えておける

$nids = [123, 456, 789];  //ノードIDの配列
$nodes = $node_storage->loadMultiple($nids);  //Nodeクラスの配列

// この場合、コンテンツタイプ(type)が「記事(article)」で、
// あるフィールド(field_xxx)の値が「3.14」であるもの全てを検索しています
$query = \Drupal::entityQuery('node')
  ->condition('type', 'article'),
  ->condition('field_xxx', 3.14);
$nids = $query->execute();
$nodes = $node_storage->loadMultiple($nids);

 なお、Node::loadにしてもgetStorage->loadにしても、指定したノードIDにデータがない場合はNullを返します。

 ノードからは、ノードID・コンテンツタイプ・タイトル・作成日時・本文のHTML・任意のフィールドの値などを読み出せます。また、糖衣文法もあります。

// 通常の文法
$node->id();                          // ノードID
$node->bundle();                      // コンテンツタイプ
$node->get('title')->value;           // "サンプル記事"
$node->get('created')->value;         // 作成日時のUNIX秒
$node->get('body')->value;            // "(本文のHTML?)"
$node->get('body')->summary;          // "概要文"
// カスタムフィールドの場合
$node->get('field_xxx')->value;       // カスタムフィールドの値
// ファイルの場合
$node->get('field_image')->target_id; // ファイルID

// 糖衣文法
$node->title->value;
$node->created->value;
$node->body->value;
$node->body->summary;
$node->field_foo->value;
$node->field_image->target_id;

// 「エンティティ参照」フィールドの場合、こう書かないと駄目だった
//複数項目の場合
$other_raw_nids = $node->get('field_other_node')->getValue();
$other_raw_nids = $node->field_other_node->getValue();
foreach ($other_raw_nids as $other_raw_nid) {
  // 実は$other_raw_nidsはノードIDの配列ではない
  // それぞれが「target_id」キーに入っているのでややこしい……
  $other_nid = $other_raw_nids['target_id'];
}
//単一項目の場合
$other_nid = $node->get('field_other_node')->getString();
$other_nid = $node->field_other_node->getString();
書き込み

 フィールドの値はsetメソッドを使えば上書きできます。また配列の場合、追加操作も可能です。いずれにしても、操作後はsaveメソッドで保存する必要があります。

$node->set('field_name', 'field_value');
$node->sample_field_arr[] = ['hoge' => 3];
$node->save();
削除

 コンテンツ自体を削除するにはdeleteメソッドを用います。また、複数同時に削除することもできます。

$node->delete();

$nids = [1,2,3,4];  //同時に消したいノードID
$nodes = $node_storage->loadMultiple($nids);
$node_storage->delete($nodes);

//以下のコードは、↑だとOut of Memoryする場合のコードになります
foreach($nids as $nid)
{
  $node = $node_storage->load($nid);
  $node->delete();
}
参考資料

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。