もうすぐ公開されるウェブページをメールなどで通知するタスクを作成しました。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
なお、「予約投稿が無い」場合、「予約投稿はありません」を通知するようにしています。

