プレースホルダの中の文字列に閉じカッコ 「)」 が入っていた場合、そこでPhxのモディファイアが終わってしまう  【解決済み】

質問全般・改善要望
teruringo
メンバー
メンバー
記事: 16
登録日時: 2014年8月12日(火) 14:54

プレースホルダの中の文字列に閉じカッコ 「)」 が入っていた場合、そこでPhxのモディファイアが終わってしまう

投稿記事by teruringo » 2015年9月23日(水) 16:25

コード: 全て選択

[*hogehoge:ifnotempty(<div>[*hogehoge*]</div>)*]

っていうような感じの書き方をしたんですが、
hogehogeの中に閉じカッコが入っているとそこで終わってしまうらしく、表示がバグってしまいました。

githubにも書き込みましたが一応こちらにも。

とりあえず、閉じカッコをhtmlエンティティ化して一時的には回避しましたが、根本的には何か解決できるんだろうなと思って報告しました!
よろしくお願いします!
アバター
yama
管理人
記事: 3077
登録日時: 2009年7月29日(水) 02:50

Re: プレースホルダの中の文字列に閉じカッコ 「)」 が入っていた場合、そこでPhxのモディファイアが終わってしまう

投稿記事by yama » 2015年9月23日(水) 21:21

manager/includes/document.parser.inc.phpの中に_getTagsFromContent()という関数があります。この関数の中の

コード: 全て選択

foreach($tags as $tag) {

上記のforeachブロックをブロックごと削除して確認してみてください。これで問題なく動作する場合はオプションの追加など検討してみます
aki
メンバー
メンバー
記事: 56
登録日時: 2013年1月23日(水) 20:59

Re: プレースホルダの中の文字列に閉じカッコ 「)」 が入っていた場合、そこでPhxのモディファイアが終わってしまう

投稿記事by aki » 2015年10月28日(水) 16:37

同様の問題があったので、こちらのトピックをお借りします。

ほぼ同じケースで、以下のような書き方をしています。

コード: 全て選択

[+longtitle:eq():
then(<li>[+parent:pagetitle+] - [+content+]</li>):
else(<li>[+parent:pagetitle+] - <a href="[~[+id+]~]">[+longtitle+]</a></li>)+]

longtitleが入っているかどうかで表示内容を分岐させる使い方をしているのですが、
この時、content部分に半角の閉じカッコが入っていると、そこで表示が終わってしまいます。
もしくは、longtitleが入力されていて、contentに閉じカッコが入っている場合は、else以下が何も表示されません。
※contentに閉じカッコが含まれていなければ、else以下の分岐も意図したとおりに表示されます。
※Dittoを使用しており、そのテンプレートなので変数をくくる記号は「+」になっています。

こちらのyamaさんのご返信を読んで、manager/includes/document.parser.class.inc から

コード: 全て選択

foreach($tags as $tag) {
   if(strpos($tag,$left)!==false) {
      $innerTags = $this->_getTagsFromContent($tag,$left,$right);
      $tags = array_merge($innerTags,$tags);
   }
}

上記の部分を丸ごと削除してアップしなおしたのですが、他にも内部PHxを使った書き方を使用しているところがあるためか、
全体的に表示がおかしくなってしまいました。

いろいろ崩れてしまったので、着目する部分が的外れかもしれませんが気付いたことを書きます。

1. 最初に挙げた分岐部分の表示は、longtitleが空ではない場合のみしか表示されなくなった。
半角の「)」が含まれていても表示されますが、else以下に該当するパターンのものしか出てこなくなりました。

2. [*変数@ID*]の書き方で表示している部分が表示されたり、されなかったりする。
トップページは正常に値が出ているのですが、他のページは[*変数@ID*]という記述が出てきます。
※この記述は全ページに共通で出すパーツにしか使用しておらず、分岐などはないのでなぜページによって違うか謎です。

3. 他のPHxで書いた部分に影響が出ている?

コード: 全て選択

[*parent:eq(0):then([*longtitle:ifempty([*pagetitle*])*]):else([[UltimateParent:pagetitle]])*]

例えば、ページのカテゴリタイトルなどをこのように書いているのですが、
1階層目(親が0)のページでは、「[*longtitle:ifempty([*pagetitle*]」という表示が出ています。
親が0にはならない、2階層目以降のページはelse以降が正常に判定されているみたいで、pagetitleの中身が表示されます。
※症状としては、1と同じです。半角カッコを含むかどうかは関係ないですが。


コンテンツでは半角カッコを使わないようにすれば問題はないので、今のところはそのルールで運用しています。
動作チェックが何かのお役に立てればと思い、ご報告いたします。(そもそも削除ブロックが間違ってたりしたらすみません…)
masco
メンバー
メンバー
記事: 123
登録日時: 2014年9月26日(金) 10:43

Re: プレースホルダの中の文字列に閉じカッコ 「)」 が入っていた場合、そこでPhxのモディファイアが終わってしまう

投稿記事by masco » 2015年10月28日(水) 21:19

aki さま

aki さんが書きました:同様の問題があったので、こちらのトピックをお借りします。

コード: 全て選択

[+longtitle:eq():
then(<li>[+parent:pagetitle+] - [+content+]</li>):
else(<li>[+parent:pagetitle+] - <a href="[~[+id+]~]">[+longtitle+]</a></li>)+]

longtitleが入っているかどうかで表示内容を分岐させる使い方をしているのですが、
この時、content部分に半角の閉じカッコが入っていると、そこで表示が終わってしまいます。
もしくは、longtitleが入力されていて、contentに閉じカッコが入っている場合は、else以下が何も表示されません。


コードのことはよく分かりませんが、
変数内に「)」がある場合はクオートを使うと回避できると思います。

コード: 全て選択

[+longtitle:eq():then(`<li>[+parent:pagetitle+] - [+content+]</li>`):else(`<li>[+parent:pagetitle+] - <a href="[~[+id+]~]">[+longtitle+]</a></li>`)+]

同様に直接記述した場合も記述内容に「:」が入ると切れるので下記のようにしてあげます。

コード: 全て選択

[+@`example:example2`:find(`example`):then(`<li>[+parent:pagetitle+] - [+content+]</li>`):else(`<li>[+parent:pagetitle+] - <a href="[~[+id+]~]">[+longtitle+]</a></li>`)+]


クォートは「`」「"」「'」の3種類が使えるのでDittoや入れ子などで不都合がある場合は組み合わせてみると改善されるかもしれません。
aki
メンバー
メンバー
記事: 56
登録日時: 2013年1月23日(水) 20:59

Re: プレースホルダの中の文字列に閉じカッコ 「)」 が入っていた場合、そこでPhxのモディファイアが終わってしまう  【解決済み】

投稿記事by aki » 2015年10月29日(木) 22:04

mascoさん、ご助言ありがとうございます!
manager/includes/document.parser.class.inc から削除した部分は元に戻し、
条件分岐を使ったところは、クォートでカッコ内をくくることで現象を回避できました。
ありがとうございました :)