We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 32535
    • 58 Posts
    年に数回行われる講演会の、サイトを作ろうと考えているのですが、
    「講演会を開催した年」、「場所」、「主催者名」、などの条件でページの一覧を出力するように
    するには、Dittoを使えば実現できるのでしょうか?

    どなたかお分かりになる方がおられましたらご教授下さい。


      • 26012
      • 324 Posts
      wispさんはじめまして。

      ご質問の件、可能だと思います。
      まずは下記のサンプルサイトをご覧ください(MODx V0.9.6.3で作りました)。
      http://mx.quickart.jp/na/searchitem.html
      このサイトの商品一覧はDittoを使って作り出してます。商品を講演会に置き換えて考えてみてください。
      細かい部分までは説明できませんが概ね以下のような感じで実現できそうです。ポイントはテンプレート変数の活用です。

      1.制作手順

       (1) テンプレート変数に「講演会開催日」、「場所」、「主催者名」を定義 (作成した変数を講演会ページ用テンプレートに適用)
       (2) 講演会ページを置くためのフォルダページを作る
       (3) (2)の配下にそれぞれの講演会ページを作り、「講演会開催日」、「場所」、「主催者名」に値を設定
       (4) 講演会一覧ページからDittoを呼び出す

      2.Ditto呼び出しのヒント

       [1] parents(親ドキュメント) : (2)を基点とする
       [2] tpl(行編集) : 行テンプレートから「講演会開催日」、「場所」、「主催者名」などのテンプレート変数を一覧に整形出力
       [3] pagenate(改ページオプション)/display(出力数) : 1ページに表示する講演会の行数を指定して出力
       [4] sortBy/sortDir(並び順) : 各講演会ページの創作日や編集日、講演会開催日などを降順で指定することで新しいもの順に出力
       [5] filter(絞込み) : 「講演会開催日」、「場所」、「主催者名」などで絞り込んで表示する場合はDittoのfilterオプションを使う

      3.アーカイブ

       ブログのようにそれぞれの講演会ページを年単位にまとめ上げてサイドバーなどにメニューを作る場合はreflect連携を使用

      4.その他

       Dittoの構文規則や使い方など、細かい事項は各種リソース解説サイト(MEGUさんのサイトなど)をご覧ください。

      お役に立てば幸いです。
        • 32535
        • 58 Posts
        丁寧なご説明ありがとうございました。
        非常にわかりやすかったです。

        実際に試してみてリフレクトの機能で少し悩んでいます。
        「講演会開催日」のテンプレート変数には、2008,11,9や2007,febなどと入力していく予定なのですが、
        そのような文字列を、自動的に開催年ごとに分類することは可能なのでしょうか?
        やはり、各記事を「作成」または「編集」した日付を基準に、年単位のアーカイブを作成するかたちになってしまうのでしょうか。

        もしできるのであれば、テンプレート変数に入力する、日付のフォーマットは「西暦,月(数字),日付(数字)」のように
        固定したほうが良いのでしょうか?
        初歩的な質問で申し訳ありませんがご教授お願いいたします。

          • 26012
          • 324 Posts
          カンマ区切りにしたい理由が分かりませんが、年と月のデータ(入力)を分離し、reflectで年だけを対象にアーカイブ出力させるのでよければ、以下のような手はどうでしょう。(ぱっと考えた案なのでもっとスマートな方法がきっとあると思います。コードはサクっと作ったのでバグがあるかもしれません。)

          1.テンプレート変数

           1.1 開催年(holdingYear)
            入力タイプ : DropDown List Menu
            入力時のオプション値 : @EVAL return $modx->runSnippet(’makeYearList’);

           1.2 開催月(holdingMonth)
            入力タイプ : DropDown List Menu
            入力時のオプション値 : @EVAL return $modx->runSnippet(’makeMonthList’);

          2.スニペット

           2.1 makeYearList
            スニペット名 : makeYearList  ※ご随意に
            説明 : 年(西暦)の選択リストを出力(値はタイムスタンプ)
            コード :
          /* -- usage --
           * [[makeYearList? &start=`2008` &end=`2020`]]
           * start : 開始年
           * end : 終了年
           */
          ( isset($start) ) ? $start: $start=date("Y") ;  // 開始年の規定値:今年
          ( isset($end) ) ? $end: $end=date("Y")+20-1 ;  // 終了年の規定値:20年後
          $rtnstr = '' ;
          for ($y = $start; $y <= $end; $y++) {
            if (strlen($rtnstr)!=0) {
              $rtnstr .= '||' ;
            }
            $rtnstr .= $y . '年' . '==' . mktime(0,0,0,1,1,$y) ;
          }
          unset($start, $end, $y) ;
          return $rtnstr ;
          

           出力サンプル : [[makeYearList? &start=`2008` &end=`2020`]] の場合は・・・
           2008年==1199113200||2009年==1230735600||2010年==1262271600||2011 年==1293807600||2012年==1325343600||2013年==1356966000||2014 年==1388502000||2015年==1420038000||2016年==1451574000||2017 年==1483196400||2018年==1514732400||2019年==1546268400||2020年==1577804400

           2.2 makeMonthList
            スニペット名 : makeMonthList  ※ご随意に
            説明 : 月の選択リストを出力
            コード :
          /* -- usage --
           * [[makeMonthList? &start=`1` &end=`12`]]
           * start : 開始月
           * end : 終了月
           */
          ( isset($start) ) ? $start: $start=1 ;  // 開始月の規定値:1月
          ( isset($end) ) ? $end: $end=12 ;  // 終了月の規定値:12月
          $rtnstr = '' ;
          for ($m = $start; $m <= $end; $m++) {
            if (strlen($rtnstr)!=0) {
              $rtnstr .= '||' ;
            }
            $rtnstr .= $m . '月' . '==' . $m ;
          }
          unset($start, $end, $m) ;
          return $rtnstr ;
          

           出力サンプル : [[makeMonthList]] の場合は・・・
           1月==1||2月==2||3月==3||4月==4||5月==5||6月==6||7月==7||8月==8||9月==9||10月==10||11月==11||12月==12


          3.ページ出力

          3.1 reflect(ナビ)
           [[Reflect? &getDocuments=`1` &id=`myDittoCall` &dateSource=`holdingYear` &dittoSnippetParameters=`parents:講演会フォルダID` &showItems=`0` &tplMonth=`dummy`]]

          3.2 Ditto(一覧)
           [!Ditto? &parents=`講演会フォルダID` &extenders=`dateFilter` &id=`myDittoCall` &dateSource=`holdingYear` !]
            • 26012
            • 324 Posts
            年と月を分けない場合は以下のような感じでしょうか。

            1.テンプレート変数(holdingYM)
              入力タイプ : DropDown List Menu
              入力時のオプション値 : @EVAL return $modx->runSnippet(’makeYMList’);

            2.スニペット(makeYMList)
              スニペット名 :makeYMList ※ご随意に
              説明 : 年(西暦)月の選択リストを出力(値はタイムスタンプ)
              出力サンプル : [[makeYMList? &start=`2008` &end=`2020`]] の場合は・・・
              2008年1月==1199113200|| ・・・ ||2020年12月==1578754800
              コード :
            /* -- usage --
             * [[makeYMList? &start=`2008` &end=`2020`]]
             * start : 開始年(初期値:5年前)
             * end : 終了年(初期値:5年後)
             */
            ( isset($start) ) ? $start: $start=date("Y")-5 ;
            ( isset($end) ) ? $end: $end=date("Y")+5-1 ;
            $rtnstr = '' ;
            for ($y = $start; $y <= $end; $y++) {
              for ($m = 1; $m <= 12; $m++) {
                if (strlen($rtnstr)!=0) {
                  $rtnstr .= '||' ;
                }
                $rtnstr .= $y . '年' . $m . '月' . '==' . mktime(0,0,0,1,$m,$y) ;
              }
            }
            unset($start, $end, $y, $m) ;
            return $rtnstr ;
            

            3.ページ出力

            3.1 reflect(ナビ)
             [[Reflect? &getDocuments=`1` &id=`myDittoCall` &dateSource=`holdingYM` &dittoSnippetParameters=`parents:講演会フォルダID` &showItems=`0` &tplMonth=`dummy`]]

            3.2 Ditto(一覧)
             [!Ditto? &parents=`講演会フォルダID` &extenders=`dateFilter` &id=`myDittoCall` &dateSource=`holdingYM` &sortBy=`holdingYM` &sortDir=`DESC` !]
              • 32535
              • 58 Posts
              年と月のリストの作り方、非常に勉強になりました。ありがとうございます。
              実際にコードをためして、年と月ごとのアーカイブを生成することができました。

              私のような初心者に付き合っていただいて、sama55様、感謝致します。