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

第9回 MODxとMySQLの関係 + おまけスニペット

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

カスタムテンプレート変数の構造

通常のリソース同様,比較的頻繁に作成,更新するであろう項目がカスタムテンプレート変数です。なかみつ園では各商品ページにテンプレート変数を埋め込んでいるのですが,値段や内容量などの確認,いわゆる「棚卸」のために,わざわざマウスで管理画面を何度も遷移するのは骨が折れます。

こちらもデータベース構造を把握しておけば,mysqlコマンドやphpMyAdminといったツールから比較的手軽に内容を確認,修正することができます。

例のごとく,カスタムテンプレート変数は各リソースに割り当て可能な変数ですが,データベースの構造は先ほどの「modx_site_content」とは少し異なります。以前の記事で,値段を格納するための「price」というカスタムテンプレート変数を定義し,⁠mytpl」というテンプレートから参照できるような設定を行いました。これをデータベース的に追いかけてみましょう。

カスタムテンプレート変数priceの情報を表示

mysql> select * from modx_site_tmplvars where name = 'price'\G 
*************************** 1. row *************************** 
               id: 1 
             type: text 
             name: price 
          caption: price 
      description: 
      editor_type: 0 
         category: 0 
           locked: 0 
         elements: 
             rank: 0 
          display: default 
     default_text: 100? 
       properties: a:0:{} 
 input_properties: NULL 
output_properties: NULL 
1 row in set (0.00 sec) 

次に,カスタムテンプレート変数とテンプレートの関係について調べておきます。まず,⁠mytpl」というテンプレートのIDは次のようにして取得できます。MySQLに詳しい方はサブクエリを使って,一気に情報を取得してみても良いでしょう。

テンプレートのIDを確認

mysql> select id,templatename from modx_site_templates; 
+----+--------------+ 
| id | templatename | 
+----+--------------+ 
|  1 | BaseTemplate | 
|  3 | mytpl        | 
+----+--------------+ 
2 rows in set (0.00 sec) 

「mytpl」のIDは3であることがわかりました。次にmodx_site_tmplvar_templatesテーブルを表示してみます。

mysql> select * from modx_site_tmplvar_templates; 
+-----------+------------+------+ 
| tmplvarid | templateid | rank | 
+-----------+------------+------+ 
|         1 |          3 |    0 | 
+-----------+------------+------+ 
1 row in set (0.00 sec) 

tmplvaridはテンプレート変数ID,templateidはテンプレートIDを表しますので,この結果は

  • 「テンプレート変数IDが1であるpriceテンプレートはテンプレートIDが3であるmytplテンプレート内で使用可能」

を意味します。最後に,肝心のカスタムテンプレート変数の中身ですが,⁠modx_site_tmplvar_contentvalues」テーブルに格納されています。

カスタムテンプレート変数の内容を表示

mysql> select * from modx_site_tmplvar_contentvalues; 
+----+-----------+-----------+--------+ 
| id | tmplvarid | contentid | value  | 
+----+-----------+-----------+--------+ 
|  1 |         1 |        10 | 1,050円 | 
|  2 |         1 |        11 | 1,575円 | 
+----+-----------+-----------+--------+ 
2 rows in set (0.00 sec) 

contentidとは各リソースのIDを表すため,リソースIDが10と11であるリソースの中で,tmplvarid=1,つまりpriceというカスタムテンプレートが使用されていることになります。

リソースやカスタムテンプレート変数以外にも,スニペットやテンプレートなど,多くのものがMySQL上に格納されます。お使いの用途に応じて,データベースをうまく操作するようにしてください。

おまけ

もう1つおまけとして,今回は簡単なスニペットの作り方について紹介したいと思います。前回紹介したように,MODx-2.1.0からはこれまで使用できていた多くの関数が削られてしまい,筆者が個人的によく使用していた

$doc = $modx->getDocument(..);

といった構文もサポートされなくなってしまいました。Summary of Legacy Code Removed in 2.1PHP Coding in MODx Revolution, Pt. lでも紹介されているとおり,MODx-2.1.0以降では

$doc = $modx->getObject(..);

という形でオブジェクトの情報を取得します。実際の例として,gihyo.jpの各ページには

  • 「この記事を読むのに必要な時間:およそ ○分」

といった表示がありますが,これはご想像のとおりスニペットが表示している値です。読むための時間は基本的にページの分量に比例しますので,⁠1,000文字読むのに約1分(1文字あたり1/1000分)要する」と仮定した場合,スニペットの内容は次のようになります。

getEstimate

<?php
// 自身のリソースIDを取得
$resourceId = $modx->resource->get('id');

// リソースを配列で取得。$docをprint_rしてみると何が入っているのかよくわかります。
$doc = $modx->getObject('modResource', $resourceId);

// タグを除去
$stripped = strip_tags($doc->get('content'));

// 結果を整数で表示。0分と表示されないよう,1をプラス(手抜き!!)
return (int)(mb_strlen($stripped) / 1000) + 1;

getObjectというメソッドは多くのスニペットから使用することが多いので,覚えておいて損はありません。

最後に

今回はデータベース側から見たMODxということで,文字ばかりの記事になってしまいましたが,バックエンドを知ることで,MODxマスターに一歩近づくことができます。

もし価格や内容量を含む商品データベースが別サーバに存在する場合,crontab+スクリプトから定期的にマスターの情報をMODx側に適用する,という使い方などは実用的でおもしろそうです。

データベースを操作しすぎて管理画面との整合性がとれなくなっては元も子もありませんが,状況に応じてデータを簡単かつ正確に操作できるよう,お使いの環境にあった最適な運用方法をぜひ考えてみてください。

著者プロフィール

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

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