ページ 11

スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月02日(火) 10:57
by kazh
お世話になっております。
PHxのthen:elseをログイン情報などユーザ固有値に基づいて使用することがあり、
この場合、キャッシュさせないため、[! !]で書いていたりするのですが、

[!スニペット:is=`1`:then=`1`:else=`2`!]
[!スニペット:is=`1`:then=`?1`:else=`2`!]
↑パラメータに?が含まれると動作しないようです。

スニペット記法のパースのせいですかね。
then:elseの中身はリンクURLだったりすることが多いので、`index.php?id=1`みたいなものが書けなくて困ってしまいました。
出力結果を見ると、?の前までしか出力されない(前行の例だとindex.phpまで)ようです。
これを回避する手段が、何かありますでしょうか。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月18日(木) 14:19
by yama
document.parser.class.inc.zip
(28.95 KiB) ダウンロード数: 455 回
お待たせしました。添付のファイルを解凍してmanager/includes/ディレクトリに上書きしてみてください

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月19日(金) 14:34
by iwa
すみません。よこから失礼します。

私も kazh さんと同様な状況でして、便乗させてください。

yama さんからいただいたソースを適用したのですが、正しく動作しないところも発生したためご相談です。

以下のように スニペットのパラメータをスニペットで生成している場合に、echo_id スニペットが動作しないようです。

[!Ditto?&tpl=`@CODE:[+id+],`&id=`id1`&documents=[!echo_id?&id=`8`!]!]

以下にテストサイトを作成しました。
(とはいえ、パッチが当たっていないので、問題なく動作します。パッチをあてたら動作しないと思います。)

http://150619142146-19507.evo.demo.modx.jp/manager/

もし、スニペットの呼び出しが誤っていたらごめんなさい。

> 1816 if($pos['?'] !== false && $pos['?']<$pos[':'])

を元に戻すと、 ? は利用できませんが、他は大丈夫でした。
込み入った部分なので、手出しができなく、ご報告のみとなります。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月19日(金) 14:36
by yama

コード: 全て選択

if($pos['?'] !== false && ($pos[':']===false || $pos['?']<$pos[':']))
その部分をこのように書き換えてみてください

http://150619142146-19507.evo.demo.modx.jp/1.html
サンプルのほうも変更しました

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月19日(金) 14:52
by iwa
yama 様

早速対応いただき、ありがとうございます。

適用をしてみました。

提示させていただいた、サンプルは改善しなかったのですが、同様な処理を行っている内部のサイトでは改善したかもしれません。

サンプルが改善しなかったのが気になります。。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月19日(金) 14:53
by iwa
> 提示させていただいた、サンプルは改善しなかったのですが、

サンプルサイトは治ってますね。あとは私の手元サイト。。

手元サイトは、見直すと、
1809 $pos[':'] = strpos($call, ':');
が抜けてました。
問題なく動作しました。

ありがとうございます!

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月19日(金) 15:00
by yama
ifの前に $pos[':'] = strpos($call, ':'); を追記する必要があります

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月19日(金) 16:18
by iwa
yama 様

五月雨になってすみません。

最後にお教えいただいたパッチでも、以下の処理が NG になってしまいます。

コード: 全て選択

<!--@IF [!echo_id:is(`1`):or:is(`2`)?id=`1`!]-->
しん!
<!--@ELSE-->
ぎ!
<!--@ENDIF-->
<!--@IF [!echo_id:is(`1`):or:is(`2`)?id=`3`!]-->
しん!
<!--@ELSE-->
ぎ!
<!--@ENDIF-->
先ほどのサイトに環境を作りました。本来であれば「しん」「ぎ」と表示されなければならないのですが「ぎ」「ぎ」になってしまいます。
パッチを元に戻すと問題ありません。

http://150619142146-19507.evo.demo.modx.jp/manager/

2.html です。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月23日(火) 15:46
by yama
お返事が遅くなりましたが、土曜日の時点でこの件確認しました。当トピック自体の問題があることが分かったので(※想定以上に精密なパース処理が必要になる)、いったん元の状態に戻した上で対症療法的な方法を提案させてもらうことになると思います。また改めて連絡いたします。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月23日(火) 16:11
by iwa
yama 様

ご返事、ご検討いただきありがとうございます。

引き続きよろしくお願いします

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月29日(月) 09:19
by yama
document.parser.class.inc.zip
(29.1 KiB) ダウンロード数: 454 回
お待たせしました。添付のパッチを上書きしてみてください。

コード: 全て選択

[[スニペット:is=`1`:then=`?1`:else=`2`]]
上記の記述は

コード: 全て選択

[[スニペット:is(1):then(?1):else(2)]]
このように、カッコを用いた新記法に書き換える必要があります。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月29日(月) 11:26
by iwa
yama 様

ありがとうございます。

提示させていただいた処理については動作しているようですが、基本的な動作に疑問が残りました。

echo_id スニペットを作成し

コード: 全て選択

echo $id;
参照したのですが、 false になってしまいます。

コード: 全て選択

[!echo_id:is=(1):then=(true):else=(false)?id=1!]
記述に誤りがあるかもしれません。

確認サイトをお知らせします。

http://150629110830-13791.evo.demo.modx.jp/manager/

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月29日(月) 13:29
by masco
iwaさま

すみません、横からですが。。。

コード: 全て選択

[!echo_id:is=(1):then=(true):else=(false)?id=1!]

コード: 全て選択

[!echo_id:is(1):then(true):else(false)?id=1!]
に変更してみたらどうなりますか?新しい記法に=は必要なくなりました。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`

Posted: 2015年6月29日(月) 13:47
by iwa
masco 様

ありがとうございます。

ご指摘いただいた内容で解決しました。

Re: スニペット記法+内蔵PHx出力のモディファイア内での`?`  【解決済み】

Posted: 2015年7月30日(木) 15:30
by kazh
yama様

亀レスになってしまい申し訳ございません。
ご対応ありがとうございました。