Welcome !! Now 2008.07.25 16:19 (JST)

Ditto - 2.1 beta

Dittoは、様々な形式で、ドキュメントの一覧を出力するスニペットです。

ドキュメントにタグを挿入したり、カテゴリページを作ったり、ブログやニュース形式でページを作ったり出来ます。

rss feed、xmlなども出力出来ます。マルチ言語対応。

コンフィギュレーションファイルをサポート、簡潔なスニペットコールで表現できます。

参照ページ:Ditto Support Site

※現在2.1betaは、RSS出力でエラーが出るバージョンがあります※

rss.format.inc.php の以下を

<?xml version="1.0" 
          encoding="[+rss_charset+]" ?>

<?xml version="1.0" 
          encoding="UTF-8" ?>

とかにして、しのいでますが、なぜなんでしょうか。2.02では問題がないようです。

このドキュメントの更新履歴

テスト環境

  • サーバ:さくらインターネット  
    • PHP 4.4.4
    • MYSQL 4.0.27
  • MODx:0.9.5 / 0.9.6
  • Ditto - 2.1 beta

このページの解説について

このページは、Ditto 2.x系の解説です。Ditto 1.x系の解説はこちらになります。

MODx 0.9.6 を新規にインストールした場合は、はじめからDitto 2.x系が同梱されています。こちらの解説をご覧下さい。

Ditto 1.xから2.xへアップグレードされた方

MODx 0.9.5 以前にはDitto 1.xが同梱されています。0.9.5から0.9.6 へインストールすると、Dittoは2.xにアップグレードされます(強制的に…笑)。

MODx 0.9.5 へももちろんDitto 2.xを導入することができます。

Ditto 1.x系から2.x系へアップグレードされた方、またはその予定の方は、まず、Ditto 2.x と 1.x の違いをご参照下さい。

旧バージョンとの混在

Ditto 2.x では、「ditto_base」パラメータで、ditto の外部リソースファイルの場所を指定できるので、2.x系 ditto のリソースを「ditto21b」などのフォルダに格納し、スニペット名も「ditto21b」などとすることで、旧バージョンとの混在が可能です。

基本的な書式

[[Ditto? &parents=`54,70`]]

または

[!Ditto? &parents=`54,70`!]

目次

パラメータ(セッティングと拡張)

ditto_base

Ditto の外部リソースの場所を指定します。デフォルトは以下です。

[(base_path)]assets/snippets/ditto/

インスタンス:

&ditto_base=`assets/snippets/ditto21b/`

※このパラメータは「コンフィギュレーションファイル」に含めることはできません※

id

ユニークIDを指定します。「Reflect」スニペットで、アーカイブを出力する場合にこのIDを利用します。1ページに複数個のDitto を設置する場合にも有効です。

また、Ditto でページ分割する場合、ページナビゲーション関係のプレイスホルダにもこのIDが必要になります(「Ditto でページ分割する場合」参照)。

デフォルト「ブランク("")」。

このパラメータは「コンフィギュレーションファイル」の中で指定できません。

language

言語ファイルを指定します。デフォルト「english」。言語ファイルは、「lang」フォルダー下に格納されています。日本語の言語ファイルは、「japanese-utf8.inc.php」になります。以下のように指定します。

インスタンス:

&language=`japanese-utf8`

または、必要であれば、eucでファイルを作り、指定します。

尚、2.1BATAには、日本語ファイルは含まれていません。MODx0.9.6 に同梱のDitto2.01 に含まれています。

スニペットを直接直す

Ditto 1.x の時と同じように、Ditto スニペットの以下の部分を修正することも可能です。

