ymk13y

コンテンツタイプリストアーカイブで年度別のパスを生成したい

0

コンテンツデータで記事を作成し、それを公開日の年度別でパスを生成したいです。

コンテンツタイプリストテンプレートのアーカイブマッピングに以下を指定

<mt:include module="mapping-module" regex_replace="/^[\ \t\r\n]+/mg","">

モジュールテンプレート「mapping-module」の内容を以下に。

<mt:For regex_replace="/^[\ \t\r\n]+/mg","">
<mt:Var name="year" value="">
<mt:Entries>
<mt:SetVarBlock name="entryYear"><mt:If tag="StartDate"><mt:StartDate format="%Y" /></mt:If></mt:SetVarBlock>
<mt:SetVarBlock name="entryMonth"><mt:If tag="StartDate"><mt:StartDate format="%m" /></mt:If></mt:SetVarBlock>
<mt:If name="entryYear" eq="">
<mt:ElseIf name="entryMonth" eq="">
<mt:Else>
<mt:Ignore>1~3月なら年を-1</mt:Ignore>
<mt:If name="entryMonth" lt="4"><mt:SetVar name="entryYear" op="--"></mt:If>
<mt:Ignore>初めての年なら以下処理でマッピング生成を行う</mt:Ignore>
<mt:If name="entryYear" ne="$year">
<mt:SetVarBlock name="mapping">archive/<mt:Var name="entryYear">/%i</mt:SetVarBlock><mt:Ignore> archive/[年度]/index.html のパスを作成</mt:Ignore>
<$mt:FileTemplate format="$mapping" $><mt:Ignore>作成したパスを、このFileTemplateでアーカイブマッピングとして出力</mt:Ignore>
<mt:SetVar name="year" value="$entryYear">
</mt:If>
</mt:If>
</mt:Entries>
</mt:For>

これで再構築を行うと、archive/2021/index.htmlのようなディレクトリ・ファイルが想定通り作成されたのですが
ブラウザで見るとNotFound
FTPでindex.htmlをダウンロードすると中身が空となっていました。

もし知見等ございましたらご助言いただければ幸いです。
よろしくお願いいたします。

返信(9)

