スニペットのパラメータにDittoのプレイスホルダを使うと変!?  【解決済み】

質問全般・改善要望
返信する
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

スニペットのパラメータにDittoのプレイスホルダを使うと変!?  【解決済み】

投稿記事 by kazuike »

Dittoの結果の件数を他のスニペットのパラメータに使おうとしているのですが、
なんとも奇妙な現象に遭遇し、困っています。

具体的には、

コード: 全て選択

[!Ditto?id=`test`&paginate=`1`!]
というようなDittoの結果を別のスニペットで使おうと思い、

コード: 全て選択

[!hogehoge?ph=`[+test_total+]`!]
のようなスニペットコールを行ったところ、
スニペット内で「$ph == "0"」等の判定が効かず、困っています。(どんな場合もFALSEです。)

スニペット内でパラメータ「$ph」をvar_dumpで出力したところ、
「string(14) "1"」とか「string(14) "0"」等となります。

14バイトの「1」「0」とは、どんなデータなのでしょう?
ちなみに、14という数字は、Dittoのidを変えるとその文字数に応じて変わります。
(おそらくプレイスホルダ「[+test_total+]」のバイト数かと思いますが…)

環境は、以下です。
MODX:1.0.5J-r5
PHP:5.2.17
MySQL:5.0.77

根本的に使い方が間違っているとか?
ヒントでも、思いつきでも、なんでもかまいません。
なにとぞご教授のほど、お願いします。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by yama »

見たところ[+test_total+]が文字列としてそのまま渡っているように思えますが・・スニペット「hogehoge」の中身を<?php var_dump($ph);として試してみたところ、こちらでは問題なく$phを通じて件数を取得できました。
記事中に[+test_total+]とだけ書くとtotal件数が表示されるはずですが、それは問題ないですよね?
(正しくプレースホルダーとして値が渡ってたらhogehogeスニペット内で return $modx->placeholders['test_total']; としても呼び出せると思いますが)
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by kazuike »

yamaさん
ありがとうございます。
yama さんが書きました:記事中に[+test_total+]とだけ書くとtotal件数が表示されるはずですが、それは問題ないですよね?
そのままプレイスホルダを表示した場合は問題ありません。「1」とか「0」とか表示されます。
yama さんが書きました:(正しくプレースホルダーとして値が渡ってたらhogehogeスニペット内で return $modx->placeholders['test_total']; としても呼び出せると思いますが)
「$modx->placeholders[]」や「$modx->getPlaceholder()」は、NULLが返ります。
yama さんが書きました:スニペット「hogehoge」の中身を<?php var_dump($ph);として試してみたところ、こちらでは問題なく$phを通じて件数を取得できました。
もしかして、環境依存なのでしょうか?
yamaさんのところでは、「var_dump($ph);」の出力結果は
「string(1) "1"」とか「string(1) "0"」等になるのですよね?
こちらでは「string(14) "1"」とか「string(14) "0"」になりますが…
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by kazuike »

大きな勘違いに気づきました。すみません。
「string(14) "1"」というのは、
「string(14) "[+test_total+]"」と出力されたものが、
その後、プレイスホルダの「[+test_total+]」部分が置換されて「1」になったものですね。
お恥ずかしい次第です。

ということは、
Dittoのプレイスホルダを他のスニペットで使うということはできないですね。

Dittoの結果を他のスニペットに渡す、何か良い方法ないでしょうか?
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by yama »

http://photozou.jp/photo/photo_only/280550/93724982
デモサイト(http://demo.modx.jp/)で試してみましたが、こちらでは値を受け取ることができました
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by kazuike »

yamaさん
ありがとうございます。

「$modx->getPlaceholder('test_total')」
「$modx->placeholders['test_total']」
で値をとることができました。
どうも、単純に呼ぶ順番が間違っていたようです。
重ね重ね申し訳ないです。

ただ、

コード: 全て選択

[!hogehoge?ph=`[+test_total+]`!]
では、
ありかわらず、$phには「[+test_total+]」がそのまま入ります。
yama さんが書きました:http://photozou.jp/photo/photo_only/280550/93724982
デモサイト(http://demo.modx.jp/)で試してみましたが、こちらでは値を受け取ることができました
これ、スニペット「hogehoge」自体は「[+test_total+]」という文字列を出力していて、
それが後で置換されて「4」が出ているってことないですか?
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by yama »

kazuike さんが書きました:

コード: 全て選択

[!hogehoge?ph=`[+test_total+]`!]
では、
ありかわらず、$phには「[+test_total+]」がそのまま入ります。
yama さんが書きました:http://photozou.jp/photo/photo_only/280550/93724982
デモサイト(http://demo.modx.jp/)で試してみましたが、こちらでは値を受け取ることができました
これ、スニペット「hogehoge」自体は「[+test_total+]」という文字列を出力していて、
それが後で置換されて「4」が出ているってことないですか?
そういえばそうですね。今回は$modx->getPlaceholder()でよさそうですが、もし[+test_total+]文字列をスニペット内部で値に変換する必要がある場合は$modx->mergePlaceholderContent()をかませるとよいのかなと思います。

追記
プレイスホルダー名が分かってるので$modx->mergePlaceholderContent()は意味ないですね、、
kazuike
メンバー
メンバー
記事: 507
登録日時: 2009年8月12日(水) 12:53

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by kazuike »

yamaさん、ありがとうございます。
yama さんが書きました:もし[+test_total+]文字列をスニペット内部で値に変換する必要がある場合は$modx->mergePlaceholderContent()をかませるとよいのかなと思います。
ありがとうございます。
そういうものがあることを忘れていました。f(^^;;

余談ですが、
「manager/includes/document.parser.class.inc.php」を見てみると、
・$modx->mergeDocumentContent() … リソース変数/テンプレート変数
・$modx->mergeSettingsContent() … 設定
・$modx->mergeChunkContent() … チャンク
・$modx->mergePlaceholderContent() … プレイスホルダ
等、スニペットのパラメータでも使えそうなAPIがいくつかありますが、
よくよく考えると、
プレイスホルダ以外は、スニペットの前に処理されていますし、
おそらく、他のスニペットによって書き換えられるようなことも無いでしょうから、
mergePlaceholderContent以外は使うことはなさそうですね。

もちろん、名前がわかれば、
getTemplateVarOutput、getConfig、getChunk、getPlaceholder
等を使えば良いことですし。

さらに余談ですが、
もしかして、「$modx->evalSnippets()」を使ったら、
スニペットのパラメータにスニペットコールを入れて、
スニペットからスニペットを呼び出すなんてことも可能だったりします?
(括弧とパラメータの指定はエンコード→デコードしないといけないかもしれませんが)
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
アバター
yama
管理人
記事: 3251
登録日時: 2009年7月29日(水) 02:50

Re: スニペットのパラメータにDittoのプレイスホルダを使うと変!?

投稿記事 by yama »

kazuike さんが書きました: もしかして、「$modx->evalSnippets()」を使ったら、
スニペットのパラメータにスニペットコールを入れて、
スニペットからスニペットを呼び出すなんてことも可能だったりします?
(括弧とパラメータの指定はエンコード→デコードしないといけないかもしれませんが)
できますね。
[!hoge?param=[[fuga?v=test]]!] みたいな書き方でよければ現状でも使えると思いますが、すっきりしない内部処理をやってるのでいずれ改善を提案したいです。
Revoみたいにすればパラメータ名のほうにスニペットコールを使ったりとかもできそうです
返信する