コンテンツタイプ
デフォルトのコンテンツタイプ
ほとんどのウェブプラットフォームに特徴的なことですが、 Grav のデフォルトのコンテンツタイプは HTML です。
これはつまり、ユーザーがブラウザでルーティングをリクエストしたとき、たとえば /blog/new-macbook-pros-soon
にアクセスしようとしたとき、このリクエストには拡張子がないので、 HTML ページを要求しているのだと Grav は判断します。
リクエストされたページが blog-item.md
によっていた場合、 Grav はblog-item.html.twig
という Twig テンプレートを探して、ページをレンダリングします。
ユーザーが明示的に、/blog/new-macbook-pros-soon.html
をリクエストしていたとしたら、 Grav は同じく blog-item.html.twig
ファイルを探したでしょう。
異なるコンテンツタイプ
しかしながら、 Grav は柔軟なプラットフォームなので、(xml
、rss
、json
、pdf
などの)いかなるコンテンツタイプでも提供できます。それらが適切にレンダリングされる方法を提供してさえいれば。
たとえば、 .xml
拡張子のリクエストを受け取った場合、たとえば: /blog.xml
通常の blog.html.twig
テンプレートでレンダリングする代わりに、 Grav は blog.xml.twig
を探します。
そのテンプレートが、適切な XML 構造を出力できるようにしておく必要はあります。
JSON ファイルの例
ファイルへの一般的なアクセス方法に、 .json
拡張子によるものがあります。
JSON ファイルでリクエストされたデータは、 JavaScript で簡単に処理できます。
特定のページの フロントマター と コンテンツ が JSON フォーマットで欲しいとします。
そのページは、 item.md
により定義されていたとしましょう。
やるべきことは、 item.json.twig
という twig テンプレートを用意することです。
テーマフォルダ内の templates/
フォルダか、カスタムテンプレートを読み込むプラグインを使っていればそのフォルダに、このテンプレートファイルを保存します。
このitem.json.twig
ファイルの内容は、次のようになります:
{% set payload = {frontmatter: page.header, content: page.content} %}
{{ payload|json_encode|raw }}
この Twig ファイルがやっているのは、ページのヘッダを frontmatter に、そしてコンテンツを content としている連想配列を作って、その後 Twig の json_encode
フィルタでエンコードしているだけです。
ユーザが/blog/new-macbook-pros-soon.json
という URL にアクセスしたとき、この新しい Twig ファイルが使われ、出力は次のようなフォーマットで送られます:
{
"frontmatter":{
"title":"New Macbook Pros Arriving Soon",
"date": "14:23 08/01/2016",
"taxonomy":{
"category":[
"blog"
],
"tag":[
"apple",
"mbpr",
"laptops"
]
}
},
"content":"<p>this has an -> arrow here and <strong>bold</strong> here</p>\n<blockquote>\n<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ultricies tristique nulla et mattis. Phasellus id massa eget nisl congue blandit sit amet id ligula. Praesent et nulla eu augue tempus sagittis. Mauris faucibus nibh et nibh cursus in vestibulum sapien egestas. Curabitur ut lectus tortor. Sed ipsum eros, egestas ut eleifend non, elementum vitae eros.\n-- <cite> Ronald Wade</cite></p>\n</blockquote>\n<p>Mauris felis diam, pellentesque vel lacinia ac, dictum a nunc. Mauris mattis nunc sed mi sagittis et facilisis tortor volutpat. Etiam tincidunt urna mattis erat placerat placerat ac eu tellus.</p>\n<p>This is a new paragraph</p>\n<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec ultricies tristique nulla et mattis.</p>"
}
これは適切な JSON であり、 JavaScript でかんたんにパースでき、処理できます。
楽勝です!
カスタム・コンテンツタイプ
適切なコンテンツタイプでデータ送信するため、ブラウザが期待する MIME タイプを Grav に知らせる必要があります。
標準的なコンテンツタイプであれば、 system/config/media.yaml
ファイルに定義されています。
ここで提供されていないコンテンツタイプを使いたい場合、ここに付け加えるだけで良いです。
たとえば、 iCal カレンダーイベントをレンダリングしたいとき、user/config/media.yaml
ファイルに以下のような追記をしてください:
ics:
type: iCal
thumb: media/thumb.png
mime: text/calendar
ここでは、 iCal
ファイルに対して、 text/calendar
という mime タイプとともに .ics
ファイル拡張子を定義しています。
その後必要なことは、このタイプに対して適切な .ics.twig
テンプレートを提供することです。