| 返信する
  • mtml部分の表示が切れてしまっているので再掲いたします。













    1~3月なら年を-1

    初めての年なら以下処理でマッピング生成を行う

    archive/[年度]/index.html のパスを作成
    archive//%i
    作成したパスを、このFileTemplateでアーカイブマッピングとして出力





  • 上記、エンコードし忘れてしまったので再再掲いたします。

    <mt:For regex_replace="/^[\ \t\r\n]+/mg","">
    <mt:Var name="year" value="">
    <mt:Entries>
      <mt:SetVarBlock name="entryYear">
        <mt:If tag="StartDate"><mt:StartDate format="%Y" /></mt:If>
        </mt:SetVarBlock>
        <mt:SetVarBlock name="entryMonth">
        <mt:If tag="StartDate"><mt:StartDate format="%m" /></mt:If>
        </mt:SetVarBlock>
        <mt:If name="entryYear" eq="">
        <mt:ElseIf name="entryMonth" eq="">
        <mt:Else>
        <mt:Ignore>1~3月なら年を-1</mt:Ignore>
        <mt:If name="entryMonth" lt="4"><mt:SetVar name="entryYear" op="--"></mt:If>
        <mt:Ignore>初めての年なら以下処理でマッピング生成を行う</mt:Ignore>
        <mt:If name="entryYear" ne="$year">
          <mt:Ignore> archive/[年度]/index.html のパスを作成</mt:Ignore>
          <mt:SetVarBlock name="mapping">archive/<mt:Var name="entryYear">/%i</mt:SetVarBlock>
          <mt:Ignore>作成したパスを、このFileTemplateでアーカイブマッピングとして出力</mt:Ignore>
          <$mt:FileTemplate format="$mapping" $>
          <mt:SetVar name="year" value="$entryYear">
        </mt:If>
        </mt:If>
    </mt:Entries>
    </mt:For>
  • >ymk13yさん
    確認ですが、mt:startdateは.net側で提供されているテンプレートタグでしょうか(ソフトウェア版には存在しないタグのようです)。
    そのタグに値があればentryYearまたはentryMonthに値を設定したいと思われるので、まずはその値が正しく入っているか、mt:varタグで出力させてみてはいかがでしょうか。
    (デバグの際、一番外側のmt:forタグは外しておいた方がいいかもしれません)
    よろしくお願い致します。

  • >ymk13yさん
    確認ですが、mt:startdateは.net側で提供されているテンプレートタグでしょうか(ソフトウェア版には存在しないタグのようです)。
    そのタグに値があればentryYearまたはentryMonthに値を設定したいと思われるので、まずはその値が正しく入っているか、mt:varタグで出力させてみてはいかがでしょうか。
    (デバグの際、一番外側のmt:forタグは外しておいた方がいいかもしれません)
    よろしくお願い致します。

    • ご回答いただきありがとうございます。
      mt:startdateはカスタムフィールドのタグ名になります。記載が漏れ失礼しました。
      記事のカスタムフィールドでStartDate(種類[日付と時刻]の日付のみ)を作成してします。

      一旦、このモジュールを呼び出しているテンプレートでForを除いたコードをそのまま実行してみたところ、想定通りentryYearの値や整形したパス(archive/2021/index.html)が出力されました。

      index.htmlファイルは生成されているものの、アクセスすると404になり
      FTPで落とそうにも
      ----
      リモートからのファイルのコピーに失敗。
      Failed to open file.
      ----
      となり、ファイル内容の確認ができませんでした。
      権限を疑いましたが、パーミッションはrw-r--r-- で他ファイルと同様になっていました。

      改めて、気になる点などございましたらご指摘いただけたら幸いです。
      よろしくお願いいたします。

      • はじめまして。
        おそらく、MTForタグの正規表現で改行がエスケープされていないのが原因と思います。
        いかがでしょうか。

  • ご教示ありがとうございます。
    strip_linefeeds="1" をmoduleの出力箇所やIncludeタグ側などに入れてみましたが
    archive/2021/index.htmlarchive/2022/index.htmlarchive/2021/index.html
    と、ループした形で生成されてしまう状態です。

    いろいろ出力確認を試して原因の特定してみます。
    ご回答いただきありがとうございます。

  • ご返信ありがとうございます。
    strip_linefeedsの指定で改行コードが消えたので、おそらく出力エラーは消えたと思っています(きっと)。

    以下は見当違いでしたら申し訳ございません。

    記事アーカイブテンプレートは、全ての記事から公開日を基準に対象を取得してページに出力します。
    そのため、出力先は1つになりますので、mapping-module の様な記事ごとのカスタムフィールド値で出力先を分けるのは仕様上不可能の様に思います。

    他実装パターンを考えてみました。

    ## 静的ページとして出力する場合
    記事に会計年度別のカテゴリを用意しカテゴリ別テンプレートで出力する。
    もしくは、会計年度のみを管理するコンテンツタイプを作成し、コンテンツタイプアーカイブテンプレートで会計年度の記事を表示する。

    ## 動的ページとして出力する場合
    記事から会計年度を含んだJSONを出力して、flexibleSearch で絞り込み表示する。
    上記のJSONをPHPで処理し表示する。
    https://github.com/tinybeans/jq-plugin-flexibleSearch

    ## どうしても記事アーカイブテンプレートで実現する場合
    年別ではなく月別にすると、年と月の値から会計年度ページを出力する。
    ただし、該当月の記事を削除し0件となるとページが削除されてしまうなど、予期せぬデメリットもあります。

    単に一覧で表示する場合はこちらが参考になると思います。
    https://cms-note.com/movabletype/mt_fiscal_year_2.html

    難しそうな問題なので何か助けになれば幸いです。

  • > archive/2021/index.htmlarchive/2022/index.htmlarchive/2021/index.html
    > と、ループした形で生成されてしまう状態です。
    コンテンツタイプを利用されているのにアーカイブマッピングのモジュールテンプレート内にmt:Entriesを記述されていることが気になりました。
    ※mt:Entriesやmt:Contentsを使用するとループすると思います。

返信する


カテゴリグループ

OpenID対応しています OpenIDについて