blogスタッフブログ
HOME > スタッフブログ > CMS >PowerCMS Xのプラグインで使うモデルを作成した際にCSVをインポートする

PowerCMS Xのプラグインで使うモデルを作成した際にCSVをインポートする

ブロックエディタプラグインで定義しているブロックモデルがデータベースに作成された際にブロック情報を格納したCSVをインポートすることを考えました。ただ、モデルが作成されるのはプラグインを有効化した時ではなく、プラグインを有効化した後さらにスキーマアップデート操作をした時であることに気付きました。つまり、プラグインのactivateメソッドでは意図した挙動になりません。

スキーマ管理画面の処理はclass.PTUpgrader.phpのmanage_schemeメソッドにあるのでサッと確認したところ、コールバック・フックポイントはなさそうですが、処理の最後にプラグインのconfig.json内のupgrade_functionsを確認してメソッドを実行することが分かりました。これを利用してCSVをインポートするようにしました。

config.jsonに記述するupgrade_functionsは以下のようにしました。

{
    "label": "ComponentBlocks",
    "id": "componentblocks",
    "component": "ComponentBlocks",
    "upgrade_functions": {
        "block": {
            "version_limit": "999",
            "component": "ComponentBlocks",
            "method": "import_blocks"
        }
    },

今回はバージョン問わず実行したいのでversion_limitを999にしていますが、例えば1.3未満のスキーマからアップデートした時のみ実行する場合は1.3などを指定します。methodに実行したいメソッド名を記述します。

これでブロックモデルが作成された時にimport_blocksメソッドが呼ばれるので、以下のようにブロックモデルのオブジェクトが0件の時のみPTImporterを利用してCSVをインポートするようにしました。

/**
 * プラグイン有効化時にブロックをインポートする
 *
 * @param Prototype $app
 * @return void
 */
public function import_blocks( $app ) {
    $table = $app->get_table( 'block' );
    if ( ! $table ) {
        return;
    }

    $block_count = $app->db->model( 'block' )->count();
    if ( $block_count === 0 ) {
        $class_path = $app->components[ 'componentblocks' ]->path;
        $plugin_dir = str_replace( DS . get_class() . '.php', '', $class_path );
        $file = $plugin_dir . DS . 'appendix' . DS . 'blocks.csv';

        $importer = new PTImporter();
        $importer->print_state = false;
        $importer->import_from_files( $app, 'block', $plugin_dir, [ $file ] );
    }
}

最近の記事

カテゴリ

アーカイブ

スタッフ別