Home > MODx > [MODx]Dittoでドキュメントとウェブリンクを同様に扱うには?

[MODx]Dittoでドキュメントとウェブリンクを同様に扱うには?

MODxを使用して以下のようなことをしたいと思っていました。

前提条件
  • MODx0.9.6
  • サイトには随時、記事が追加される
  • サイトは外部のブログへのリンク集も持ち、そのリンクも随時追加される
  • MODx上で記事はドキュメント、リンクはウェブリンクで保持している
やりたいこと
  • 新着記事、リンクをDittoを使って表示する
  • 記事もリンクも時系列でソートされ、どちらもごちゃまぜで表示する
  • 記事の場合は内容([+content+])の一部、リンクの場合はリンクの説明文([+description+])を表示する

例えば以下のようなファイル構成です(カッコ内はそのオブジェクトが持つID)。

記事用フォルダ(1)
 └記事A
 └記事B
 └記事C

ウェブリンク用フォルダ(2)
 └リンクA
 └リンクB
 └リンクC

このようなファイル構成から記事とウェブリンクをごちゃ混ぜにして公開日が最新の3件を取得するには、Dittoスニペットを以下のように使用します。表示に使用するチャンク名はchunkとします。

[[Ditto?parents=`1,2` &sortBy=`pub_date` &total=`3` &sortDir=`DESC` &tpl=`chunk` &hideFolders=`1`]]

それぞれの設定内容は以下の意味です。

設定内容 意味
parents=`1,2` 記事用フォルダとウェブリンク用フォルダ両方から取得する
sortBy=`pub_date` 公開日でソートする
total=`3` 3件取得する
sortDir=`DESC` 降順でソート(新しいものが上にくる)
tpl=`chunk` 使用するチャンク名
hideFolders=`1` 親フォルダを表示対象にしない

そしてチャンクを以下のようにし、PHxファンクションを使用してドキュメントかウェブリンクかで表示内容を変えます。プレースホルダ[+type+]がドキュメントの場合はdocument、ウェブリンクの場合はreferenceとなるのでそれをもとに条件式で判定します。

注意
以下の例はうまく動作しません。

[+phx:if=`[+type+]`:is=`reference`:then=`[+description+]`:else=`[+content:limit=`500`+]`+]

これでドキュメントのときは内容([+content+])の最初の500文字を、ウェブリンクの場合は説明文([+description+])を表示できる・・・と思ってたらできませんでした。色々試行錯誤しているうちに、どうやら[+type+]の中にオブジェクトのタイプがちゃんと取れるときと取れないときがあることがわかりました。

結局、[+type+]を別の場所で一度使用してやるとPHxファンクションの中でも使用できるようになることを発見。以下のようにHTMLのコメント部で一度表示するとうまくいきます。なぜかはわかりませんが。

一応の解決策

<!-- this is [+type+] -->
[+phx:if=`[+type+]`:is=`reference`:then=`[+description+]`:else=`[+content:limit=`500`+]`+]

Dittoのソースとか追っかければ理由はわかるかもしれないけど、今までPHPはほとんどノータッチだったので、とりあえず動いたということでよしとします。

関連するエントリー [MODx] Dittoでドキュメントとウェブリンクを同様に扱うには?





プレビュー

トラックバック:No Trackbacks

トラックバック URL
http://blog.garden-place.jp/action.php?action=plugin&name=TrackBack&tb_id=108
Listed below are links to weblogs that reference
[MODx]Dittoでドキュメントとウェブリンクを同様に扱うには? from Web 酒 肴
このエントリにトラックバックはありません
このトラックバックURLを使ってこの記事にトラックバックを送ることができます。 もしあなたのブログがトラックバック送信に対応していない場合にはこちらのフォームからトラックバックを送信することができます。.

Home > MODx > [MODx]Dittoでドキュメントとウェブリンクを同様に扱うには?

Search
Feeds

Page Top