- ページモデルのあるオブジェクトの中で記事一覧を表示している
- 別のワークスペースで記事モデルを更新したら上記ページを更新したい
上記のような与件をどのように実現するか検討したのですが、URLマップの再構築トリガーを使うと意図しないワークスペースで記事を更新した際に全ページオブジェクトが再構築されるなど無駄が多くなると予想しました。PowerCMS(5や6)などで使用した「管理画面へのリクエスト・パラメータによるトリガーの指定」相当のものはプラグインを書くことで実現できますが、保存・削除・cronによる公開削除等に対応させるのが少し手間な感じがあります。
そこでPowerCMSのMTRebuildIndexByID
のようなファンクションタグを作成し、2.のワークスペースのインデックステンプレートに設置することにしました。PTPublisherクラスのpublishメソッドにURLオブジェクトを渡すと再構築が行われるので、条件を組み立ててURLオブジェクトを抽出しpublishメソッドに渡しました。以下サンプルコードです。<mt:RebuildFileByURL url="/foo/bar.html">
のように使う想定です。URLオブジェクトの抽出条件は適宜調整してください。
public function rebuild_file_by_url( $args, $ctx ) {
if (
$ctx->app->mode === 'view' ||
$ctx->app->param( '_model' ) === 'template' ||
$ctx->app->id === 'Bootstrapper'
) {
// NOTE: ビューの編集画面を開いた時やプレビュー時にテンプレートタグが処理されるため
return;
}
$target_url = array_key_exists( 'url', $args ) ? $args[ 'url' ] : null;
if ( empty( $target_url ) ) {
return;
}
$terms = [
'relative_url' => $target_url,
'delete_flag' => 0,
];
if ( array_key_exists( 'workspace_id', $args ) && is_numeric( $args[ 'workspace_id' ] ) ) {
$terms[ 'workspace_id' ] = (int) $args[ 'workspace_id' ];
}
$url = $ctx->app->db->model( 'urlinfo' )->load( $terms );
if ( count( $url ) > 0 ) {
$ctx->app->publisher->publish( $url[0] );
}
}
ご利用は計画的にお願いいたします。