Dittoのタギング(tagging)をフィルター代わりに使う

Dittoで条件を絞り込む際、通常はフィルターを使います。
フィルターは複数指定することで、それぞれをAND条件とし、さらに絞り込むことができます。
参考)http://d.hatena.ne.jp/hikidas_ikeda/20090306/1236350741

もう一つ、絞り込みに使えるものとして、タギングtagging)があります。タギングの場合は、複数指定して、それぞれをOR条件とすることもできます。(ちなみに、フィルターとタギングを両方使った場合、フィルターとタギングの関係はAND条件になります)

例として、テンプレート変数(tagword)にタグとなるキーワードを「,」で区切って入力していて、キーワード「MODx」または「CMS」がここに入力されているものだけに絞り込んで一覧表示するケースを想定します。
なお、ページアドレスは「search_tag.html」とします。

■キーワードを、直接Dittoスニペットのパラメータで指定する。

[!Ditto? &id=`tag_search` &extenders=`tagging` &tagData=`tagword` &tagDelimiter=`,` &tags=`MODx,CMS` &language=`japanese-utf8`!]

上記のようにDittoパラメータでキーワードを指定するとキーワード毎にページが必要になりますので、次にURLでキーワードを指定するようにします。

■キーワードを、URLで指定する。
ここでは、Dittoのidパラメータが「tag_search」ですので、「tags」を「tag_search_tags」として、アドレスは以下のようにします。

search_tag.html?tag_search_tags=MODx,CMS

(もしDittoにidパラメータをつけていなければ「tags」でOKです)

この場合、Dittoスニペットのパラメータに「tags」は不要です。

[!Ditto? &id=`tag_search` &extenders=`tagging` &tagData=`tagword` &tagDelimiter=`,` &language=`japanese-utf8`!]

※日本語のキーワード等を使う場合、UTF-8でURLエンコードして指定します。(「UTF-8」「URL」「エンコード」等で検索するとエンコードできる無償のサービスが多数みつかると思います)


■さらに、使用するフィールドまで、URLで指定する。
Dittoの「request」を使って、「tagData」パラメータを指定します。
例として、説明(ドキュメント変数「description」)内のキーワードを使うように変更します。

アドレス

search_tag.html?ditto_tag_search_tagData=description&tag_search_tags=MODx,CMS

Dittoスニペット

[!Ditto? &id=`tag_search` &extenders=`request,tagging` &tagData=`tagword` &tagDelimiter=`,` &language=`japanese-utf8`!]


★注意★
Dittoの「extenders」パラメータの指定は、順番に意味があります。
例えば、上記で「&extenders=`tagging,request`」とすると、「tagging」が先に実行されますので、URLでの「tagData」指定は無効になります。
(ちなみに「tags」だけは特別で、元々URLで指定できるようになっています)

Dittoに複数のフィルターをリクエストパラメータで渡す

Dittoで一覧表示する際、いろいろな絞り込み条件の組み合わせで表示したい場合があります。直接スニペットコールに書く場合は、フィルターを複数並べるだけで良いのですが、これをリクエストパラメータとしてURLに埋め込むとなると話が違ってきます。

例えば、「flag01=1」、かつ、「flag02=1」のものだけに絞り込む場合、直接スニペットコールにフィルターを書けば

[!Ditto? &filter=`flag01,1,1|flag02,1,1` &language=`japanese-utf8` &display=`all` &dateFormat=`%Y.%m.%d`!]

となりますが、これに「request.extender」を使って、

[!Ditto? &extenders=`request` &language=`japanese-utf8` &display=`all` &dateFormat=`%Y.%m.%d`!]

としておいて、

http://www.hogehoge.net/example.html&ditto_filter=flag01,1,1|flag02,1,1

と呼び出しても、うまくいきません。(もちろん、フィルターが1つなら、この方法で問題なく機能するのですが)

このような場合、Dittoの「request.extender」には、フィルターに連番をつけて複数指定するという、隠された?機能があります。
具体的には、

http://www.hogehoge.net/example.html&ditto_filter=flag01,1,1&ditto_filter_2=flag02,1,1

