PHPモジュールでHTMLモジュールを読み込む(SOY Shop版)

PHPモジュールで条件によってHTMLモジュールを読み分けるモジュールを作成してみます。


ショップディレクトリ
├── .cache
├── .db
├── .htaccess
├── .module
│	├── html
│	│	└── hoge.php
│	└── parts
│		└── include.php
├── .page
├── .template
├── .tmb
├── css
├── files
├── im.php
├── index.php
└── themes

今回は<!-- shop:module="parts.include" -->で/ルート/ショップディレクトリ/.module/html/hoge.php(<!-- shop:module="html.hoge" -->に該当)を読み込んでみます。


/ルート/ショップディレクトリ/.module/html/hoge.php

<?php
function soyshop_hoge(string $html, HTMLPage $htmlObj){

ob_start();

echo <<<HTML
<strong>hoge</strong>
HTML;

ob_end_flush();

}
?>

上記のコードで、テンプレートに

<!-- shop:module="html.hoge" --><!-- /shop:module="html.hoge" -->

を挿入するとブラウザでページが表示される時に

<strong>hoge</strong>

が出力されます。


このコードを<!-- shop:module="parts.include" -->から読み込んでみます。


/ルート/ショップディレクトリ/.module/parts/include.php

<?php
function soyshop_include(string $html, HTMLPage $htmlObj){
	// <!-- shop:module="hoge" -->で出力したい内容を読み込む
	if(!function_exists("soyshop_hoge")){
		$moduleDir = SOYSHOP_SITE_DIRECTORY.".module/";
		include($moduleDir."html/hoge.php");
	}
	soyshop_hoge($html, $htmlObj);
}
?>

※上記コード中で使用している定数は

/CMSインストールディレクトリ/soyshop/webapp/conf/shop/{ショップID}.conf.php

内で定義しています。


上記のコードで<!-- shop:module="parts.include" -->から<!-- shop:module="html.hoge" -->を出力できるようになりました。




今回のテクニックの使いどころは多言語サイトを運営する際にコードの可読性を高めます。

例えば、

ショップディレクトリ
├── .cache
├── .db
├── .htaccess
├── .module
│	├── html
│	│	├── en.php
│	│	└── jp.php
│	└── parts
│		└── lang.php
├── .page
├── .template
├── .tmb
├── css
├── files
├── im.php
├── index.php
└── themes

上記のように日本語表記(html.jp)と英語表記(html.en)のHTMLモジュールを言語設定に合わせて読み込みたい時があります。

この時に<!-- shop:module="parts.lang" -->を介してどちらかのHTMLモジュールを読み込めるようにしておけば可読性が高まります。


/ルート/ショップディレクトリ/.module/parts/lang.php

<?php
function soyshop_lang(string $html, HTMLPage $htmlObj){
	if(!defined("SOYSHOP_PUBLISH_LANGUAGE")) define("SOYSHOP_PUBLISH_LANGUAGE", "jp");

	$htmlModuleDir = SOYSHOP_SITE_DIRECTORY.".module/html/";
	switch(SOYSHOP_PUBLISH_LANGUAGE){
		case "jp":
			if(!function_exists("soyshop_jp")) include($htmlModuleDir."jp.php");		
			soyshop_jp($html, $htmlObj);
			break;
		case "en":
			if(!function_exists("soyshop_en")) include($htmlModuleDir."en.php");		
			soyshop_en($html, $htmlObj);
			break;
	}
}

上記のコードで言語設定によって、どのHTMLモジュールを読み分けるか?の切り替えを行えるようになりました。

※もしsoyshop_jpやsoyshop_en関数で文字列を返す(returnで終了している場合は)、各関数の前に echo を付ける必要があります。

PHP: echo - Manual

同じカテゴリーの記事