テーマ内でPageListオブジェクトを使用して表示した結果を、トピックの絞り込みに対応させたい

2017年10月11日 at 14:53

下記のような構成のサイトを開発中です。

トップページ(テーマA)
-ニュース(テーマA)
--ニュース詳細(テーマA)
--ニュース詳細(テーマA)
--……
-A部署のトップページ(テーマB)
--ニュース(テーマB)
---ニュース詳細(テーマB)
---ニュース詳細(テーマB)
--……
-B部署のトップページ(テーマC)
--ニュース(テーマC)
---ニュース詳細(テーマB)
---ニュース詳細(テーマB)
--……
-……

下層に別のテーマを適用した部署ごとのページがあり、それぞれにニュースが投稿できるようになっています。
ニュース詳細ページは、微妙に内容が異なるため、
・ページタイプはそれぞれ別
・ページテンプレートは共通
という実装にしています。

全体のトップページには、すべての部署のニュース一覧を表示する必要があるため、
テーマのページテンプレート内で、PageListオブジェクトを取得して、
ページテンプレートでフィルターをして表示させました。


$template = Concrete\Core\Page\Template::getByHandle('news_detail');

$list = new \Concrete\Core\Page\PageList();
$list->sortByPublicDateDescending();
$list->filterByPageTemplate($template);

$list->setItemsPerPage(5);
$pagination = $list->getPagination();
$pages = $pagination->getCurrentPageResults();


参考:
http://concrete5-japan.org/help/5-7/developer/working-with-pages/searching-and-sorting-with-the-pagelist-object/

表示はこれで出来たのですが、ニュース一覧をトピックで絞りこみする必要があり、
実装に行き詰っています。


$list->filterByTopic(3328);


と、filterByTopicにトピックのIDを入れることで絞り込めることはわかったのですが、
トピックをクリックしたときのURL、

http://example.com/news/topic/3327/notice

上記から、どのようにトピックのIDを取得すればよいかが分かりません……。

上記、方法知っている方がいらっしゃいましたら、ご教授ください。

タグ:

Re: テーマ内でPageListオブジェクトを使用して表示した結果を、トピックの絞り込みに対応させたい

2017年10月12日 at 11:37
適当で申し訳ないのですが、
$this->get('topic')
で取得できないでしょうか?
 

Re: テーマ内でPageListオブジェクトを使用して表示した結果を、トピックの絞り込みに対応させたい

2017年10月13日 at 12:35
ページテンプレート内で上記コード試してみたのですが、

Call to undefined method Concrete\Core\Page\View\PageView::get()


と、getはない、というようなエラーが出ました……。

とりあえず、あまり良い方法ではないとは思いますが、
URLから数字を取得して処理するようにしました。


$urls = explode('/', $_SERVER["REQUEST_URI"]);
if(array_search('topic', $urls)) {
foreach($urls as $url) {
if(ctype_digit($url)) {
$list->filterByTopic($url);
}
}
}


上記で絞り込みが出来た事は確認しています。