多言語サイトでお問い合わせフォームのページ(アプリケーションページ)を運営する時、同じページで出力するフォームを切り替えたいことがあります。
そんな時はonApplicationPageLoadの拡張ポイントを利用することでお問い合わせフォームのページの読み込み直前でHTMLの記述を変更することが可能です。。
今回作成するプラグインはプラグインIDがplugin_multi_language_inquiryにして話を進めます。
お問い合わせページで日本語用のフォームのIDがexampleで、英語用のフォームのIDをexample_enだとします。
/CMSインストールディレクトリ/common/site_include/plugin/plugin_multi_language_inquiry/plugin_multi_language_inquiry.php
<?php
class PluginMultiLanguageInquiryPlugin{
const PLUGIN_ID = "plugin_multi_language_inquiry";
function getId(){
return self::PLUGIN_ID;
}
function init(){
CMSPlugin::addPluginMenu(self::PLUGIN_ID,array(
"name" => "プラグインのお問い合わせページの多言語化",
"type" => Plugin::TYPE_NONE,
"description" => "",
"author" => "",
"url" => "",
"mail" => "",
"version" => "1.0"
));
// 当プラグインが有効であるかを調べる
if(CMSPlugin::activeCheck(self::PLUGIN_ID)){
if(defined("_SITE_ROOT_")){
// 公開側ページの方で動作する拡張ポイントで使用したいものを追加する
// アプリケーションページが読み込まれる直前に
CMSPlugin::setEvent("onApplicationPageLoad", self::PLUGIN_ID, array($this, "onApplicationPageLoad"));
}else{
// 管理画面側の方で動作する拡張ポイントで使用したいものを追加する
}
}
}
function onApplicationPageLoad($args){
$page = &$args["page"];
$webPage = &$args["webPage"];
// 多言語プラグインで定義している定数がなかった場合はこの場で定義しておく
if(!defined("SOYCMS_PUBLISH_LANGUAGE")) define("SOYCMS_PUBLISH_LANGUAGE", "jp");
// 日本語ページの場合は何もしない
if(SOYCMS_PUBLISH_LANGUAGE == "jp") return;
$lines = explode("\n", $page->getTemplate());
$n = count($lines);
for($i = 0; $i < $n; $i++){
$line = $lines[$i];
// コメントがある行以外はスルー
if(!strlen(trim($line)) || is_bool(strpos($line, "<!--"))) continue;
preg_match('/<!--.*app:id=\"soyinquiry\".*app:formid=\"(.*?)\".*-->/', $line, $tmp);
if(!count($tmp)) continue;
$appId = $tmp[1]."_".SOYCMS_PUBLISH_LANGUAGE;
$lines[$i] = str_replace($tmp[1], $appId, $line);
}
// テンプレートを更新
$page->setTemplate(implode("\n", $lines));
}
public static function register(){
$obj = CMSPlugin::loadPluginConfig(self::PLUGIN_ID);
if(!$obj) $obj = new PluginMultiLanguageInquiryPlugin();
CMSPlugin::addPlugin(self::PLUGIN_ID, array($obj, "init"));
}
}
PluginMultiLanguageInquiryPlugin::register();
onApplicationPageLoadはアプリケーションページで指定したsSOY Appの読み込みが開始される前に実行される拡張ポイントで、onApplicationPageLoadではページに関するオブジェクトを参照渡しで受け取っているので、設定を変更する処理のみを行えば良いです。
今回のコードは下記のURLにサンプルコードがあります。
追記
onBlogPageLoadの拡張ポイントが実行されるタイミングはCMSBlogPageクラスのコンストラクタでブログのページ種別が判定した直後に実行されます。
$onLoads = CMSPlugin::getEvent('onApplkicationPageLoad');
if(is_array($onLoads) && count($onLoads)){
foreach($onLoads as $plugin){
$func = $plugin[0];
call_user_func($func, array('page' => &$this->page, 'webPage' => &$this));
}
}
