$30 off During Our Annual Pro Sale. View Details »

Drupal8 Migrate API

kazukomurata
November 23, 2019

Drupal8 Migrate API

kazukomurata

November 23, 2019
Tweet

More Decks by kazukomurata

Other Decks in Programming

Transcript

  1. Drupal8
    Migrate API
    コンテンツ移行

    View Slide

  2. 自己紹介 村田和子 @kazuno_ko85
    ● Drupal歴4年くらい。設計・プロジェクト管理がメイン。
    ● 月1でDrupal Meetup Tokyo にいます。https://drupal-tokyo.connpass.com/
    ● フリーランス。2020年からエンジニアとは少し違う分野に挑戦したい。

    View Slide

  3. コンテンツ移行と言うと・・・
    Drupal8サイト
    Drupal9サイト
    Drupal7サイト
    他のCMS
    etc...
    HTML群

    View Slide

  4. 今日の観点
    Drupal8サイト
    Drupal9サイト
    Drupal7サイト
    他のCMS
    etc...
    HTML群

    View Slide

  5. Migrate API
    ● Drupalにはコンテンツ移行専用の
    APIがある。Migrate API!
    ● 見るべし :
    https://www.drupal.org/docs/8/api/migrate-api/migrate-api-overview
    ● 対象
    ○ Content Entity すべて。ノード、タクソノミー、ユーザー、カスタムエンティティも可能。
    ○ 翻訳も登録可能。一緒にターム参照も登録可能。
    ● なにがいいのか
    ○ 移行元と移行先のマッピング用テーブルあるので、新規・更新・削除が簡単
    ○ 移行元と移行先のマッピングを config(yaml)で定義していく作業がメイン。
    ○ カスタマイズは、プラグインとして作成できる。

    View Slide

  6. コンテンツ移行の手順 超簡易版
    ● 移行元のCSV用意
    ● config(yaml)作成
    ○ source : CSVの列定義を設定
    ○ process: CSVの列とフィールドをマッピング設定
    ○ destination: 移行先のコンテンツやタクソノミータイプを設定
    ● config(yaml)をインポート (コマンドか管理画面)
    ○ 例 drush config:import --partial
    --source=/app/web/modules/custom/p_demo_migrate/config/install
    ● 実行(コマンド)
    ○ 例 drush migrate:import p_demo_migrate_article --update

    View Slide

  7. Migrate APIの仕様にそって
    カスタマイズを減らそう
    簡単!とはいえ、Migrate APIのレールに乗らないと辛くなる。要件を調整しよう。
    ● config(yaml) 1つに対して、DBにマッピング用テーブルが
    1つ出来る。
    ● 異なるエンティティは一緒に登録できない
    (ノードとユーザをコマンド1発で登録は無理)
    ● 翻訳は、config(yaml) は別々に作成する必要あり
    ● 例 : 記事コンテンツをカテゴリつきで、メイン
    :日本語, 翻訳:英語で移行したい。
    ○ カテゴリ(日本語)をタクソノミーで言語=日本語として移行
    ○ カテゴリ(英語)を日本語ノードと紐付けつつ英語翻訳として移行
    ○ 記事コンテンツ(日本語)をノードで言語=日本語として移行
    ○ 記事コンテンツ(英語)を日本語ノードを紐付けつつ英語翻訳として移行
    ● 4回に移行の実行を分けることで、コードなしで移行が可能
    (かも)

    View Slide

  8. ファイルは・・・?
    ● よくあるファイルフィールドであれば、コントリビュートモジュールで可能
    ○ migrate_fileモジュール
    ● メディアにしたい場合は、config(yaml) でコンテンツとは別に移行する必要あり
    ● 本文中の画像やファイルリンク先のファイルはどうする・・・
    ?奥の手↓
    ○ 素直にやるとファイルフィールドやメディアにアップし、本文内の
    imgタグやaタグのパス
    書き換える必要が・・・。
    ○ 1. 対象ファイルだけ一式抜いてドキュメントルートに置いちゃう
    (ただしちょっと気持ち悪
    い)
    ○ 2.対象ファイルだけ一式抜いて
    publicフォルダ配下に配置
    ■ NginxやApachのリライトでしのぐ or 本文内のパスをpublicフォルダ配下の画像
    を見るように置くのが・・・いいかも。

    View Slide

  9. カスタマイズ例
    いままで見た・作成したカスタマイズです。
    ● source
    ○ 別CMSのDBからデータを引っこ抜く
    ● process
    ○ 指定パスをもとにhtmlファイルを読み込む(そのあと本文フィールドに指定
    )
    ○ パラグラフ化する
    ○ 投稿者が想定のユーザと異なる場合、登録更新スキップ
    ● destination
    ○ なし

    View Slide

  10. よく使うコントリビューションモジュール
    ● migrate_plus
    ○ processプラグインの提供多し。これがないとマジでつらい。
    ● migrate_tools
    ○ drush実行するなら必須
    ● migrate_file
    ○ ファイル登録
    ● migrate_source_csv
    ○ CSVから移行するなら必須

    View Slide

  11. 実装時に参考になる資料
    ● 翻訳コンテンツの設定方法
    ○ core/modules/migrate/tests/modules/migrate_external_translated_test/migrations
    ○ オリジナル言語と翻訳言語の configがある
    ● process プラグイン
    ○ https://www.drupal.org/docs/8/api/migrate-api/migrate-process-plugins/list-of-core-migrate-proce
    ss-plugins
    ○ https://www.drupal.org/docs/8/api/migrate-api/migrate-process-plugins/list-of-process-plugins-pr
    ovided-by-migrate-plus
    ● 日本語の説明記事
    ○ https://qiita.com/masam10/items/5b0d14d2af0115307d27

    View Slide