メニュー

コンテンツタイプ

デフォルトのコンテンツタイプ

ほとんどのウェブプラットフォームに特徴的なことですが、 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 は柔軟なプラットフォームなので、(xmlrssjsonpdfなどの)いかなるコンテンツタイプでも提供できます。それらが適切にレンダリングされる方法を提供してさえいれば。

たとえば、 .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 -&gt; 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 テンプレートを提供することです。