ページ 11

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

Posted: 2011年8月13日(土) 21:31
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

根本的に使い方が間違っているとか?
ヒントでも、思いつきでも、なんでもかまいません。
なにとぞご教授のほど、お願いします。

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

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

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

Posted: 2011年8月14日(日) 21:15
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"」になりますが…

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

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

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

Dittoの結果を他のスニペットに渡す、何か良い方法ないでしょうか?

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

Posted: 2011年8月14日(日) 22:41
by yama
http://photozou.jp/photo/photo_only/280550/93724982
デモサイト(http://demo.modx.jp/)で試してみましたが、こちらでは値を受け取ることができました

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

Posted: 2011年8月15日(月) 13:45
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」が出ているってことないですか?

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

Posted: 2011年8月15日(月) 14:16
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()は意味ないですね、、

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

Posted: 2011年8月15日(月) 16:14
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()」を使ったら、
スニペットのパラメータにスニペットコールを入れて、
スニペットからスニペットを呼び出すなんてことも可能だったりします?
(括弧とパラメータの指定はエンコード→デコードしないといけないかもしれませんが)

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

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