はじめに
連載開始からしばらく経ちました。今では多くの皆さんが快適なMODxライフをお過ごしかと思います(笑)。一方で、既存サイトのコンテンツが多い、複雑といった事情から、なかなかMODxやCMSの導入に踏みきれない方もいらっしゃるのではないでしょうか?
今回は、バックエンドデータベースから見たMODxについて解説していきます。データベース側の構造を知ることで、既存サイトのコンテンツをひとつひとつコピー&ペーストし、管理画面から登録するのではなく、データベース側からサイトを半自動的にマイグレーションする、という手段を検討することができ、より効率的な運用管理を目指すことができるようになります。
前回紹介したように、MODx-2.1からはMS SQL Serverがサポートされるようになりましたが、実績の面からはMySQLを使う方が間違いなく無難です。今回もMySQLを前提とした解説を行っていきます。よろしくお付き合いください。
MySQLのテーブル構造
さっそくですが、本連載の1回目でMySQLを設定したように、MODxが持つテーブル情報を確認するには次のようにします。
このように、MODx Revolutionは普段目に見えないところでたくさんのテーブルを使ってデータを管理、表示していることが推測できます。
テーブル名からも大体の用途が想像できるかもしれませんが、これらのテーブル名と用途を一覧にしてみましたので参考にしてみてください。中には語彙やコンテキストなど、読者の皆さんには意味不明な項目があるかもしれませんが、例のごとく次回以降ゆっくりと解説を行っていく予定です。言い訳になりますが、一部ドキュメントが整っていない&時間の都合で完全に内容を網羅することができませんでした。ご了承ください。
表1 テーブル名と用途
テーブル名 | 内容 |
modx_access_actiondom | 詳細不明 |
modx_access_actions | アクションのアクセス設定 |
modx_access_category | カテゴリのアクセス設定 |
modx_access_context | コンテキストのアクセス設定 |
modx_access_elements | エレメントのアクセス設定 |
modx_access_menus | メニューのアクセス設定 |
modx_access_permissions | アクセスパーミッションの設定 |
modx_access_policies | アクセスポリシーの設定(権限管理→ユーザーグループとロールの管理→アクセスポリシー) |
modx_access_policy_template_groups | アクセステンプレートのテンプレートグループ設定 |
modx_access_policy_templates | アクセスポリシーテンプレートの設定(権限管理→ユーザーグループとロールの管理→Policy Templates) |
modx_access_resource_groups | リソースグループのアクセス設定 |
modx_access_resources | リソースのアクセス設定 |
modx_access_templatevars | カスタムテンプレート変数のアクセス設定 |
modx_actiondom | 詳細不明 |
modx_actions | アクションの内容(システム→アクション) |
modx_actions_fields | アクションフィールドの内容 |
modx_active_users | 現在ログイン中のユーザ情報 |
modx_categories | スニペットなどのカテゴリ情報 |
modx_categories_closure | 上記カテゴリの親子関係など |
modx_class_map | ドキュメントやリンク、スニペットなどのドキュメントクラス |
modx_content_type | コンテンツタイプ(システム→コンテンツタイプ) |
modx_context | コンテキスト(バーチャルドメインのようなもの)の内容 |
modx_context_resource | コンテキストのリソース |
modx_context_setting | コンテキストの設定 |
modx_document_groups | リソースグループとリソースの関係 |
modx_documentgroup_names | リソースグループの情報 |
modx_element_property_sets | エレメントのプロパティセット |
modx_event_log | イベントログ |
modx_fc_profiles | 管理画面カスタマイズのためのプロファイル |
modx_fc_profiles_usergroups | 上記のユーザグループ設定 |
modx_fc_sets | 管理画面カスタマイズのためのセット |
modx_keyword_xref | キーワードのクロスリファレンス? |
modx_lexicon_entries | 語彙(gettextのようなもの)のキーと内容の対応 |
modx_lexicon_topics | 語彙のトピック情報 |
modx_manager_log | 管理者ログ |
modx_member_groups | メンバーグループの情報 |
modx_membergroup_names | メンバーグループの名前や説明 |
modx_menus | トップメニューの構成(システム→アクション) |
modx_namespaces | プラグインやスニペットのネームスペース |
modx_property_set | 設定をまとめたプロパティセット(ツール→プロパティセット) |
modx_register_messages | 登録時のメッセージ |
modx_register_queues | 登録キュー |
modx_register_topics | 詳細不明 |
modx_session | MODxのログインセッション |
modx_site_content | 各リソースの内容 |
modx_site_content_metatags | メタタグの管理。最近では使用されない。 |
modx_site_htmlsnippets | チャンクの内容 |
modx_site_keywords | キーワードの管理。最近では使用されない。 |
modx_site_metatags | メタタグの管理。最近では使用されない。 |
modx_site_plugin_events | プラグインのイベント |
modx_site_plugins | TinyMCEのようなプラグイン |
modx_site_snippets | 独自スニペットやWayFinderのようなスニペット |
modx_site_templates | テンプレート |
modx_site_tmplvar_access | カスタムテンプレート変数のアクセス許可 |
modx_site_tmplvar_contentvalues | カスタムテンプレート変数の実データ |
modx_site_tmplvar_templates | カスタムテンプレート変数とテンプレートの対応 |
modx_site_tmplvars | カスタムテンプレート変数の定義 |
modx_system_eventnames | プラグインなどが使用するシステムイベント名 |
modx_system_settings | システム設定 |
modx_transport_packages | パッケージ情報 |
modx_transport_providers | パッケージのプロバイダ情報 |
modx_user_attributes | メールアドレスや氏名などのユーザ情報 |
modx_user_group_roles | グループロール |
modx_user_messages | メッセージ |
modx_user_roles | ユーザロール |
modx_user_settings | ユーザ設定(権限管理→ユーザ管理→ユーザ→設定の内容) |
modx_users | ユーザ名、パスワードなどの認証情報 |
modx_workspaces | MODxコアが使用するワークスペース |
MODxの管理画面を操作する中で最も日常的に発生するのは、新規リソースの作成や編集です。リソースの作成前後でMySQLの構造を比較してみるとわかりますが、新規リソースを作成した場合にデータベース上で更新されるテーブルは「modx_site_content」です。
試しに、「テンプレート」、「ページタイトル」、「エイリアス」、「ページコンテンツ」の4つを入力したリソースを作成し、mysqlコマンドで情報を取得すると次のような結果が得られます。
逆にテーブルの構造を見てみると、次のようになっています。
このように、ほとんどの項目にはデフォルト値が入るようになっているため、新規リソースをMySQL側から作成するのも容易です。
ここまでくればご想像のとおりですが、テンプレートや親リソースを設定することもできます。
これを応用していけば、スクリプトを使って静的なHTMLサイトをMODx化させることも不可能ではありません。データを挿入した後で、最終的には画像や各リンクなど手動で修正すべき点はあるでしょうが、コピー&ペーストで移行を行うよりははるかに手軽です。
カスタムテンプレート変数の構造
通常のリソース同様、比較的頻繁に作成、更新するであろう項目がカスタムテンプレート変数です。なかみつ園では各商品ページにテンプレート変数を埋め込んでいるのですが、値段や内容量などの確認、いわゆる「棚卸」のために、わざわざマウスで管理画面を何度も遷移するのは骨が折れます。
こちらもデータベース構造を把握しておけば、mysqlコマンドやphpMyAdminといったツールから比較的手軽に内容を確認、修正することができます。
例のごとく、カスタムテンプレート変数は各リソースに割り当て可能な変数ですが、データベースの構造は先ほどの「modx_site_content」とは少し異なります。以前の記事で、値段を格納するための「price」というカスタムテンプレート変数を定義し、「mytpl」というテンプレートから参照できるような設定を行いました。これをデータベース的に追いかけてみましょう。
次に、カスタムテンプレート変数とテンプレートの関係について調べておきます。まず、「mytpl」というテンプレートのIDは次のようにして取得できます。MySQLに詳しい方はサブクエリを使って、一気に情報を取得してみても良いでしょう。
「mytpl」のIDは3であることがわかりました。次にmodx_site_tmplvar_templatesテーブルを表示してみます。
tmplvaridはテンプレート変数ID、templateidはテンプレートIDを表しますので、この結果は
- 「テンプレート変数IDが1であるpriceテンプレートはテンプレートIDが3であるmytplテンプレート内で使用可能」
を意味します。最後に、肝心のカスタムテンプレート変数の中身ですが、「modx_site_tmplvar_contentvalues」テーブルに格納されています。
contentidとは各リソースのIDを表すため、リソースIDが10と11であるリソースの中で、tmplvarid=1、つまりpriceというカスタムテンプレートが使用されていることになります。
リソースやカスタムテンプレート変数以外にも、スニペットやテンプレートなど、多くのものがMySQL上に格納されます。お使いの用途に応じて、データベースをうまく操作するようにしてください。
おまけ
もう1つおまけとして、今回は簡単なスニペットの作り方について紹介したいと思います。前回紹介したように、MODx-2.1.0からはこれまで使用できていた多くの関数が削られてしまい、筆者が個人的によく使用していた
といった構文もサポートされなくなってしまいました。Summary of Legacy Code Removed in 2.1やPHP Coding in MODx Revolution, Pt. lでも紹介されているとおり、MODx-2.1.0以降では
という形でオブジェクトの情報を取得します。実際の例として、gihyo.jpの各ページには
といった表示がありますが、これはご想像のとおりスニペットが表示している値です。読むための時間は基本的にページの分量に比例しますので、「1,000文字読むのに約1分(1文字あたり1/1000分)要する」と仮定した場合、スニペットの内容は次のようになります。
getObjectというメソッドは多くのスニペットから使用することが多いので、覚えておいて損はありません。
最後に
今回はデータベース側から見たMODxということで、文字ばかりの記事になってしまいましたが、バックエンドを知ることで、MODxマスターに一歩近づくことができます。
もし価格や内容量を含む商品データベースが別サーバに存在する場合、crontab+スクリプトから定期的にマスターの情報をMODx側に適用する、という使い方などは実用的でおもしろそうです。
データベースを操作しすぎて管理画面との整合性がとれなくなっては元も子もありませんが、状況に応じてデータを簡単かつ正確に操作できるよう、お使いの環境にあった最適な運用方法をぜひ考えてみてください。