PHPモジュールでページの種類で実行の制御を行う

PHPモジュールを作成する際、ブログページの記事詳細ページのみで実行したいという事が多々あります。

その時に安全装置として、他の種類のページ(標準ページやアプリケーションページ)では処理を続けないという事を行い、不具合の発生を減らします。


モジュールのファイルの作成に関してはPHPモジュールを自作するをご覧ください。

今回も上記のリンク先の記事同様、cms:module="parts.test"を使用できるようにします。




はじめに標準ページのみで動作する書き方を見ていきます。

/ドキュメントルート/サイトID/.module/parts/test.php

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	if(!$htmlObj instanceof CMSPage) return "";

	// モジュールで実行したい内容のコードの作成を続ける
}
?>

標準ページにモジュールを設置した場合、モジュール用関数の第二引数の$htmlObjはCMSPageになります。

$htmlObjがCMSPageでないものを調べておけば、標準ページ用のモジュールになります。

※CMSPageはHTMLPageを継承したクラスになります。

https://github.com/inunosinsi/soycms/blob/master/cms/common/site_include/CMSPage.class.php




続いて、ブログページについてを見ていきます。

/ドキュメントルート/サイトID/.module/parts/test.php

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	if(!$htmlObj instanceof CMSBlogPage) return "";

	// モジュールで実行したい内容のコードの作成を続ける
}
?>

ブログページにモジュールを設置した場合、モジュール用関数の第二引数の$htmlObjはCMSBlogPageになります。

$htmlObjがCMSBlogPageでないものを調べておけば、ブログページ用のモジュールになります。

※CMSBlogPageはHTMLPageを継承したクラスになります。

https://github.com/inunosinsi/soycms/blob/master/cms/common/site_include/CMSBlogPage.class.php


ブログページでは標準ページと異なり、トップページ、アーカイブページ(カテゴリーページを含む)と記事毎ページの三種類のページがあります。

モジュール内で上記三種類を加味してコードを作成する事が可能です。


ブログページでは、各種ページの判定の為にSOYCMS_BLOG_PAGE_MODEという定数が用意されています。

SOYCM_BLOG_PAGE_MODEの定数には

CMSBlogPage::MODE_TOPトップページ
CMSBlogPage::MODE_ENTRY記事毎ページ
CMSBlogPage::MODE_MONTH_ARCHIVE月別アーカイブページ
CMSBlogPage::MODE_CATEGORY_ARCHIVEカテゴリーページ

のどれかの値が入ります。


最初にトップページのコードを見ていきます。

/ドキュメントルート/サイトID/.module/parts/test.php

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	if(!$htmlObj instanceof CMSBlogPage) return "";

	if(!defined("SOYCMS_BLOG_PAGE_MODE") || SOYCMS_BLOG_PAGE_MODE != CMSBlogPage::MODE_TOP) return "";

	// モジュールで実行したい内容のコードの作成を続ける
}
?>

念の為にSOYCMS_BLOG_PAGE_MODEの定数が定義されているかを確認した後に、CMSBlogPage::MODE_TOPであるか?の判定を行っています。


次にアーカイブページのコードを見ていきます。

/ドキュメントルート/サイトID/.module/parts/test.php

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	if(!$htmlObj instanceof CMSBlogPage) return "";

	if(!defined("SOYCMS_BLOG_PAGE_MODE")) return "";
	if(SOYCMS_BLOG_PAGE_MODE != CMSBlogPage::MODE_MONTH_ARCHIVE && SOYCMS_BLOG_PAGE_MODE != CMSBlogPage::MODE_CATEGORY_ARCHIVE) return "";

	// モジュールで実行したい内容のコードの作成を続ける
}
?>

月別アーカイブページとカテゴリーページの有無を確認します。

月別アーカイブページのみの専用モジュールを作成したいといった事もありますので、適宜コードを修正してください。


最後に記事毎ページのコードを見てみます。

/ドキュメントルート/サイトID/.module/parts/test.php

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	if(!$htmlObj instanceof CMSBlogPage) return "";

	if(!defined("SOYCMS_BLOG_PAGE_MODE") || SOYCMS_BLOG_PAGE_MODE != CMSBlogPage::MODE_ENTRY) return "";

	// モジュールで実行したい内容のコードの作成を続ける
}
?>

CMSBlogPage::MODE_ENTRYであるか?の判定を行っています。




最後に、アプリケーションページについてを見ていきます。

/ドキュメントルート/サイトID/.module/parts/test.php

<?php
function soycms_test(string $html, HTMLPage $htmlObj){
	if(!$htmlObj instanceof CMSApplicationPage) return "";

	// モジュールで実行したい内容のコードの作成を続ける
}
?>

アプリケーションページにモジュールを設置した場合、モジュール用関数の第二引数の$htmlObjはCMSApplicationPageになります。

$htmlObjがCMSApplicationPageでないものを調べておけば、アプリケーションページ用のモジュールになります。

※CMSApplicationPageはHTMLPageを継承したクラスになります。

https://github.com/inunosinsi/soycms/blob/master/cms/common/site_include/CMSApplicationPage.class.php

同じカテゴリーの記事