PowerCMS X ブログ
2026-03-02
PowerCMS Xを使用している運用案件で私がカスタマイズをした事例のご紹介です。
イベントをPowerCMS Xで管理するケースはしばしばあります。月別アーカイブでその月のイベントを一覧表示し、詳細ページへリンクする構成が一般的でしょう。この場合、各イベントオブジェクトの公開日はイベントの開催日になりますが、このイベントオブジェクトを公開予約しようとすると「イベント開催日より前には公開予約できないのでは?」という問題に直面します。どのようにすればよいでしょうか。
PowerCMS Xにおける「公開する」という処理を単純化すると「ステータスを 4(公開)に変更すること」と「HTMLファイルを出力すること」と捉えられます。そこで、まずイベントモデルに「日付と時刻」タイプのcustom_published_onカラムを設けて公開予約したい日時を指定することとし、指定の日時を超えたオブジェクトはステータスを4にするようにコードを書きます。
$app->get_scheme_from_db( 'event' );
$terms = [
'rev_type' => 0,
'status' => 3, // 公開予約(=3)のオブジェクトを抽出対象とする
'custom_published_on' => [ '<=' => date( 'YmdHis' ) ], // NOTE: 公開予約日時を超えたオブジェクトを抽出対象とする
];
$events = $app->db->model( 'event' )->load( $terms );
foreach ( $events as $event ) {
$event->status( 4 ); // ステータスを「公開(=4)」に変更
$event->modified_on( date( 'Y-m-d H:i:s' ) ); // 更新日時を現在日時に更新
$event->modified_by( 1 ); // 更新者をシステム管理者に設定(案件毎に適宜選択)
$event->save();
}
オブジェクトを公開した後はHTMLファイルを出力する必要があります。難しそうに感じるかもしれませんが、PowerCMS Xではオブジェクトをpublish_objメソッドに渡してやるだけでOKです。
$app->publish_obj( $event );
月別アーカイブの再構築をする必要もありますね。URLマッピングからテンプレートオブジェクトを取り出してpublish_objメソッドに渡してやります。
$urlmapping_id = 2; // 月別アーカイブのURLマッピングID
$urlmapping = $app->db->model( 'urlmapping' )->load( $urlmapping_id, null, 'id,template_id' );
$template = $urlmapping->template;
$app->publish_obj( $template );
ご紹介した2つの処理、そしてリビジョン生成処理を加えると以下のようなコードになります。このスクリプトをuser_customized_files/tools等に配置し、cronで定期的に実行すればイベントをcustom_published_onで指定した日時にイベントを公開できるようになります。cronの実行頻度は運用ポリシーに応じて適宜設定してください。
<?php
require_once 'class.Prototype.php';
$app = new Prototype( ['id' => 'Worker'] );
$app->logging = true;
$app->init();
function make_revision_object( Prototype $app, PADOMySQL $obj ): PADOMySQL {
$revision = clone $obj;
$revision->_meta = $app->get_meta( $obj );
$revision->_relations = $app->get_relations( $obj );
$revision->id( null );
return $revision;
}
// オブジェクトの抽出
$app->get_scheme_from_db( 'event' );
$terms = [
'rev_type' => 0,
'status' => 3, // 公開予約のオブジェクトを抽出対象とする
'custom_published_on' => [ '<=' => date( 'YmdHis' ) ], // 公開予約日時を超えたオブジェクトを抽出対象とする
];
$events = $app->db->model( 'event' )->load( $terms );
$count = count( $events );
foreach ( $events as $event ) {
$event_original = make_revision_object( $app, $event ); // 現状をリビジョン化する
$event->status( 4 ); // ステータスを「公開」に変更
$event->modified_on( date( 'Y-m-d H:i:s' ) ); // 更新日時を現在日時に更新
$event->modified_by( 1 ); // 更新者をシステム管理者に設定(案件毎に適宜選択)
PTUtil::pack_revision( $event, $event_original ); // 更新後と比較等してリビジョンを保存
$event->save(); // イベントを保存
$app->publish_obj( $event ); // イベントをパブリッシュ
}
// インデックス(月別)のパブリッシュ
if ( $count > 0 ) {
$urlmapping_id = 2; // 月別アーカイブのURLマッピングID
$urlmapping = $app->db->model( 'urlmapping' )->load( $urlmapping_id, null, 'id,template_id' );
$template = $urlmapping->template;
$app->publish_obj( $template );
$app->log( '公開予約されていたイベントを公開しました。(' . $count . '件のイベント)' );
}
カテゴリー:技術情報
投稿者:安倍