もうすぐ公開されるウェブページをメールなどで通知するタスクを作成しました。Novius OS は FuelPHP ベースの CMS なので、FuelPHP のタスク機能を使います。
FuelPHP のタスク
まず、FuelPHP のタスクについて紹介します。通常のウェブアプリケーションは、ブラウザから実行することが多いです。しかし、処理によっては、ブラウザではなく、コマンドラインから実行したいケースもあると思います。典型的には、バックアップやログローテーションなどのメンテナンス作業です。こういった処理を、タスクとして作成すると、コマンドラインから起動する、cronで定期実行する、といったことが容易に行えます。
予約投稿
Novius OS では、ページの予約公開機能が標準実装されています。このため、ページの公開開始日時と公開終了日時を指定することができます。(いずれか一方を指定しても、両方を指定してもOK)ページ編集画面の左上のボタンで設定を行います。
公開直前に通知するリマインダー機能
予約公開にしておくと、公開開始日時以降にアクセスされた場合、ページが表示されます。コンテンツについては、事前に用意しておけばよいですね。しかし、公開の直前にもう一度確認したい、という場合があるかもしれません。そういった場合、今回作ったタスクを有効にしておけば、もうすぐ公開されるページをメール通知してくれます。また、こうしておけば、公開日時を設定ミスしていた場合でも、事前に気づける可能性が高くなります。
<?php /** * Notice for Pages that will be Published in a few Days * Author: Fumito MIZUNO * License: AGPL ver 3.0 or later */ namespace Fuel\Tasks; class Noticeschedule { protected $email = 'novius-os@php-web.net'; protected $mes = <<<'EOD' Usage noticeschedule $start $days $start: startdate, which filters the scheduled page. Default is 0 (today) $days: Determines the duration days to search. This value must be a positive value. Default is 7 (1 week) Sample Usage noticeschedule 1 1 -- Searches the pages which wiil be published tomorrow. (from tomorrow and 1 day) noticeschedule 0 2 -- Searches the page which will be published either today or tomorrow. (from today and 2 days) EOD; protected $nodata = 'No Scheduled Posts from %s to %s'; public function run($start = 0, $days = 7) { if( !is_numeric($start) || !is_numeric($days) || $days <= 0) { echo $this->mes; exit; } $startday = sprintf('P%dD', $start); $endday = sprintf('P%dD', $days); $date_criteria = new \DateTime("now",new \DateTimeZone(\Fuel::$timezone)); $date_criteria->add(new \DateInterval($startday)); $date_start = $date_criteria->format('Y-m-d H:i:s'); $date_criteria->add(new \DateInterval($endday)); $date_end = $date_criteria->format('Y-m-d H:i:s'); // Find scheduled pages which will be published in $date_start - $date_end; $data = \Nos\Page\Model_Page::find('all', array( 'where' => array( array('page_publication_start', '>=', $date_start), array('page_publication_start', '<=', $date_end), ), )); // Check whether user-defined event exists. if (\Event::has_events('ounziw_noticeschedule')) { \Event::trigger('ounziw_noticeschedule', $data); } else // Do default { $output = ''; if ($data) { foreach ($data as $arr) { $output .= "\n"; $output .= "Title: "; $output .= $arr->page_title; $output .= "\n"; $output .= "Publication Date: "; $output .= $arr->page_publication_start; $output .= "\n"; } } else { $output .= sprintf($this->nodata,$date_start, $date_end); } // Send Mail $mail = \Email::forge(); $mail->to($this->email); $mail->subject('Recent Publication'); $mail->body($output); try { $mail->send(); } catch (\Exception $e) { $error = $e->getMessage(); logger(\Fuel::L_ERROR, 'The Notice Schedule task cannot send emails - '.$error); } } } }
上記のコードではメール通知ですが、イベントフックを設けています。このため、メール以外にも、チャットワークなどに通知することもできます。詳細はNovius OSを題材に、FuelPHPでチャットワークAPIを使ってみよう #PHP #FuelPHPをごらんください。
コマンドラインからの実行
以下のコマンドを実行します。
oil refine noticeschedule 開始日 期間
今日(実行から24時間以内)に公開される予定のページの場合は、次のように指定します。
oil refine noticeschedule 0 1
明日から三日間以内(実行から24時間~96時間後)に公開される予定のページの場合は、次のように指定します。
oil refine noticeschedule 1 3
引数を省略した場合は、今日から一週間以内、がデフォルトになっています。
oil refine noticeschedule 0 7
なお、「予約投稿が無い」場合、「予約投稿はありません」を通知するようにしています。