We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 15611
    • 19 Posts
    お世話になっております。kenと申します。

    この度、procatというテンプレート変数を作成し(チェックボックス式)、その結果にあわせて、適当なチャンクを呼び出したいと思っております。

    具体的には、Aだけを選んだときは、[*procat*]には、Aが入るので、PHxなりでAの場合は、このチャンクというようなことができるわけですが、チェックボックス式であるため、複数選ぶとカンマ区切りとなりイコールだけでは対処できなく、複数チェックされていても、それに対応したチャンクを返したく思っております。
    例えば、A, Cと返ってきた場合には、チャンクAとチャンクCを返すようなことをしたいのです。

    正規表現などで、[*procat*]にはAが「含まれる」ということができればよいのですが、http://wiki.modxcms.com/index.php/PHx#More_examplesこちらのwikiを拝見しても、含まれるということは判断できなさそうでつまづいております。

    dittoも考えたのですが、指定できるのが親のドキュメントでしょうから、一つのドキュメント内で完結させることはできないのかなと思っています。

    あとは、http://modxcms.com/forums/index.php/topic,15077.0.htmlこちらにあるようにスニペットに渡して、カンマ区切りを分解して、ループなどで対応なのかなぁと思っているのですが、すでにこのようなことができる方法などがあればご教授いただきたく思います。

    なかなかうまく解決できず申し訳ありませんが、何か分かる方がいらっしゃいましたら、ご返信のほどお願いします。
      • 5118
      • 14 Posts
      こんにちわ。Chobiです。

      具体的には、Aだけを選んだときは、[*procat*]には、Aが入るので、PHxなりでAの場合は、このチャンクというようなことができるわけですが、チェックボックス式であるため、複数選ぶとカンマ区切りとなりイコールだけでは対処できなく、複数チェックされていても、それに対応したチャンクを返したく思っております。
      例えば、A, Cと返ってきた場合には、チャンクAとチャンクCを返すようなことをしたいのです。

      PHxとかはよくわかってないのでスニペットで ^^;
      テンプレート変数にはカンマ区切りで複数渡されるとのことなので、
      スニペット側でカンマをデリミタとしてsplitすれば変数の切り分けとチャンクの連続はできるかと思います。

      あまり参考にはならないかもしれませんが、適当なコードを。
      $chanks = "";
      $val = split(",",$procat);
      foreach($val as $a){
         if($a = 'A'){
             $chanks .= "{{a}}";
         }elseif($a = 'B'){
             $chanks .="{{b}}";
         }.........
      }
      


      みたいな処理で何とかなりそうな匂いはします。
      (ごめんなさい試したりはしてないのでかなり無責任です。)

      切り分け・比較するチャンクの数が多くなる場合は配列作ってループでぶん回して比較してしまう方が簡単かも。
      (っていうか配列で比較する方がスマートだな・・・)

      大外ししてたらごめんなさい。
        • 27086
        • 37 Posts
        ken さん、こんにちは。shobuです。

        phxではphx:hogehogeという名前を付けたスニペットを用意すると、phxの記述内で、例えば [*procat:hogehoge=`fugafuga`:eg=`0`:then=`yes`:else=`no`*] というような形で自作関数を利用できます(Custom modifiers)。
        http://wiki.modxcms.com/index.php/PHx#Custom_modifiers

        このスニペット内でstrposなどを利用して、返値で判定してあげれば良いと思います。
        <?php
        return strpos($output, $options);
        ?>
        
          • 15611
          • 19 Posts
          Chobi様、shobu様有り難うございます。

          先に結果からご報告しますと、shobu様の方法で無事解決いたしました。
          スニペットを呼びだして、戻り値で判別とは思いつきませんでした。
          便利ですね。

          実際のコードですが、
          [*procat:snippetname=`Cat1`:eg=`0`:then=`{{chunk1}}`:else=``*]
          [*procat:snippetname=`Cat2`:eg=`0`:then=`{{chunk2}}`:else=``*]
          [*procat:snippetname=`Cat3`:eg=`0`:then=`{{chunk3}}`:else=``*]
          ・・・


          といった具合で、strposで戻り値を返すスニペットを呼び、対応したチャンクを呼び出すことに成功しました。有り難うございました。

          Chobi様の方法も試みたのですが、どうもreturnで値をうまくひきだせなかったので、上の方法でやらせていただきました。

          こうやって色々拡張できるのもmodxの素晴らしいところですね。まだまだうまく使いこなせていないですが、少しずつでも身につけていきたいと思います。

          この度は有り難うございました。
            • 5118
            • 14 Posts
            Chobiです。

            うまく言って何よりです。


            私の方法ではPHxを使わず、テンプレート変数を直接評価してチャンクを返す仕組みなのでいい結果が得られなかったのかも知れませんね。

            PHx使うと確かに便利そうです。私自身、PHxってのを知らなかったので逆に勉強になりました。m(_ _)m
              • 15611
              • 19 Posts
              あんな短い処理でできてしまったので、便利だなぁと思いました。

              PHxになくても、PHPに適当な関数があればそれを利用できるので、拡張しやすいですよね。
              先ほどの処理のような詳しいやり方がまだちゃんと整理し切れていないですが、色々できるようになると本当に便利なスニペットになりそうです smiley

              また何かありましたら、お世話になるかもしれません。
              その際はご迷惑おかけしますが、宜しくお願いします。
                • 27086
                • 37 Posts
                shobuです。

                phxがわかるようになると結構複雑な処理もphxに任せられるようになるのでついつい多用してしまうのですが、あまり多用しすぎるとレスポンスに影響することもあります。
                あまりにも便利なのでphxの処理結果に、さらにphxを入れて・・・なんてことをするわけですが。。。
                テンプレートでもphxが使えますが、ドキュメントIDやテンプレートIDによって動作を分ける処理では、<?php ?>内 でmodx apiを使って書いた方が遙かにレスポンスが良いです。
                  • 15611
                  • 19 Posts
                  テンプレートでもphxが使えますが、ドキュメントIDやテンプレートIDによって動作を分ける処理では、<?php ?>内 でmodx apiを使って書いた方が遙かにレスポンスが良いです。
                  modx apiに関しては全然分かりませんね。PHxのドキュメントの最後のほうにも少し書いてありましたが、理解を深めれば、より柔軟なものが作れるでしょうね。それまでにはほど遠い感じがしますが、modxは非常に面白いCMSですので、頑張って使いこなしたいと思います。
                    • 27086
                    • 37 Posts
                    shobuです。

                    MODx APIで・・・といっても複雑なことはしてません。

                    例えばテンプレートに特定ドキュメントでのみ実行したい内容を入れ込むときに
                    [*id:eq=`2`:then=`hoge`*]

                    としていたのですが、レスポンスが悪くなったので

                    テンプレートの先頭で
                    <?php $docid = $modx->documentObject['id']; ?>

                    としてdocidを取得して、それを元にphpのifやselectで分岐させるようにしたらレスポンスが大きく改善されることがありました。

                    先の投稿ではPHxベースの方法を紹介しましたが、場合によってはスニペットやphpの直接コーディングで専用ルーチンを用意してあげた方がよい場合もあるかな、ということです。特にアクセス数の多いサイトだと考慮する必要があると思います。
                    参考になれば幸いです。
                      • 15611
                      • 19 Posts
                      <?php $docid = $modx->documentObject['id']; ?>

                      こうやってスニペットを利用するのですね。確かにすでにそうしたほうがよさそうな状況に陥っています。

                      マルチセレクトのリストボックスの値をPHxで受けとり、乱数を発生させて、そのどれかを表示させると言うようなことをさきほど作っていたのですが、その値をもとにさらにselectで何かをしたい場合にどんどん処理が長くなって非常に冗長な処理をしてしまっています。

                      selectも数が少なければよいのですが、40、50ともなると、うまく配列を使ったほうが賢そうなんですが、乱数を発生させて配列から受け取り、さらにそれをキーとして配列から受け取るというのもちょっと無駄かなと思いました。

                      また、画像用、リンク用、TV用という風に、三つPHxを実行してしまうと、それぞれ違った乱数で返ってくることが分かったので、これはマルチセレクトの値をスニペットに渡して、返された乱数を一つの変数に入れるなどしないと大変なことになるなと思いました。

                      もうちょっとスニペットの使い方を覚えないとダメですが、PHPですので、値を渡して、その処理さえちゃんと理解すればなんとかなるのかなとも。
                      拡張性が高い分、色々覚えないとダメですね。