*/ 
$language = (isset($language))? $language : "english";
/*

*/ 
$language = (isset($language))? $language : "japanese-utf8";
/*

format

出力フォーマットを指定します。以下を指定できます。デフォルト「html」。

  • html
  • json
  • xml
  • atom
  • rss

config

コンフィギュレーションファイルを使うを参照してください

debug

デバックインフォメーションを出力するかどうかを指定します。デフォルト「しない(0)」。

※このパラメータを「コンフィギュレーションファイル」で「1」にセットすることはできません※

phx

PHx ファンクションを利用するかどうかを指定します。デフォルト「する(1)」。

※PHx ファンクションはDitto の外部リソースに含まれていますので、別途PHxプラグインを導入する必要はありません。

extenders

後述のextendersを参照してください。

save

Ditto オブジェクト及び結果を他のスニペットで利用できるように、プレイスホルダに代入するかどうかを指定します。デフォルト「しない(0)」。以下を指定できます。

  • 0 … off; returns output
  • 1… remaining; returns output
  • 2 … all;
  • 3 … all; returns ph only

ちょっと意味がわかりません。。

removeChunk

取得するコンテンツから、取り去るチャンクを指定します。カンマで区切って複数指定可能です。

一般的には、「NewsPublisher」による投稿によって付加された「comment」チャンクを取り去るために利用します。

パラメータ(データの取得と表示)

parents

取得したいドキュメント群の親ドキュメントをIDで指定します。デフォルト「カレントドキュメント」。カンマで区切って複数指定可能です。

「メニューに表示・非表示」に関係なく、公開ドキュメントをすべて取得します。また、ここで指定したドキュメントが非公開であってもその下のドキュメントが公開されていれば表示します。

取得する階層は、「1階層」です(「depth」を参照)。

documents

取得したいドキュメントのIDを指定します。デフォルト「なし」。カンマで区切って複数指定可能です。

「メニューに表示・非表示」に関係なく、公開ドキュメントをすべて取得します。

「documents」を指定すると「parents」で指定した値は無効になります。

depth

何階層まで取得するかを「1」以上の整数で指定します。デフォルト「1」。「1」以上の整数以外を指定するとすべての階層を取得します。

dateFormat

プレイスホルダ[+date+]の表示形式を指定します。phpのstrftime関数の値を利用できます。デフォルト「言語ファイルから読み込み($_lang['dateFormat'])」。

注意点

以下のようにパラメータの値に2バイト文字を含めると出力結果が文字化けします。

dateFormat=`%Y年%m月%d日 %R`

これは、「classes/ditto.class.inc.php」の950行目付近を以下のようにするとことで回避できます。

function formatDate($dateUnixTime, $dateFormat) {
  global $modx;
  $dt = strftime($dateFormat, (intval($dateUnixTime) + $modx->config["server_offset_time"]));
  if ($modx->config["modx_charset"] == "UTF-8") {
    $dt = utf8_encode($dt);
  }
return $dt;
}

function formatDate($dateUnixTime, $dateFormat) {
  global $modx;
  $dt = strftime($dateFormat, (intval($dateUnixTime) + $modx->config["server_offset_time"]));
//  if ($modx->config["modx_charset"] == "UTF-8") {
//    $dt = utf8_encode($dt);
//  }
return $dt;
}

3行をコメント行にして無効にします(MODxフォーラム内関連トピ)。

display

取得したドキュメントのうち、何件表示するかを指定します。デフォルト「3」。「all」を指定するとすべてのドキュメントを表示します。

total

何件取得するかを指定します。デフォルト「すべて(all)」。

showPublishedOnly

公開ドキュメントのみを表示対象するかどうかを指定します。デフォルト「はい(1)」。非公開ドキュメントも表示対象にしたい場合「0」を指定します。

showInMenuOnly

メニューに表示しているドキュメントのみを表示対象とするかどうかを指定します。デフォルト「いいえ(0)=メニューに非表示ドキュメントも表示」。

メニューに表示していないドキュメントはDittoの表示対象から外したい場合は「1」を指定します。

hideFolders

フォルダ(親ドキュメント)を表示対象から外すかどうかを指定します。デフォルト「外さない(0)=表示する」。

hidePrivate

「private」ドキュメントを表示対象から外すかどうかを指定します。デフォルト「外す(1)=表示しない」。

seeThruUnpub

hideFolders」が「1」で「depth」が「1」より大きい場合、非公開親ドキュメントの子ドキュメントを表示するかどうかを指定します。デフォルト「する(1)」。

ドキュメントではデフォルト「しない(0)」になっていますが、デフォルトは「する(1)」です※

挙動がちょっとわかりづらいのですが以下のようになります。

インスタンス:

ドキュメントツリー
document A(15) --- published
 └document B(16) --- published
 └document C(17) --- unpublished
   └document D(18) --- published
Ditto コール
[!Ditto? &parents=`15` &depth=`2`!]
アウトプット
  • document B
  • document D
Ditto コール
[!Ditto? &parents=`15` &depth=`2` &seeThruUnpub=`0`!]
アウトプット
  • document B
  • document D
Ditto コール
[!Ditto? &parents=`15` &depth=`2`  &seeThruUnpub=`0` &hideFolders=`1`!]
アウトプット
  • document B

と、いうように、単に親が非公開ドキュメントという条件だけでは、「seeThruUnpub=`0`」は、機能しません。

sortDir

昇順でソートするか降順でソートするかを指定します。デフォルト「降順(DESC)」。昇順にする場合は「ASC」です。

sortBy

ソートの基準になるフィールドを指定します。すべてのドキュメントオブジェクトまたはテンプレート変数を指定できます。デフォルト「作成日(createdon)」。

randomize

出力順序をランダムに変更するかどうかを指定します。デフォルト「しない(0)」

start

表示する際のオフセット値を指定します。1、2件目は表示せず、3件目から表示したいなら「2(= 2件スキップする)」を指定します。デフォルト「なし(0)」。

dateSource

プレイスホルダ[+date+]のソースを指定します。unix タイムスタンプを持つすべてのMODx フィールドや、以下のような テンプレート変数を指定できます。

  • createdon
  • pub_date
  • editedon

デフォルト「createdon」。

keywords

関連するキーワードを、それぞれのドキュメントのために取得するかどうかを指定します(ウソかも)。「tagData」や[+keywords+]のソースにできます。

※「keywords=`1`」にしてテンプレートに[+keywords+]を書いても表示されず。使い方間違ってる?METAタグとキーワードで設定したキーワードが入るんじゃないの?※

queryLimit

データベースから何件取得するかを指定します。MySQL の LIMIT と同等です。デフォルト「自動(0)」

where

MYSQL の where ステートメントを指定します。利用できるのは、ドキュメントオブジェクトのみで、テンプレート変数は利用できません。デフォルト「Null」

noResults

表示する結果がないときに、表示するテキストを、テキストかチャンクで指定します。デフォルト「言語ファイルから読み込み($_lang['no_documents'])」

hiddenFields

テンプレートパーサが処理できない、ネストされたプレイスホルダや、[fields]を取得する場合に指定します(ウソかも)。MODxフィールド名またはテンプレート変数をカンマで区切って複数指定可能です。デフォルト「Null」

パラメータ(ページング)

paginate

ページ分割するかどうかを指定します。デフォルト「しない(0)」。「1」を指定した場合、「display」で指定した値で分割します。

ページ分割する場合は、スニペットコールを non-cache 形式で書く必要があります。

また、ドキュメント内にページナビゲーション関係のプレイスホルダが必要です(「Ditto でページ分割する場合」参照)。

paginateAlwaysShowLinks

常に「次へ([+next+])」「前へ([+previous+])」のリンクを表示するかどうかを指定します。デフォルト「しない(0)」。

paginateSplitterCharacter

「前へ([+previous+])」「次へ([+next+])」へのリンクが機能しているとき表示される、スプリッタキャラクタ([+splitter+])を指定します。デフォルト「言語ファイルから読み込み($_lang['button_splitter'])」

ページ分割する場合、ページング関係のプレイスホルダにDitto コールで指定した「id」をプリフィックスとして挿入します。

Ditto コール
[!Ditto? &parents=`54` &display=`5` &id=`myDittoCall` &paginate=`1`!]
プレイスホルダ
<p>[+myDittoCall_previous+] [+myDittoCall_pages+] [+myDittoCall_next+]</p>

パラメータ(フィルター)

filter

指定した条件に一致するドキュメントを表示しないようにする機能です。もっとも基本的な書式は以下のようになります。

field,criterion,mode

それぞれは、「localFilterDelimiter」で指定した値で区切ります(スペースを入れてはいけません)。

  • field … MODx のフィールド名またはテンプレート変数を指定します
  • criterion … フィールドのデータタイプ(number, string, date など)と同じ値を指定します
  • mode … 1から8までの意味のある数字を指定します。それぞれ以下の意味を持ちます
    1.  != … 等しくない
    2. == … 等しい
    3. < … より小さい
    4. > … より大きい
    5. <= … 以下
    6. >= … 以上
    7. フィールドの値と同じテキストではない
    8. フィールドの値と同じテキスト
インスタンス
id,50,2
ドキュメントidが50のドキュメントを排除します。

複数のフィルタを指定する

複数のフィルタを指定する場合「globalFilterDelimiter」で指定した値で区切ってフィルタを並べることができます。並べるフィルタの数に制限はありません。

それぞれのフィルタは「or」の関係を持ちます。

インスタンス
id,50,2|id,52,2
ドキュメントid が50,またはドキュメントid が52のドキュメントを排除します。

@EVAL を利用する

フィルタとして@EVAL を利用しphpコードを書くこともできます(ウソかも)

globalFilterDelimiter

filter」の中で指定する「フィルタ」を区切る文字を指定します。「フィルタ」で利用していない文字を指定できます。デフォルト「|」。

localFilterDelimiter

「フィルタ」の中で、個々のパラメータを区切る文字を指定します。「フィルタ」自身に利用されていない文字を指定できます。デフォルト「,」。

パラメータ(テンプレート)

出力用のテンプレートを指定するパラメータです。以下の指定方法があります。

  • Any valid chunk name
  • Code via @CODE
  • File via @FILE

tpl

出力用のテンプレートを指定します。デフォルト「言語ファイルから読み込み($_lang['default_template'])」。以下になります。

<div class="ditto_item" id="ditto_item_[+id+]">
<h3 class="ditto_pageTitle"><a href="[~[+id+]~]">[+pagetitle+]</a></h3>
<div class="ditto_documentInfo">by <strong>[+author+]</strong> on [+date+]</div>
<div class="ditto_introText">[+introtext+]</div>
</div>

tplCurrentDocument」「tplFirst」「tplLast」が指定してある場合、該当するするアイテムでは、それぞれ、「tplFirst」「tplLast」「tplCurrentDocument」が優先されます。

tplAlt

tpl」と交互に現れるテンプレートを指定します。デフォルト「tpl」。背景色などを変更して出力結果を見やすくしたいときなどに使うと良いでしょう。

tplLast」「tplCurrentDocument」が指定してある場合、該当するするアイテムでは、それぞれ「tplLast」「tplCurrentDocument」が優先されます。

tplFirst

出力結果の中で、最初に現れるアイテムに適用するテンプレートを指定します。デフォルト「tpl

tplLast

出力結果の中で、最後に現れるアイテムに適用するテンプレートを指定します。デフォルト「tpl

tplCurrentDocument

カレントドキュメント用のテンプレートを指定します。デフォルト「tpl」。

tplFirst」「tplLast」が指定してある場合、カレントドキュメントが最初、または最後の時、「tplCurrentDocument」は適用されず、「tplFirst」「tplLast」が適用されます。

テンプレートの優先順位

  1. tplLast
  2. tplFirst
  3. tplCurrentDocument
  4. tplAlt / tpl

テンプレートが適用されるイメージ

ドキュメントツリー
document A(15)
 └document B(16)
 └document C(17) 
 └document D(18)
 └document E(19)
 └document F(20) 

ドキュメントツリー構造が上記のような場合、Ditto コールで「parents=`15`」として、すべてのテンプレートを指定したとすると、以下のように適用されます(上記の通りの順番で出力されたとします)。

アウトプットサンプル
・document B … tplFirst … tplFirst がなければ tpl
・document C … tplAlt 
・document D … tpl
・document E … tplAlt
・document F … tplLast … tplLast がなければ tpl
document D で Ditto コールをした場合:
・document B … tplFirst … tplFirst がなければ tpl
・document C … tplAlt 
・document D … tplCurrentDocument
・document E … tplAlt
・document F … tplLast … tplLast がなければ tpl

そしてすでにフォーラムでも指摘されていますが、document B でDitto コールをした場合は以下のようになります。

アウトプット
・document B … tplFirst … tplCurrentDocument は無効
・document C … tplAlt 
・document D … tpl
・document E … tplAlt
・document F … tplLast

tplPaginatePrevious

ページナビゲーションの「前へ」用のテンプレートを指定します。デフォルト「言語ファイルから読み込み($_lang['prev'] )」

tplPaginateNext

ページナビゲーションの「次へ」用のテンプレートを指定します。デフォルト「言語ファイルから読み込み($_lang['next'] )」

extenders

Ditto を機能拡張します。「extenders=`xxxxx`」で指定します。

実態は、「extenders」フォルダ下にあるファイルです。ファイル名の先頭がパラメータの値になります。パラメータはカンマで区切って複数指定可能です。

標準では、以下の4種類が用意されています。

dateFilter

Reflectや他の、日時を基準とするフィルタリングを利用したいときに指定します。Reflectでは、月別ページや年別ページを表示できるようになります。詳しくは「Reflect」を参照してください。

summary

旧バージョン(1.x系)と互換性を保つためのパラメータです(一部、このパラメータを指定しなくても有効になる機能があるようですが、指定した方が間違いはないと思います)。

有効になるプレイスホルダ

  • [+summary+]
  • [+link+]

有効になるパラメータ

  • trunc
  • truncAt
  • truncLen
  • truncOffset
  • truncText
  • tplTrunc
  • truncSplit

それぞれの説明はDitto 1.x 解説を参照してください。

※尚、Ditto2.xでは、切り詰める長さなどをPHxファンクションで指定できます※

request

URLを通して、Ditto のパラメータを利用するためのパラメータです。例えば、ドキュメントで以下のようにコールすると

[!Ditto? &extenders=`request`!]

このドキュメントのURLにDittoのパラメータを追加してそのパラメータを機能させることができます。

URLサンプル
http://www.exsample.com/sample.html&ditto_parents=2

これは、[!Ditto? &parents=`2`!] と同じ意味を持ちます。

複数のDitto を扱う

1ページに複数のDittoを設置している場合「id」を利用します。

スニペットコールサンプル
[!Ditto? &id=`menu` ....... !]
[!Ditto? &id=`toc` ....... !]
URLサンプル
http://www.example.com/sample.html&ditto_menu_display=all&ditto_toc_hideFolders=1

このように各Ditto を「&」でつないで指定します。

SEO Strict URLs を導入しているときの問題

SEO Strict URLsプラグイン」導入時、不要にリダイレクトされる問題についての、報告及び回避策です。

URL指定例
http://www.exsample.com/sample.html&ditto_parents=2

上記のURLにアクセスすると、「http://www.exsample.com/sample.html」にリダイレクトされます。

回避策
http://www.exsample.com/sample.html?&ditto_parents=2

「&」の前に「?」を挿入します。

SEO Strict URLs プラグインの解説はこちらです※

tagging

タギングに関するファンクションを有効にします(一部、このパラメータを指定しなくても有効になる機能があるようですが、指定した方が間違いはないと思います)。

有効になるプレイスホルダ

  • [+tagLinks+]
  • [+tags+]

有効になるパラメータ

  • tagDocumentID
  • tagData
  • caseSensitive
  • tagMode
  • tagDelimiter
  • tagDisplayDelimiter
  • tagSort
  • tagDisplayMode
  • tags

詳しくは、「Tagging」を参照してください

example

新しく「extenders」のパラメータを作るときのひな形です。

Tagging

extenders=`tagging`」とすることにより、タギングに関するパラメータ及び、プレイスホルダが有効になります。

パラメータ

tagDocumentID

タグリンクリストを表示するためのドキュメントをIDで指定します。デフォルト「カレントドキュメント」。

tagData

タグのデータソースとなるフィールドを指定します。カンマで区切って複数指定可能です。すべてのドキュメント変数、及び、テンプレート変数を指定できます。デフォルト「なし」。

caseSensitive

タグの大文字小文字の区別をするかどうかを指定します。デフォルト「しない(0)」。「tag」も「Tag」も同じリストに属することになります。

tagMode

フィルタリングの方法を指定します。以下を指定できます。

onlyAllTags
タグのすべてを持っているドキュメントを表示します。
onlyTags
タグのいずれかを持っているドキュメントを表示します。
removeAllTags
タグのすべてを持っているドキュメントを表示から除外します。
removeTags
タグのいずれかを持っているドキュメントを表示から除外します。

デフォルト「onlyTags」。

tagDelimiter

tagData」で指定したタグソースの中の、それぞれのタグを区切るキャラクタを指定します。タグ自身に含まないキャラクタであれば、なにを指定しても構いません。デフォルト「半角スペース」。

tagDisplayDelimiter

[+tagLinks+]で出力するタグを区切るキャラクタを指定します。すべてのキャラクタを指定できます。デフォルト「tagDelimiter」で指定した値。

tagSort

タグをアルファベット順にソートするかどうかを指定します。デフォルト「する(1)」。

tagDisplayMode

[+tagLinks+] で、どのようにタグを表示するかを指定します。以下を指定できます。

  1. tagDisplayDelimiter」で指定した値で区切って表示
  2. <u><li>~</li></ul>で表示

デフォルト「1」。

tags

すべてのタグを指定できます。タグは、「tagDelimiter」で区切って指定します。

プレイスホルダ

[+tagLinks+]
タグリンクテキストリストを出力します。「tagDocumentID」が指定してある場合は、そのドキュメントのURLを基点としたURLとなります。
[+tags+]
タグリストを出力します(リンクなし)。

タグリンクインスタンス

例えば以下のような場合:

  • tagDocumentID」で指定したドキュメントのURL ...sample.html
  • タグ ... modx

URLは、「sample.html?start=0&tags=modx」となります。

Reflect

アーカイブを出力するためのスニペットです。「Reflect」スニペットを利用するときは、Ditto コールで「extenders=`dateFilter`を指定します。

Reflect 2.1 beta の解説をアップしました。

プレイスホルダ

テンプレートで利用するプレイスホルダ

すべてのMODx ドキュメント変数とテンプレート変数をプレイスホルダとして利用できます。例えば、[*pagetitle*]ならば、[+pagetitle+]と記述することによって、値を取得できます。

ページング(ページ分割)で利用するプレイスホルダ

このプレイスホルダは、Ditto コールをしたドキュメントに記述します。Ditto コールで指定した「id」をプリフィックスとして挿入します(「Ditto でページ分割する」参照)。

  • [+start+] … ページの最初のアイテムが全体([+total+])の何件目かを表示
  • [+stop+] …  ページの最後アイテムが全体([+total+])の何件目かを表示
  • [+total+] … 全体で何件かを表示
  • [+currentPage+] … 現在何ページ目かを表示
  • [+totalPages+] … 全体で何ページかを表示
  • [+pages+] … 各ページへのリンクを表示
  • [+previous+] … 前ページに戻るためのリンクを表示。「tplPaginatePrevious」でリンクテキストを指定できる
  • [+next+] … 次ページへ進むためのリンクを表示。「tplPaginateNext」でリンクテキストを指定できる
  • [+splitter+] …区切り文字。「paginateSplitterCharacter」でリンクテキストを指定できる
  • [+item[x]+] … 機能してる?

Ditto & Reflect によるサンプル

※準備中※

  • Ditto でフロントページに注目記事を表示する
  • Reflect で過去ログの一覧を出力する
  • Ditto による Tagging サンプル
  • Ditto の PHxファンクションで、取得ソースからHTMLタグを取り去る
  • Ditto の PHxファンクションで、取得文字を切り詰めて表示する
  • Split Pagination(スニペット)で Ditto のページナビゲーションをカスタマイズする
  • Ditto で各種サイトマップを生成する

コンフィギュレーションファイルを使う

Ditto2でも、Wayfinder2.0MaxiGallery で採用されている config パラメータを使った簡潔なスニペットコールの記述が可能です。

  1. configuration ファイルを作る
    <?php
    // common parameter //
      $param = 'value';
    ?>

    こんな感じに「$パラメータ = '値';」を並べます

    値を囲むクォーテーションはパラメータ指定の「``」ではなく、「''」または「""」なので注意。

  2. ファイルを作ったら「configs」以下に「sample.config.php」という名前で保存します。
  3. サーバー上の該当位置にアップロードします
  4. Dotto コールで configuration file を指定します
    [!Ditto? &config=`sample`!]

Compatibility

後方互換を取るためのコンフィギュレーションファイルです。Ditto1.xのバラメータで、コールできように設定します。以下のようにパラメータを並べます。

$newParameters = $oldParameter;

ファイルとしては、configs 下にありますが、Ditto のデベロッパーズドキュメントでは extenders に入っています。将来的にどちらに入るかちょっとわかりません。

△ページトップ