cms:module="common.blogparts" で特定のカテゴリだけ出力したい 投稿する

投稿者:51 goat  投稿日時:2023-04-18 11:16:47
開発者 様

いつもお世話になっております。
標準ページで「cms:module="common.blogparts"」を使って特定のカテゴリ(ラベル)だけを表示できないでしょうか?
例えば、「」のようなイメージです。
目的は、標準ページに絞り込んだ「ラベル名」と「記事件数」をさせたいです。
よろしくお願いいたします。
投稿者:51 goat  投稿日時:2023-04-18 11:19:27
スミマセン。投稿ミスしました。
例えば、
<!-- cms:module="common.blogparts" cms:blog="××" cms:label"×" -->
のようなイメージです。
投稿者:齋藤毅  投稿日時:2023-04-18 11:20:26
cms:module="common.blogparts"
モジュールは自由にPHPを記述するものですので、common.blogpartsモジュールを好きなように改変すれば良いです。
改変する際はSOY CMS#PHPモジュールを参考にしてみてください。

ファイルは
/CMSインストールディレクトリ/common/site_include/module/common/blogparts.php
にあります。

まずはこのコードをご自身で改変可能か?を判断してみてください。

モジュールファイルの上書き防止の為に
/CMSインストールディレクトリ/サイトID/.module/common/blogparts.php
のファイルを生成して、こちらのファイルを改変すると良いです。
投稿者:齋藤毅  投稿日時:2023-04-18 11:35:18
<!-- cms:module="common.blogparts" cms:blog="××" cms:label"×" -->
上記の内容を実装したければ、ご自身でモジュールを作成されるのが良いかと思います。

どれ程の内容を出力したいのかがわかりませんが、

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	$obj = $htmlObj->create("soycms_test", "HTMLTemplatePage", array(
		"arguments" => array("soycms_test", $html)
	));

	/** ブログページとラベルIDに紐付いた記事数を取得する **/
	$blogPageId = 0;
	$labelId = 0;
	
	$logic = SOY2Logic::createInstance("logic.site.Entry.EntryLogic");
	$entryCount = $logic->getOpenEntryCountByLabelIds(array_unique(array($blogLabelId, $labelId)));
	/** ブログページとラベルIDに紐付いた記事数を取得する ここまで **/
	
	$obj->createAdd("entry_count", "HTMLLabel", array(
		"text" => $entryCount
	));

	$obj->display();
}
?>
で、テンプレート側で、
<!-- cms:module="parts.test" -->
記事数:<!-- soy:id="entry_count" -->0<!-- /soy:id="entry_count" -->
<!-- /cms:module="parts.test" -->
のようなタグが使用できるようになります。

自作する気があれば、適宜解説していきます。
投稿者:51 goat  投稿日時:2023-04-18 13:33:11
斉藤 様

ご回答ありがとうございます。
改変する際はSOY CMS#PHPモジュールを参考にしてみてください。
はい。まず「PHPモジュールを自作する」を拝読させていただきました。

ご教示いただいた

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	$obj = $htmlObj->create("soycms_test", "HTMLTemplatePage", array(
		"arguments" => array("soycms_test", $html)
	));

	/** ブログページとラベルIDに紐付いた記事数を取得する **/
	$blogPageId = 0;
	$labelId = 0;
	
	$logic = SOY2Logic::createInstance("logic.site.Entry.EntryLogic");
	$entryCount = $logic->getOpenEntryCountByLabelIds(array_unique(array($blogLabelId, $labelId)));
	/** ブログページとラベルIDに紐付いた記事数を取得する ここまで **/
	
	$obj->createAdd("entry_count", "HTMLLabel", array(
		"text" => $entryCount
	));

	$obj->display();
}
?>
をtest.phpとして、/ドキュメントルート/サイトID/.module/parts にアップロードして標準ページに、
<!-- cms:module="parts.test" -->
 <!-- soy:id="entry_count" -->0<!-- /soy:id="entry_count" -->
<!-- /cms:module="parts.test" -->
と記述してみましたが、
Warning: Undefined variable $blogLabelId in /home/hogehoge.com/public_html/hoge/.module/parts/test.php on line 12
と表示されたため、12行目の「$blogLabelId」「$blogPageId 」に変更いたしました。

しかし、エラーは解消しましたが件数は0で$blogPageId 、$labelId で設定したブログ・カテゴリーの件数が表示されません。

