We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 15497
    • 117 Posts
    先ほど、ふと疑問に思ったのですが、

    1ページの中に、同じスニペット(パラメータまで同じもの)を2回以上指定しても、
    1回目の結果が全てにコピーされてしまいますよね。([!~!] であっても)

    ソース(/manager/includes/document.parser.class.inc.php)を見ると、
    outputContentメソッドで、[! と !] を [[ と ]] に置換しておいて、
    evalSnippetsメソッドの最後の部分で、
    スニペットの出力結果で、[[~]] を、ページ全体にわたって置換しています。
    つまり、1回目のスニペットの処理で、2回目以降のタグも一緒に置換されてしまいます。
    その結果、2回目以降のスニペットの処理結果はどこにも出てきません。
    (2回目以降のスニペットも、実行はしているようですが)

    これって、MODxの仕様なのでしょうか?
    それとも、バグなのでしょうか? huh

    チャンクなら静的なものですので、わかるのですが、
    スニペットは、少なくとも[!~!]は、毎回処理して欲しいと思うのですが、どうでしょう?

    余談ですが、
    [[~]]って、本当にキャッシュされているのでしょうか?
    ちょっとソース見ただけなので、見落としているのかもしれませんが、
    [!~!]と同じ処理を行なっているように見えたもので…
    ご存知の方、いらっしゃったら教えていただけるとありがたいです。

    ちなみに、この件のきっかけは、以下のトピックからです。 smiley
    ■テンプレート変数の入力有無等で表示を切り替えるスニペット: StartIf & EndIf
    http://modxcms.com/forums/index.php/topic,20716.0.html
      ★日本公式フォーラム2009年9月1日本格始動!★
      http://modxcms-jp.com/bb/

      ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
      http://d.hatena.ne.jp/hikidas_ikeda/
      ▼制作済みHTMLページをmodxで更新するデモ
      http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
      • 15497
      • 117 Posts
      もし、ソースに手を入れるとしたら、

      最も簡単な方法としては、
      /manager/includes/document.parser.class.inc.phpの以下の箇所(0.9.6.1の場合862行目/0.9.6の場合859行目)
      $documentSource= str_replace("[[" . $snippetName . $currentSnippetParams . "]]", $executedSnippets[$i], $documentSource);

      を、strpos と strlen をからめて substr_replace で置換するという方法が考えられますね。

      ただし、この方法だと、
      もしも、同じようなスニペットタグを出力するようなスニペットがあったとしたら、置換場所がずれてしまいます。

      これを厳密にやろうと思えば、以下のループの箇所(0.9.6.1の場合785行目~/0.9.6の場合782行目~)
              preg_match_all('~\[\[(.*?)\]\]~', $documentSource, $matches);
      
              $etomite= & $this;
      
              if ($matchCount= count($matches[1])) {
                  for ($i= 0; $i < $matchCount; $i++) {
      

      で、preg_match_all を使わず、preg_match を offset をとりながらループして、このoffsetをそれぞれのスニペット分記録しておき、
      前述の箇所で substr_replace を使って、offsetを補正した位置で置換するという方法が考えられますね。
      (置換前のスニペットタグの長さと置換後の長さとの差分を順次足しこんでおき、この差分でoffset を補正します)

      ま、思いつきなんで、もっと良い方法があるかもしれませんが…
        ★日本公式フォーラム2009年9月1日本格始動!★
        http://modxcms-jp.com/bb/

        ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
        http://d.hatena.ne.jp/hikidas_ikeda/
        ▼制作済みHTMLページをmodxで更新するデモ
        http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php
        • 27086
        • 37 Posts
        こんにちは。
        たまたま記事を目にして、検証もソースも見ることもなしに脊髄反射しちゃいますが、以下の方法はどうなるでしょうか?(あとで自分でも試してみますが・・・)。

        ★ダミーのパラメータを付加する。

        例えば、[[snippet]]とするだけで使用できるスニペットを
        [!snippet?&dummyid=`hoge`!]
        [!snippet?&dummyid=`fuga`!]
        などとするとか・・・dittoは&idというパラメータがあって、それをしっかり利用しますが、document.parser.class.inc.phpでの出力時に
        "[[" . $snippetName . $currentSnippetParams . "]]
        を見つけて置換しているだけならば、上の方法で逃げられるような気もします。どうでしょうか?
          • 15497
          • 117 Posts
          検証というほどではないですが、以下の記事のReply書くときに、ざっとですがテストしてみました。
          ダミーパラメータを入れる方法は使えると思っています。 smiley

          ■テンプレート変数の入力有無等で表示を切り替えるスニペット: StartIf & EndIf
          http://modxcms.com/forums/index.php/topic,20716.msg128291.html#msg128291
            ★日本公式フォーラム2009年9月1日本格始動!★
            http://modxcms-jp.com/bb/

            ▼ウェブ屋のCMS→modxヒキダス流(備忘録)
            http://d.hatena.ne.jp/hikidas_ikeda/
            ▼制作済みHTMLページをmodxで更新するデモ
            http://www.hikidas.com/hikidas/modx_document/modx_demo_osc2009kansai.php