CMSのポテンシャルを引き出す─MODxで作る商用サイト

第12回 MODxのLexicon機能

この記事を読むのに必要な時間:およそ 4.5 分

チャンクを使ったカスタムスニペット

ここで突然ですが,スニペット作成の話をさせてください。たとえば日時や時刻を表示するためのスニペットは,次のように簡単に作成することができます。

ShowDateスニペット

<?php
return strftime("%Y/%m/%d %H:%M:%S");

このスニペットを使用すれば,リソースの至るところから現在の日時を

  • 2011/08/01 12:34:56

のような形で取得することができます。しかし,英語圏での書式としては,

  • 08/01/2011 12:34:56

のような形が一般的である場合があります(ソートしにくいので筆者は嫌いです)⁠この場合,スニペットを改造すれば英語圏向けの表示は可能ですが,仮にサイト内に日本語向けコンテンツ,英語コンテンツが混在した場合,ひとつのスニペットを共有させることができません。

このように,⁠特にPHPを熟知していない)ユーザに自由な書式を設定させるためには,スニペット開発者はチャンクを意識する必要があります。前述のスニペットをチャンクを用いた形で書き換えると,次のようになります。

ShowDateスニペット改

<?php
// チャンクから参照可能なプレースホルダーを作成
$modx->setPlaceholder('year', strftime('%Y'));
$modx->setPlaceholder('mon', strftime('%m'));
$modx->setPlaceholder('day', strftime('%d'));
$modx->setPlaceholder('hour', strftime('%H'));
$modx->setPlaceholder('min', strftime('%M'));
$modx->setPlaceholder('sec', strftime('%S'));

// $chknameというチャンクをロード。この値はスニペットコール時に変更可能。
return $modx->getChunk($chkname);

showdateチャンクの内容は次のとおりです。スニペットと異なりチャンクはPHPスクリプトではないため,誰でも簡単に書式を変更することができます。

showdate_ja(日本語向け)

[[+year]]年[[+mon]]月[[+day]]日 [[+hour]]時[[+min]]分[[+sec]]秒

showdate_en(英語向け)

[[+mon]]/[[+day]]/[[+year]] [[+hour]]:[[+min]]:[[+sec]]

最後に,スニペットの呼び出しは次のようにします。

日本語向け

[[!ShowDate? &chkname=`showdate_ja`]]

英語向け

[[!ShowDate? &chkname=`showdate_en`]]

実際にページを表示すると,次のようになります。

図2 チャンクを使ったスニペットのテスト

図2 チャンクを使ったスニペットのテスト

開発者としてのLexicon

チャンクを使った簡単なスニペットの作り方がわかったところで,本題のLexiconに話を戻し,多言語に対応したスニペットの作り方を紹介します。内容は非常にシンプルなもので,言語に応じて「こんにちは」「Hello」という文字列を表示する,いわゆるHello World的なスニペットです。

まずは,シンプルな言語ファイルを用意してみます。これまでに出てきたSimpleSearchスニペットのlexiconディレクトリの構造を参考に,/var/www/html/core/components/helloworld/lexiconというディレクトリを作成します。その中に,ja,enというディレクトリを作成し,次の言語ファイルを設置してください。

/var/www/html/core/components/helloworld/lexicon/en/daily.inc.php

<?php 
$_lang['helloworld.goodmorning'] = 'Good morning.'; 
$_lang['helloworld.hello'] = 'Hello.'; 
$_lang['helloworld.goodnight'] = 'Good night.'; 

/var/www/html/core/components/helloworld/lexicon/ja/daily.inc.php

<?php 
$_lang['helloworld.goodmorning'] = 'おはよう。'; 
$_lang['helloworld.hello'] = 'こんにちは。'; 
$_lang['helloworld.goodnight'] = 'おやすみ。';

これで翻訳ファイルの準備はOK,といきたいところですが,このままでは管理画面の「語彙トピックの管理」から,今回作成したつもりの「helloworld」ネームスペースや「daily」トピックは見つかりませんので,ディレクトリやファイルを置いただけでは翻訳ファイルを使用できないようです……。どうすればシステムに翻訳ファイルを追加できるのでしょうか?

その答えは,MySQLデータベース上の「modx_namespaces」テーブルにあります。試しに現在のテーブルの内容を表示してみましょう。

modx_namespacesテーブルの内容を表示

mysql> select * from modx_namespaces; 
+-----------+-------------------------------------+ 
| name      | path                                | 
+-----------+-------------------------------------+ 
| core      | {core_path}                         | 
| tinymce   | {core_path}components/tinymce/      | 
| wayfinder | {core_path}components/wayfinder/    | 
| sisea     | {core_path}components/simplesearch/ | 
+-----------+-------------------------------------+ 
4 rows in set (0.00 sec) 

このように,このテーブルの中にはネームスペースとそのディレクトリの対応が格納されているようです。これに従って,helloworld用のエントリを追加してみます。

helloworld用ネームスペースの追加

# mysql -u root modx
mysql> insert into modx_namespaces values ('helloworld','{core_path}components/helloworld/'); 
mysql> select * from modx_namespaces; 
+------------+-------------------------------------+ 
| name       | path                                | 
+------------+-------------------------------------+ 
| core       | {core_path}                         | 
| tinymce    | {core_path}components/tinymce/      | 
| wayfinder  | {core_path}components/wayfinder/    | 
| sisea      | {core_path}components/simplesearch/ | 
| helloworld | {core_path}components/helloworld/   | 
+------------+-------------------------------------+ 
5 rows in set (0.00 sec) 

著者プロフィール

中満英生(なかみつひでお)

大学時代に出会ったSolarisがきっかけでUNIXの世界へ。その後ホスティングプロバイダ,データセンターで実務経験を積む傍ら,雑誌記事の執筆や技術セミナーの講師を務める。サーバ設定の他,セキュリティに関する著作や技術者エッセイも執筆経験あり。