$blogPageId にはブログページの編集画面でアドレスに表示される末尾の数字を $labelIdにはラベルの詳細画面でアドレスに表示される末尾の数字を設定いたしました。

もしかしたら12行目の変更が間違っているのでしょうか?
投稿者:齋藤毅  投稿日時:2023-04-18 14:07:52
コードに誤りがありました。
$blogPageId = 0;
の箇所を
$blogPageId = 0;
try{
	$blogLabelId = SOY2DAOFactory::create("cms.BlogPageDAO")->getById($blogPageId)->getBlogLabelId();
}catch(Exception $e){
	$blogLabelId = 0;
}
のように書き換えれば、$blogLabelIdが取得できます。
投稿者:51 goat  投稿日時:2023-04-18 18:00:54
齋藤 様

早速の回答ありがとうございます。
コードを修正したところ無事に件数が出力されました。

今回の希望は任意のカテゴリ(ラベル)の件数、カテゴリ(ラベル)名、ブログカテゴリページへのリンクの出力でしたが、私がPHPはほぼ素人なので、今後SOY CMS#PHPモジュールを参考にさせてもらいながら、モジュール作成までたどり着きたいと思います。
投稿者:齋藤毅  投稿日時:2023-04-21 05:34:25
まずはcms:module="common.blogparts"から不要なコードを削除していく事からおすすめします。
今回はカテゴリ以外は不要とのことですので、
//b_block:id="archive"
から
$obj->display();
の上の行までは不要になりますので削除しておきます。
※$obj->display();は残します

続いて、ブログページも決まっていれば、
$blogPageId = null;
if(preg_match('/(<[^>]*[^\/]cms:module=\"common.blogparts\"[^>]*>)/', $template, $tmp)){
	if(preg_match('/cms:blog=\"(.*?)\"/', $tmp[1], $ctmp)){
		if(isset($ctmp[1]) && is_numeric($ctmp[1])) $blogPageId = (int)$ctmp[1];
	}
}

if(is_null($blogPageId)){
	//最初に作成されたブログのラベルIDを取得する
	$dao = new SOY2DAO();
	try{
		$res = $dao->executeQuery("SELECT id FROM Page WHERE page_type = 200 ORDER BY id ASC LIMIT 1;");
		if(isset($res[0]["id"])) $blogPageId =	(int)$res[0]["id"];
	}catch(Exception $e){
		//
	}
	unset($dao);
}

$blogPageId = 0;
に変更してしまっても良いです。
※0の箇所にはご自身のサイトに合わせて指定してください。

$blogPageIdのIDを決め打ちした場合は、
if(property_exists($page, "page")){
	switch($page->page->getPageType()){
	case Page::PAGE_TYPE_BLOG:
		switch(SOYCMS_BLOG_PAGE_MODE){
		case "_top_":
			$template = $page->page->getTopTemplate();
			break;
		case "_entry_":
			$template = $page->page->getEntryTemplate();
			break;
		default:
			$template = $page->page->getArchiveTemplate();
		}
		break;
	default:
		$template = $page->page->getTemplate();
	}
//SOY Shopの場合
}else{
	switch(get_class($page)){
		case "SOYShop_UserPage":
			$template = file_get_contents(SOYSHOP_SITE_URL . ".template/mypage/" . $page->getMyPageId() . ".html");
			break;
		case "SOYShop_CartPage":
			$template = file_get_contents(SOYSHOP_SITE_URL . ".template/cart/" . $page->getCartId() . ".html");
			break;
		default:
			$pageObject = $page->getPageObject();
			$template = file_get_contents(SOYSHOP_SITE_URL . ".template/" . $pageObject->getType() . "/" . $pageObject->getTemplate());
	}
}
も不要になります。

あとは、
任意のカテゴリ(ラベル)の件数
に対して、どのような規則があるかを整理して、
foreach($labels as $labelId => $label){
	if(in_array($labelId, $categories)){
		$categoryLabel[] = $label;
		try{
			//記事の数を数える。
			$counts = $logic->getOpenEntryCountByLabelIds(array_unique(array($blogLabelId,$labelId)));
		}catch(Exception $e){
			$counts= 0;
		}
		$entryCount[$labelId] = $counts;
	}
}
の箇所で任意のカテゴリに当てはまらないものは除外するというコードを追加すれば良いです。

任意のカテゴリというのが文面からではどのようなカテゴリなのか?が判断が付きませんので、整理していただければそれに合わせたコードをお伝えします。
ログインして投稿する