ブロックエディタプラグインで定義しているブロックモデルがデータベースに作成された際にブロック情報を格納した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 ] );
}
}