ja2015
1
月別アーカイブウィジェットの表示について、
カテゴリーアーカイブページが表示されている場合は、
そのカテゴリーでフィルタリングされた状態の
月別リストを表示したいのですが、そのようなことは可能でしょうか?
まず考えたのは、カテゴリーアーカイブページではリンクの末尾に「/category:カテゴリー名」と自動で付加することでした。
しかしこの方法ですと、その月のアーカイブに該当カテゴリ―の投稿が存在しなかった場合、
記事のないページに飛ぶことになってしまいます。
やはり、月別のリンクが生成される段階でカテゴリーによるフィルタリングがされるのが理想です。
なにか方法があればご教示ください。
【環境情報】
・baserCMSのバージョン:4.7.3
・レンタルサーバー名:さくらのレンタルサーバ
・使用テーマ:bc_sample
・PHPスキル(自己評価):D
gondoh
2
こちらの対応をより進めていき、閲覧しているページの状態から、カテゴリー用URLを出力するか、カテゴリー無視の出力とするか判別してリンクを表示するようナビゲーション用のテンプレートファイルを変更されといいかと思います。
多分これでやりたいことはできるのではないかと思います。
<?php
$id = {表示したいブログのblog_content_id};
// モデルの呼び出し
$BlogPost = ClassRegistry::init('Blog.BlogPost');
$postedDates = $BlogPost->getPostedDates($id, [
'type' => 'month',
'limit' => 12,
'category' => true,
'viewCount' => true
]);
if (!empty($postedDates)) {
// カテゴリアーカイブのときはフィルタリング
$pass = $this->request->params['pass'];
$categoryFilter = '';
if (!empty($pass) && $pass[0] == 'category') {
$categoryFilter = $pass[1];
}
$baseCurrentUrl = $this->BcBaser->getBlogContentsUrl($id) . 'archives/date/';
// リスト開始
echo '<ur>';
foreach ($postedDates as $postedDate) {
// カテゴリアーカイブのときは該当カテゴリ以外はスキップ
if ($categoryFilter && $postedDate['BlogCategory']['name'] !== $categoryFilter) {
continue;
}
$text = $postedDate['year'].'年'.$postedDate['month']. '月'. $postedDate['BlogCategory']['title'];
// 記事数を表示する場合
$text .= '('. $postedDate['count']. ')';
$url = $baseCurrentUrl . $postedDate['year'] . '/' . $postedDate['month'] . '/category:' . $postedDate['BlogCategory']['name'];
echo '<li>';
$this->BcBaser->link($text, $url);
echo '</li>';
}
echo '</ur>';
}
表示
〇〇年〇〇月カテゴリ名(記事件数)
のリストがリンク付きで並びます。
(その月のアーカイブに該当カテゴリ―の投稿が存在しなかった場合はリストに入りません)
ja2015
4
@katokaisya 様のやり方で無事目的のリストを出力する事ができました。
ありがとうございます。
ただ、私も想定していなかった問題として、飛んだ先のページはURLに「category:カテゴリ名」を付加したページのため、カテゴリアーカイブとは判定されず、通常の月別リストが表示されてしまいます。
特に方法がなければ、preg_matchやsplitでどうにかできそうではあるんですが、category:カテゴリ名がついたページを判別する方法って、公式に用意されてたりするんでしょうか?
ちょっと調整しました。
現在のパスからカテゴリを判別する処理を追加しているので、
リストのリンクを踏んで飛んだ先でもカテゴリが絞り込まれた月別にリストになります。
<?php
$id = {表示したいブログのblog_content_id};
// モデルの呼び出し
$BlogPost = ClassRegistry::init('Blog.BlogPost');
$postedDates = $BlogPost->getPostedDates($id, [
'type' => 'month',
'limit' => 12,
'category' => true,
'viewCount' => true
]);
// モデルの呼び出し
$BlogPost = ClassRegistry::init('Blog.BlogPost');
$postedDates = $BlogPost->getPostedDates($id, [
'type' => 'month',
'limit' => 12,
'category' => true,
'viewCount' => true
]);
if (!empty($postedDates)) {
// カテゴリアーカイブのときはフィルタリング
$pass = $this->request->params['pass'];
$categoryFilter = '';
$here = $this->request->here; //現在のパス
if (!empty($pass) && $pass[0] == 'category') {
$categoryFilter = $pass[1];
} elseif (strpos($here, 'category:')!== false) { //現在のパスにcategoryが含まれるかどうか
$categoryFilter = explode('category:', $here)[1];
}
$baseCurrentUrl = $this->BcBaser->getBlogContentsUrl($id) . 'archives/date/';
// リスト開始
echo '<ur>';
foreach ($postedDates as $postedDate) {
// カテゴリアーカイブのときは該当カテゴリ以外はスキップ
if ($categoryFilter && $postedDate['BlogCategory']['name'] !== $categoryFilter) {
continue;
}
$text = $postedDate['year'].'年'.$postedDate['month']. '月'. $postedDate['BlogCategory']['title'];
// 記事数を表示する場合
$text .= '('. $postedDate['count']. ')';
$url = $baseCurrentUrl . $postedDate['year'] . '/' . $postedDate['month'] . '/category:' . $postedDate['BlogCategory']['name'];
echo '<li>';
$this->BcBaser->link($text, $url);
echo '</li>';
}
echo '</ur>';
}
ja2015
6
@katokaisya 様
無事、想定していた通りの動作になりました。
感謝いたします。