メインコンテンツに移動

Drupal : 一括インポートができる「Feedsモジュール」

Feedsモジュールを調査したのでメモ。

動作環境

Drupal 9.0.0

モジュール

  • Feeds 8.x-3.0-alpha8
  • Feeds Extensible Parsers 8.x-1.0-alpha4

モジュールの機能

  • CSVやJSONからコンテンツ、ユーザ、タクソノミータームなどを一括インポートできる。

主な使い方

  1. Feed typeを定義する
  2. feed を追加・実行

Feed typeはIN/OUTの指定とマッピング定義。Fetcher, Parser, Processorを決めて、マッピングを指定する。

  • Fetcher
    • データ取得方式を指定。方式だけ指定してfeed追加時に実際のファイルパスを指定する。 選択肢:URLからダウンロード・ファイルアップロード・ディレクトリ
  • Parser
    • データ形式を指定。CSV・JSON・RSS・XMLなど。
  • Processor
    • インポート先のエンティティを指定。コンテンツ、ユーザ、タクソノミーターム、メニュー、ブロックなど。 コンテンツエンティティが対象。
  • マッピング
    • データ項目とエンティティ項目の紐付けをする。 例えばコンテンツのタイトルやフィールドをcsvのヘッダやJSONのkeyで紐付けできる。 ユニークの指定すれば、更新も可能。

実行はコンテンツを作成する要領でfeedを作成し、取り込みたいファイル(URL)を指定、Save and import 。 インポートしたエンティティはfeed itemとして管理対象になるので、一括削除や更新・新規が混じった再インポートも可能。

その他できること

  • エンティティリファレンスのフィールドは、何で検索して紐付けるか指定できる。名前、id、uuidも指定できる。 ない場合は、自動生成して紐付けの指定も可能。
  • drupalのcron機能に沿って自動更新が可能。 ディレクトリにCSV配置してcronで定期実行できるので、外部システムから定期取込という仕様に対応できそう。
  • バックグラウンド実行ができる。
  • 実行ステータスを持っているので2重実行はできない。素敵!

できないこと

  • URLからダウンロードできるが認証がある場合、URLに認証情報が含められればOK。OAuthとかはNG。
  • フィールドがリスト形式の場合、データ元は管理画面のプルダウン見えている名称ではなく、内部で認識している値を指定する必要がある。
  • ユーザインポートでロールを指定する機能がない。
  • メディアのインポートはできない。メディア = ファイル&メディア、2つエンティティを対応する必要があるからだと思う。
  • コンテンツの翻訳登録はNG。
  • 1つのCSVから複数のコンテンツタイプをまとめてインポートはできない。コンテンツタイプごとにFeed typeも分ける必要がある。

カスタマイズの範囲

  • Fetcher/Parser/Processor/Target(マッピングの定義)は全部プラグインなのでやや手間でも作りたい放題。

  • イベントの定義が豊富なので、EventSubscriberでカスタマイズでもいいかも。

    • インポート前、Fetcher/Parser/Processor それぞれ実行時、インポート完了後
    • エンティティのバリデーション前、save前、save後

代替手段

あえていうならMigrate API。多言語でコンテンツインポートなら、Migrate APIしかない気がする。 それ以外ならFeeds + カスタマイズでいいんじゃないかな?とも思う。