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 を付ける必要があります。