最近公開された記事タイトルに「NEW」の文字を付け加える
コーポレートサイトを構築するとき、「お知らせ」「新着情報」などニュース系コンテンツの組み込みで
最近公開された記事のタイトルに「NEW」の文字を自動で付けてほしい
というリクエストが来ることがよくあります。ありますよね?みなさん。WordPressだと、テンプレートタグ get_the_time() とPHPの strtotime() 関数を組み合わせて、公開日と現在時刻の差分をとるのが定番の実装ではないかとおもいます。
実はbaserCMSには、そのリクエストをサクっと実現できる環境が整っています。公式のリファレンスには載ってませんが pastDays() という関数を使えばわりと簡単に「NEW」の文字を付け加えることができるんです。
(といっても、じっさいは pastDays() の内部で strtotime() を使っているんですけどね )
pastDays() の書式
$this->BcTime->pastDays($date, $days, [$now])
pastDays() は日付表示に関わる BcTime ヘルパーの一つとして実装されています(ソースは /lib/Baser/View/Helper/BcTimeHelper.php にあり)。
- $date……計算の基準となる日付
- $days……経過日数
- $now……現在時刻(オプション)
投稿日から7日以内の記事に「NEW」と付け加えてみます
ブログテンプレートで下のように記述してみましょう。if ~ foreach ~ endforeach ~ endif で構成されるブロックに、「NEW」のためのコードを挿入するかたちになります。
<?php if (!empty($posts)): ?> <?php foreach ($posts as $key => $post): ?> // 投稿日から7日以内のときは NEW を付け加える <?php if (!$this->BcTime->pastDays($this->Blog->getPostDate($post), 7)): ?> <p>NEW</p> <?php endif ?> <?php endforeach ?> <?php endif ?>
ブログのインデックスだけでなく、アーカイブページや個別ページへの使い回しを考えたら独自ヘルパー(WordPressでいう functions.php みたいなもの)にしてしまった方がよいかもしれません。
/app/webroot/theme/{使用中のテーマディレクトリ}/Helper/ に FooHelper.php というファイルを作り……
<?php class FooHelper extends AppHelper { public $helpers = array('Blog.Blog', 'BcTime'); public function newPost($post = array()) { if (!$this->BcTime->pastDays($this->Blog->getPostDate($post), 7)) { echo '<p>NEW</p>'; } } }
と書いて保存すると、
<?php if (!$this->BcTime->pastDays($this->Blog->getPostDate($post), 7)): ?> <p>NEW</p> <?php endif ?>
というもともとのコードを
<?php $this->Foo->newPost($post) ?>
と簡略化できたりします。BcTime ヘルパーには、ほかにも
- 西暦から和暦への変換
- 和暦から西暦への変換
など国産CMSならではの関数が仕込まれているので、興味がある方はソースをのぞいてみてはどうでしょうか。