DittoのPHxでプレースホルダが使えない件  【解決済み】

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

DittoのPHxでプレースホルダが使えない件  【解決済み】

投稿記事by kazuike » 2014年6月19日(木) 16:30

-----
MODXのバージョン:1.0.13J-r1
PHPのバージョン:5.3.28
-----

その昔は、Dittoの出力パターンの中で、

コード: 全て選択

[+flag:is=`1`:then=`[+text_a+]`:else=`[+text_b+]`+]
のように、
PHxの中でも、プレースホルダが自由に使えたように思いますが、
最近(と言ってもけっこう経ちますが)は、これが使えたり、使えなかったりします。
参考)http://forum.modx.jp/viewtopic.php?f=7&t=1215

今までは、なんとかサイトの仕様を決める段階で、このようなプレースホルダの切替を使わないように回避できていたのですが、
今現在、どうにもこのような切替を使わないと表現できないという、窮地に追い込まれています。

出力パターンの中で使用するプレースホルダについては、
PHxのカスタムモディファイアの中で「$this->placeholders」が使えるということが分かりましたので、
以下のようなPHxのカスタムモディファイアを作って急場をしのぎました。

コード: 全て選択

if ($this->placeholders['flag']=='1') {
   $output = $this->placeholders['text_a'];
} else {
   $output = $this->placeholders['text_b'];
}
return $output;

ただし、このやり方だと、実際には表示しないようなプレースホルダも、Dittoの出力パターンに含める必要があり、

コード: 全て選択

<span style="display:none;">[+text_a+][+text_b+]</span>
のようにして、
無理やりブラウザの画面上には出ないようにしていますが、
HTMLソースから見れる状態になってしまっています。

何かこれに代わる良い方法がありましたら、ご教示いただけませんでしょうか?
ちょっとしたヒントでも構いません。よろしくお願いいたします。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
アバター
yama
管理人
記事: 2908
登録日時: 2009年7月29日(水) 02:50

Re: DittoのPHxでプレースホルダが使えない件

投稿記事by yama » 2014年6月19日(木) 18:05

http://mng.demo.modx.jp/
サンプルを作っていただくことはできますか?Ditto内蔵のPHxをなんとかするのは難しいですが、コアの機能をうまく利用できそうであれば試してみます。
kazuike
メンバー
メンバー
記事: 457
登録日時: 2009年8月12日(水) 12:53

Re: DittoのPHxでプレースホルダが使えない件

投稿記事by kazuike » 2014年6月19日(木) 22:54

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

とりあえず、サンプルを作りました。
http://140619223906-5296.evo.demo.modx.jp/manager/

「プレースホルダを直接使用」と「PHxカスタムモディファイアを使用」の両方でリストを出しています。
http://140619223906-5296.evo.demo.modx.jp/news/

よろしくお願いいたします。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
kazuike
メンバー
メンバー
記事: 457
登録日時: 2009年8月12日(水) 12:53

Re: DittoのPHxでプレースホルダが使えない件

投稿記事by kazuike » 2014年6月19日(木) 23:07

念のためソース貼っておきます。

▼スニペット(PHxカスタムモディファイア)「phx:switch_text」

コード: 全て選択

<?php
if ($this->placeholders['flag']=='1') {
   $output = $this->placeholders['text_a'];
} else {
   $output = $this->placeholders['text_b'];
}
return $output;
?>


▼Dittoの部分

コード: 全て選択

<h3>プレースホルダを直接使用</h3>
<table>
[[Ditto?
  &orderBy = createdon DESC
  &tpl = '@CODE:
    <tr>
    <td class="date">[+createdon:date=`%Y年%-m月%-d日`+]</td>
    <td><span class="keyword">[+flag:is=`1`:then=`[+text_a+]`:else=`[+text_b+]`+]</span>
    <a href="[~[+id+]~]">[+title+]</a></td>
    </tr>
' // 表示パターン
]]
</table>

<h3>PHxカスタムモディファイアを使用</h3>
<table>
[[Ditto?
  &orderBy = createdon DESC
  &tpl = '@CODE:
    <tr>
    <td class="date">[+createdon:date=`%Y年%-m月%-d日`+]</td>
    <td><span class="keyword">[+flag:switch_text+]</span>
    <span style="display:none;">[+text_a+][+text_b+]</span>
    <a href="[~[+id+]~]">[+title+]</a></td>
    </tr>
' // 表示パターン
]]
</table>


▼データの内容

1件目
flag='1',text_a='フラグがONなので正解',text_b='フラグがONなので不正解'

2件目
flag='0',text_a='フラグがOFFなので不正解',text_b='フラグがOFFなので正解'

▼出力結果

コード: 全て選択

<h3>プレースホルダを直接使用</h3>
<table>

    <tr>
    <td class="date">2011年3月19日</td>
    <td><span class="keyword">`:else=`フラグがONなので不正解`+]</span>
    <a href="news/newservice.html">新サービスのお知らせ</a></td>
    </tr>

    <tr>
    <td class="date">2011年3月10日</td>
    <td><span class="keyword">`:else=`フラグがOFFなので正解`+]</span>
    <a href="news/begin.html">サイトをオープンしました。</a></td>
    </tr>

</table>

<h3>PHxカスタムモディファイアを使用</h3>
<table>

    <tr>
    <td class="date">2011年3月19日</td>
    <td><span class="keyword">フラグがONなので正解</span>
    <span style="display:none;">フラグがONなので正解フラグがONなので不正解</span>
    <a href="news/newservice.html">新サービスのお知らせ</a></td>
    </tr>

    <tr>
    <td class="date">2011年3月10日</td>
    <td><span class="keyword">フラグがOFFなので正解</span>
    <span style="display:none;">フラグがOFFなので不正解フラグがOFFなので正解</span>
    <a href="news/begin.html">サイトをオープンしました。</a></td>
    </tr>

</table>
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/
アバター
yama
管理人
記事: 2908
登録日時: 2009年7月29日(水) 02:50

Re: DittoのPHxでプレースホルダが使えない件

投稿記事by yama » 2014年6月21日(土) 10:31

サンプルありがとうございます、だいたい把握できました。
https://github.com/modxcms-jp/evolution ... hp#L86-L87
ここの正規表現にバグがあるみたいです。だとすると、だいぶ昔からです。(本家版も同じ)
$modx->getTagsFromContent()関数を使うほうが確実かも?のちほど試してみます
アバター
yama
管理人
記事: 2908
登録日時: 2009年7月29日(水) 02:50

Re: DittoのPHxでプレースホルダが使えない件

投稿記事by yama » 2014年6月21日(土) 11:04

https://github.com/modxcms-jp/evolution ... d0d799a80c
これでたぶん大丈夫。どうでしょう?
kazuike
メンバー
メンバー
記事: 457
登録日時: 2009年8月12日(水) 12:53

Re: DittoのPHxでプレースホルダが使えない件

投稿記事by kazuike » 2014年6月21日(土) 14:43

ありがとうございます。

DittoのPHxでプレースホルダを使えました。
▼ウェブ屋のCMS→modxヒキダス流(備忘録)
http://d.hatena.ne.jp/hikidas_ikeda/