コンテンツデータで記事を作成し、それを公開日の年度別でパスを生成したいです。
コンテンツタイプリストテンプレートのアーカイブマッピングに以下を指定
<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をダウンロードすると中身が空となっていました。
もし知見等ございましたらご助言いただければ幸いです。
よろしくお願いいたします。
mtml部分の表示が切れてしまっているので再掲いたします。
1~3月なら年を-1
初めての年なら以下処理でマッピング生成を行う
archive/[年度]/index.html のパスを作成
archive//%i
作成したパスを、このFileTemplateでアーカイブマッピングとして出力
上記、エンコードし忘れてしまったので再再掲いたします。
>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を使用するとループすると思います。