というように「filter_2」「filter_3」…と、連番をつけて指定するという方法です。

ただし、これには、条件があって、
必ず連番であること。(つまり、番号を飛ばすことはできません。)
さらに、以下のどちらかである必要があるようです。

  1. 「filter」「filter_2」…
  2. 「filter_1」「filter_2」…

もう少し正確に言うと、以下のどちらかということになります。

  1. 「filter」と「filter_2」の両方を使う。
  2. 「filter」を使わずに「filter_1」を使う。
              • -

私は最近までこれを知りませんでした。別のことでDitto(request.extender.inc.php)のソースを調べていて、偶然見つけたのです。
これを知った瞬間、長年の悩みが一挙に解消した喜びと、あまりにもあっけなくて、少し脱力も感じるぐらいでした。こういう情報って、なかなか出てこないもんなんですね。

CSVを使ってテンプレート変数を一括作成

フォーマット化されたページ(支店ページや商品データベース等)をMODxで生成する場合、多くの入力項目(住所、連絡先、営業時間、地図の緯度・経度、…)が必要になりますが、それらは、テンプレート変数を多数作成することで実現できます。
その際、MODx管理画面から、ひとつ一つ、テンプレート変数を作成していっても良いのですが、これが結構な手間だし、人によってはたいへんなストレスになったりします。

テンプレート変数の定義データは、データベースでは、おおよそ(*1)「modx_site_tmplvars」テーブル1つですので、phpMyAdminを使って、単純にCSVをインポートすれば、一括で作成することができます。

■1.テンプレート変数定義ファイル(原本)の作成

Excel等の表計算ソフトを使って、テンプレート変数定義ファイル(原本)を作ります。

(1)まず、以下のフィールド名を1行目に並べます。(この順番通りに)

id
type
name
caption
description
editor_type
category
locked
elements
rank
display
display_params
default_text

