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を継承したクラスになります。