ブログページの読み込みの直前でブログで使用するラベルの設定を変更する

多言語サイトでブログページを運営する時、同じページでブログで使用するラベルの設定を切り替えたい時があります。

そんな時はonBlogPageLoadの拡張ポイントを利用することでブログページの読み込み直前でページの設定を切り替える事ができます。


今回作成するプラグインはプラグインIDがplugin_multi_languageにして話を進めます。

ブログページで日本語用の記事一覧を管理しているラベルのIDを 1 とし、英語用の記事一覧のラベルのIDを 2 とします。

※ラベルIDの確認方法はブログ記事の検索フォームを設置するをご覧ください。


/CMSインストールディレクトリ/common/site_include/plugin/plugin_multi_language/plugin_multi_language.php

<?php

class PluginMultiLanguagePlugin{

	const PLUGIN_ID = "plugin_multi_language";

	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("onBlogPageLoad", self::PLUGIN_ID, array($this, "onBlogPageLoad"));
			}else{
				// 管理画面側の方で動作する拡張ポイントで使用したいものを追加する
				
			}
		}
	}

	function onBlogPageLoad($args){
		$page = &$args["page"];
		$webPage = &$args["webPage"];

		// 多言語プラグインで定義している定数がなかった場合はこの場で定義しておく
		if(!defined("SOYCMS_PUBLISH_LANGUAGE")) define("SOYCMS_PUBLISH_LANGUAGE", "jp");

		// 言語設定によって、ブログページの使用するラベルの設定を切り替える
		switch(SOYCMS_PUBLISH_LANGUAGE){
			case "en":
				$page->setBlogLabelId(2);
				break;
			default:
				// 何もしない
		}
	}

	public static function register(){
		$obj = CMSPlugin::loadPluginConfig(self::PLUGIN_ID);
		if(!$obj) $obj = new PluginMultiLanguagePlugin();
		CMSPlugin::addPlugin(self::PLUGIN_ID, array($obj, "init"));
	}
}

PluginMultiLanguagePlugin::register();

onBlogPageLoadはブログページの各種ページの読み込みが開始される前(記事詳細ページであれば、出力する為の記事データをデータベースから取り出す直前)に実行される拡張ポイントで、onBlogPageLoadではページに関するオブジェクトを参照渡しで受け取っているので、設定を変更する処理のみを行えば良いです。


今回のコードは下記のURLにサンプルコードがあります。

https://github.com/inunosinsi/soycms/tree/master/cms/common/site_include/plugin/plugin_multi_language


追記

onBlogPageLoadの拡張ポイントが実行されるタイミングはCMSBlogPageクラスのコンストラクタでブログのページ種別が判定した直後に実行されます。

$onLoads = CMSPlugin::getEvent('onBlogPageLoad');
if(is_array($onLoads) && count($onLoads)){
	foreach($onLoads as $plugin){
		$func = $plugin[0];
		call_user_func($func, array('page' => &$this->page, 'webPage' => &$this));
	}
}

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

同じカテゴリーの記事