CSV Importer
CSVファイルからDrupalのコンテンツエンティティ(ノード、ユーザー、タクソノミータームなど)を一括インポートするための強力で柔軟なモジュールです。
csv_importer
インストール
composer require 'drupal/csv_importer:8.x-2.1'
composer require 'drupal/csv_importer:8.x-1.16'
概要
CSV Importerは、CSVファイルからDrupalの様々なエンティティタイプにデータを効率的にインポートするための包括的なソリューションを提供します。このモジュールは、CSVファイルの列をエンティティのフィールドに自動的にマッピングし、コンテンツの一括作成や既存コンテンツの更新を可能にします。
主な特徴として、すべてのコンテンツエンティティタイプ(ノード、ユーザー、タクソノミーターム、コメント、メディアなど)を自動検出してインポート対象として選択できます。複数値フィールドへの対応、多言語翻訳のインポート、大量データのバッチ処理、そしてインポート履歴の管理と巻き戻し機能を備えています。
CSVファイルはUTF-8形式である必要があり、先頭行にはフィールド名(マシン名)を記載します。複数値フィールドには特殊な構文(values()またはmultiple())を使用することで、1つのセルに複数の値を含めることができます。
開発者向けにはプラグインシステムとフックAPIを提供しており、インポート処理のカスタマイズや拡張が可能です。
Features
- すべてのコンテンツエンティティタイプへの対応:ノード、ユーザー、タクソノミーターム、コメント、メディアなど、Drupalに登録されているすべてのコンテンツエンティティタイプを自動検出し、インポート先として選択できます
- 複数値フィールドのサポート:values(value1+value2)またはmultiple(value1+value2)構文を使用して、無制限カーディナリティのフィールドに複数の値を一度にインポートできます
- 多言語翻訳のインポート:langcodeカラムを指定することで、既存エンティティへの翻訳追加や多言語コンテンツの一括作成が可能です
- 既存エンティティの更新:CSVにエンティティIDを含めることで、新規作成ではなく既存エンティティの更新を行えます
- ファイルフィールドへの対応:ファイルパスをCSVに記載することで、画像やドキュメントファイルを自動的にアップロードしてフィールドにアタッチします
- インポート履歴管理:すべてのインポート操作が記録され、インポートしたエンティティの一覧、件数、日時を確認できます
- インポートの巻き戻し(Revert)機能:間違えてインポートした場合、履歴画面から一括でインポートしたエンティティを削除できます
- バッチ処理による大量データ対応:大きなCSVファイルもバッチ処理により安定してインポートでき、進捗状況がリアルタイムで表示されます
- 柔軟な区切り文字対応:カンマ(,)、チルダ(~)、セミコロン(;)、コロン(:)から区切り文字を選択可能です
- プラグインシステムによる拡張性:独自のインポーターを作成してエンティティタイプ固有の処理をカスタマイズできます
- フックAPIによるデータ前処理:hook_csv_importer_pre_importを使用してインポート前にCSVデータを加工できます
Use Cases
既存サイトからのコンテンツ移行
他のCMSやDrupalサイトからエクスポートしたCSVデータをインポートして、コンテンツを一括移行できます。ノードID(nid)を指定することで、既存コンテンツの更新も可能です。移行後に問題が見つかった場合は、履歴画面から一括で削除(巻き戻し)できます。
商品カタログの一括登録
Eコマースサイトで商品情報をスプレッドシートで管理している場合、CSVにエクスポートしてDrupalの商品コンテンツタイプに一括インポートできます。複数値フィールド(複数画像、複数カテゴリなど)にはvalues()構文を使用します。
ユーザーの一括登録
組織のユーザー情報をCSVで準備し、Drupalユーザーとして一括登録できます。メールアドレス、ユーザー名、プロフィールフィールドなどをまとめてインポートします。
多言語サイトの翻訳コンテンツ作成
翻訳済みコンテンツをCSVで準備し、langcodeカラムで言語を指定してインポートすることで、既存コンテンツに翻訳を追加できます。翻訳会社から受け取った翻訳データの一括反映に便利です。
タクソノミー用語の階層構造インポート
カテゴリやタグなどのタクソノミー用語をCSVから一括インポートできます。parent(親ターム)フィールドを使用して階層構造も定義可能です。
テストデータの一括生成
開発環境やステージング環境で大量のテストコンテンツを作成する際に使用します。インポート後の動作確認が終わったら、履歴から一括削除して環境をクリーンに保てます。
Tips
- CSVファイルを作成する際は、インポート先エンティティのフィールド一覧(/admin/structure/types/manage/[bundle]/fields)を参照して、正確なフィールドマシン名を使用してください
- 初めてインポートする際は、少数のデータで試験的にインポートし、期待通りの結果が得られることを確認してからフルデータをインポートしてください
- インポートしたエンティティに問題があった場合は、履歴画面(/admin/content/csv-importer/history)から一括削除できます。本番環境でインポートする前にこの機能を把握しておくと安心です
- エンティティIDを指定してインポートすることで、既存エンティティの更新が可能です。新規作成時にはID列を空にするか省略してください
- hook_csv_importer_pre_importを使用して、インポート前にデータのバリデーションやクリーンアップを行うカスタムモジュールを作成できます
- 区切り文字にカンマを使用する場合、セル内にカンマが含まれる場合はダブルクォートで囲むCSVの標準的なルールに従ってください
- 多言語サイトで翻訳をインポートする場合は、先にデフォルト言語のコンテンツを作成し、その後langcodeを指定して翻訳をインポートしてください
Technical Details
Admin Pages 2
/admin/content/csv-importer
CSVファイルをアップロードしてDrupalエンティティにデータをインポートするメイン画面です。エンティティタイプの選択、バンドルの選択、区切り文字の指定、ファイルのアップロードを行い、一括インポートを実行します。
/admin/content/csv-importer/history
過去に実行したすべてのCSVインポートの履歴を表示する画面です。インポートしたファイル名、エンティティタイプ、バンドル、インポート件数、日時、ステータスが一覧で確認でき、必要に応じてインポートを巻き戻す(削除する)ことができます。
権限 1
Hooks 2
hook_csv_importer_pre_import
CSVデータがエンティティとして保存される前に呼び出され、インポートデータを変更できます。データのクリーンアップ、変換、バリデーションなどに使用します。
hook_importer_info_alter
インポータープラグイン定義を変更するためのalterフックです。プラグインマネージャーによって自動的に呼び出され、プラグインの追加、削除、変更が可能です。
Troubleshooting 7
CSVファイルの先頭行(ヘッダー行)に必須フィールドのマシン名が含まれているか確認してください。エンティティタイプの必須フィールド(例:nodeの場合はtitle)が不足している場合にこのエラーが発生します。
CSVファイルがUTF-8エンコーディングで保存されているか確認してください。Excelで作成したCSVはShift-JISで保存されることがあるため、UTF-8で再保存するか、メモ帳などでUTF-8に変換してください。
複数値をインポートするには、values(value1+value2+value3)またはmultiple(value1+value2+value3)の形式でセルに記述する必要があります。値の区切りには+(プラス記号)を使用します。
CSV Importerはコンテンツエンティティのみをサポートしています。設定エンティティ(ビュー、イメージスタイルなど)はインポート対象外です。また、カスタムエンティティの場合はキャッシュをクリアしてから再度確認してください。
バッチ処理を使用しているため通常はタイムアウトしませんが、非常に大きなファイルの場合はPHPのmax_execution_timeやmemory_limitの設定を確認してください。また、CSVを分割してインポートすることも検討してください。
エンティティが他のエンティティから参照されている場合や、削除権限がない場合、削除に失敗することがあります。ログ(/admin/reports/dblog)でエラーメッセージを確認してください。
CSVセルにはサーバー上のファイルへの絶対パスを記述する必要があります。ファイルが指定されたパスに存在し、Drupalから読み取り可能であることを確認してください。
Security Notes 4
- 「Access CSV Importer」パーミッションは信頼できるユーザーにのみ付与してください。このパーミッションを持つユーザーはデータベースに直接データを挿入できるため、悪意のあるデータがインポートされる可能性があります
- CSVファイル内のHTMLタグやスクリプトは、フィールドタイプの設定に応じてサニタイズされます。ただし、フルHTMLフォーマットを使用するフィールドでは注意が必要です
- ファイルインポート機能を使用する場合、指定されたパスのファイルがサーバー上で読み取れる必要があります。ユーザーが任意のファイルパスを指定できる状況では、サーバー上の機密ファイルへのアクセスリスクがあります
- パーミッションは「restrict access: true」に設定されており、管理画面でパーミッションを付与する際に警告が表示されます