※この1行目は、実際には使用しませんが、これが無いと入力しずらいですし、最初のカラム「id」が全行空欄だと、Excelcsv保存時に1カラム目を削ってしまうようですので。(この対策としては、「'」を入れておくという方法もありますが)

(2)2行目以降に必要な定義情報を埋めていきます。

id (空欄のまま:自動採番なので)
type 入力タイプ(「text」とか「image」とか…)
name 変数名
caption 見出し
description 説明
editor_type (空欄、もしくは「0」)
category カテゴリーID(※番号です)/デフォルト「0」
locked 変数をロック(ロックする:「1」)/デフォルト「0」
elements 入力時のオプション値
rank 並べ替え順/デフォルト「0」
display ウィジェット(「image」とか「delim」とか…)
display_params Widget プロパティ
(「&align=none&alttext=[+pagetitle+]」とか…)
default_text 既定値

※「type」と「name」は以外は、空欄でも問題はありません。

(3)保存します。(Excel等の形式で良いでしょう)

■2.DBインポート用のCSVの作成

(1)先ほど作った原本から、CSV形式で保存します。
   (Excelで開いているファイルは閉じておきます)

(2)エディタ等で開き、1行目を削除します。

(3)文字コードを「UTF-8」に変更して保存し直します。

■3.phpMyAdminでインポート

(1)「modx_site_tmplvars」テーブルを選びます。

(2)「インポート」を選びます。

(3)各項目を埋めていきます。

テキストファイルの位置 (先ほど作ったCSVファイル)
ファイルの文字セット utf8
インポートするファイルの形式 CSV
フィールド区切り記号 「,」カンマ(半角英記号)
フィールド囲み記号 (空欄、もしくはデフォルトの「"」)

(4)実行する。

■4.MODx管理画面を開いて確認

念のため確認して、終わり。

(*1)「テンプレートへのアクセス」「アクセス許可」は別のテーブルです。

              • -

【参考】テンプレート変数の「入力タイプ」の設定

text Text
rawtext Raw Text (deprecated)
textarea Textarea
rawtextarea Raw Textarea (deprecated)
textareamini Textarea (Mini)
richtext RichText
dropdown DropDown List Menu
listbox Listbox (Single-Select)
listbox-multiple Listbox (Multi-Select)
option Radio Options
checkbox Check Box
image Image
file File
url URL
email Email
number Number
date Date
              • -

【参考】テンプレート変数の「ウィジェット」の設定

datagrid Data Grid
floater Floater
marquee Marquee
richtext RichText
ticker Ticker
viewport View Port
htmlentities HTML Entities
date Date Formatter
unixtime Unixtime
delim Delimited List
htmltag HTML Generic Tag
hyperlink Hyperlink
image Image
string String Formatter

cron等でウェブサーバを通さずMODxを使う。

cronを使って、定周期処理をバックグラウンドで行いたい等、
ウェブサーバを介さずMODxを使いたい場合があります。

そういう場合、
MODxAPI(http://modxcms.com/MODxAPI-Library-865.html
を使うという方法がありますが、いくつか注意すべきことがあります。

1.セッション

MODxAPIは、セッションを前提にしていますが、当然cronでセッションも無いですね。
そこで、以下のような感じで、MODxAPIクラスを継承して、セッション処理を止めます。

class myMODxAPI extends MODxAPI {
	function startSession() {
	}
}
$modx = new myMODxAPI();

2.パス

MODxAPIは、MODxのドキュメントルートで使われることを前提にしているようです。(たぶん)
ですので、プログラムはMODxのドキュメントルートに置きます。

また、configの「base_path」は使えないようです。(たぶん)
以下のように、自分でパスを取得します。

$base_path = dirname(__FILE__);

ヒキダス流:ドキュメントIDの確保(2009年2月時点)

ヒキダスでは、サイトを構築する際、多くの場合、本番用のサーバだけではなく、テスト用にもバーチャルドメインを設定し、テストサーバを作ります。テストサーバには、サイト全体に閲覧認証をかけますが、これも「.htaccess」を使わないので、FTPでアップされたコンテンツは、テストサーバも本番サーバも、ほぼ100%同じものになります。(当然ながら、更新のタイミングは、ずれることがありますが)
MODxの管理画面から設定する内容も、同じ内容にしておきたいですが、そこで問題になるのが、ドキュメントIDです。
たとえば、新着情報のフォルダを作って、そこに作成したドキュメントを新着情報として表示するとした場合、トップページでDittoを使って最新の新着情報を表示する場合、パラメータで、この新着情報フォルダのドキュメントIDを指定することになります。
ドキュメントIDは、自動採番で勝手に割り振られるものですから、テストサーバと本番サーバと、同じ順番で同じ内容のドキュメントを作っていけば同じになりますが、まあそのようになることは期待薄です。
そこで、ヒキダスでは、MODxをインストールしたら、ダミーでドキュメントをたくさん作っておきます。(10とか20とか、サイトによっては50ぐらいのときも)
MODxはインストールすると、ドキュメントID「1」のドキュメントがありますが、これは使わず、ドキュメントID「2」をトップページとして、この「1」のドキュメントを非表示フォルダにして、この下にダミーページを隠しておいておきます。
そして、ID指定の対象になるコンテンツが必要になったら、この隠しておいたダミードキュメントを表に出してきて使うということをやっています。
このようにしておけば、Dittoのスニペットコール等、テストサーバも本番サーバも、全く同じものが使えます。
ま、もっと良い方法があれば、変えていきたいと思いますが、現時点でヒキダスではこれでやっています。

「サーバータイプ」(http/https)設定の使われ方

MODxの管理画面の、
ツール > グローバル設定 > サイト
では、最も基本となるサイト全体の設定を行いますが、この中に「サーバータイプ」という設定項目があり、「http」か「https」のどちらかを選ぶようになっています。(設定名としては「server_protocol」となっています)

これが、どこにどういう影響を及ぼすのか?
MODx 0.9.6.3のソース内を検索してみたところ、スニペット「weblogin」のpassword reminderでのみ使われているようです。
つまり、ウェブユーザがパスワードを忘れた時のメールに記載するサイトのアドレスに使われているだけのようです。

ちなみに、
標準ではありませんが、同じような目的で使うスニペット「WebLoginPE」でも、ResetPasswordの中で、メールに記載するサイトのアドレスにのみ使っているようです。(それも、ポート番号が80ではない場合のみ)