ShopifyのLiquidファイルの構造の話②

#はじめに
今回も、ShopifyのLiquidファイルの構造について解説していきます。

前回の記事を読んでいない方は以下のリンクから御覧ください。

[ShopifyのLiquidファイルの構造の話①](https://qiita.com/eijiSaito/private/15b8fd69ad885ef7774f)

`コードを編集する`からコードを編集していきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/1d48955d-964b-7f41-1272-1cea3880bb33.png)

#Liquidファイルのテーマ構造
それでは、ShopifyのデフォルトテーマであるDebutのフォルダ構造を見ながら、各々の役割について解説していきます。

##クイックスタート
Shopifyのフォルダは大きく分けて、以下の７つに分けられます。

+ Layout
+ Templates
+ Sections
+ Snippets
+ Assets
+ Config
+ Locales


一つ一つの役割をざっくりと解説してきます。

前回は`Template`まで解説しました。

今回は。`Sections`から解説していきたいと思います。

##Sections
セクションは、Shopify内でカスタマイズできる一つ一つの部品でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/6fdc9847-ef4b-5d23-eec0-9c9caf674417.png)

上の画像で赤色の線を引いたそれぞれが`Section`になっています。

Sectionは、基本的にTemplateの中で呼ばれます。

具体例として、blogのテンプレートファイルを見てみましょう。

```blog.liquid
{% comment %}
  The contents of the blog.liquid template can be found in /sections/blog-template.liquid
{% endcomment %}

{% section 'blog-template' %}
```

上記のコードの`{% section 'blog-template' %}`でセクションを呼び出します。

これは、viewに表示させるという命令ではなく、あくまでsectionを呼び出して展開するという命令なので。`{{}}`ではなく`{%%}`を用いています。

###blog.liquidの補足説明
ちなみに、このblog.ilquidという名前のテンプレートは、カスタマイズページで`ブログ`を選択すると呼ばれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/8f546580-25d1-f62c-db07-2159c7f4f012.png)

左の`ブログページ`が、上記の`{% section 'blog-template' %}`を記述することで呼ばれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/0a298745-17d9-baf2-88ce-549a4358a9e4.png)

###TemplateとSectionの関係

以前の記事で説明し忘れていましたが、テンプレートファイルはカスタマイズページで指定する以下の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/73278612-42ae-a7c5-8ecb-1c760e04c871.png)

そして、セクションはユーザーがカスタマイズできる以下の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/d37506e3-7615-3437-54e6-4079d9cc30ba.png)

この構造を理解すれば、SectionがTemplateの中で呼ばれる存在であることが分かります。

そして、SectionはTemplatesの中で呼ばれるたびに動的に生成されるため、同一の複数のSectionが影響し合うことはありません。

もう少し詳しく説明すると、例えば`blog.liquid`や`article.liquid`といった複数のテンプレートファイルで、`blog-template.liquid`という同一のセクションを呼び出したとしても、その`blog-template.liquid`はその都度新しく生成されるため、お互いが影響し合うことはありません。

つまり、たとえ`blog-liquid`のテンプレートファイルの中で`blog-template`セクションに対してレイアウトの指定や日付の表示などの操作を行ったとしても、それは`article.liquid`のテンプレートファイルの`blog-template`には何も影響しません。

もっとも、`blog-template`をそのように使うことはないと思いますが。

それでは、具体的にセクションの中身を確認してみましょう。
###セクションの中身を確認
ということで、`blog.liquid`で呼ばれるセクションである`blog-template`セクションを見てみましょう。

長すぎるので、一部分だけ見てみます。

```blog-template.liquid
{% paginate blog.articles by 12 %}

<div class="page-width">
  <header class="section-header text-center">
    <h1>{{ page_title }}</h1>
    {% if blog.tags.size > 0 %}
      <div class="blog-filter">
        <label class="blog-filter__label select-label" for="BlogTagFilter">{{ 'collections.filters.title_tags' | t }}</label>
        <div class="select-group">
          <select id="BlogTagFilter" aria-describedby="a11y-refresh-page-message a11y-selection-message" data-blog-tag-filter>
            <option value="{{ blog.url }}">{{ 'blogs.article.all_topics' | t }}</option>
            {% for tag in blog.all_tags %}
              <option value="{{ blog.url }}/tagged/{{ tag | handleize }}" {% if current_tags contains tag %}selected{% endif %}>{{ tag }}</option>
            {% endfor %}
          </select>
          {% include 'icon-chevron-down' %}
        </div>
      </div>
    {% endif %}
  </header>
</div>



{% schema %}
{
  "name": {  
    "ja": "ブログページ"
  },
  "settings": [
    {
      "type": "select",
      "id": "layout",
      "label": {
        "ja": "レイアウト",
      },
      "default": "list",
      "options": [
        {
          "value": "grid",
          "label": {
            "ja": "グリッド",
          }
        },
        {
          "value": "list",
          "label": {
            "ja": "リスト",
          }
        }
      ]
    },
    {
      "type": "checkbox",
      "id": "blog_show_author",
      "label": {
        "ja": "執筆者を表示する",
      },
      "default": true
    },
    {
      "type": "checkbox",
      "id": "blog_show_date",
      "label": {
        "ja": "日付を表示する",
      },
      "default": true
    }
  ]
}
{% endschema %}

```

特徴的な部分だけを解説していきます。

###blog.tags.size

`{% if blog.tags.size > 0 %}`の部分で、ブログのサイズに応じて条件分岐をさせています。

今回は`blog.liquid`で`{% section 'blog-template' %}`をすることにより、`blog-template`セクションを呼び出しています。

このように呼び出すと、セクションの中身がそのまま、テンプレートファイルで指定した箇所にぶち込まれることになります。

通常、`blog.tags.size`というコードは、blog.liquidの中でのみ使用できます。

なぜかというと、テンプレートファイルの中では、`テンプレートファイルのファイル名.～`とすることで、格納された変数を取り出すことができるからです。

そのため、`blog-template.liquid`の中で`blog.tags.size`を用いるということは、`blog.liquid`ファイルから呼ばれることが前提の書き方だといえます。

なぜなら、`blog.tags.size`というコードは`blog.liquid`という名前のテンプレートファイルの中でのみ使用可能なものだからです。

このように、liquidでは密結合な書き方を頻繁に行います。どういうことかというと、このような書き方では`blog-template.liquid`は`blog.liquid`ファイルの中でしか使用できないからです。

Sectionという単位で切り出すということは複数のテンプレートファイルで使用することが前提になっているはずなのに、このように密結合なコードを書くのは、少し不思議ですよね。

個人的には、せっかくSectionという形の部品で切り出したのだから、もう少し疎結合になるようにコードを書いた方が良いんじゃないかと思います。

###{% include 'icon-chevron-down' %}

これは、Sectionの中でSnippetを呼び出すときのコードです。

`include`を用いることで、Sectionの中でSnippetを呼び出すことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/05a1c423-b586-3518-e6de-c0903ef33acb.png)

復習になりますが、Templateの中で`section`を用いるとSectionを呼び出すことができ、Sectionの中でincludeを呼び出すとSnipetsを呼び出すことができると覚えておきましょう。

###{% schema %}
schemaはShopifyの中でも極めて重要なコードです。

詳しい説明は今後の記事で取り扱うので、ここではサラッと解説していきます。

schemaは、ユーザーが選択する一つ一つの表示領域を作成するものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/5b9ceb75-c437-7e53-992b-afb3723ba135.png)

schemaで定義したオブジェクトをviewの中で使用することで、ユーザーがカスタマイズした設定が見た目に反映されるようになります。
##Snippets
それではSnippetsについて解説していきます。

Snippetsは一言でいうと、Shopifyの中で再利用できる部品の最小単位です。

Sectionの中でincludeを使うことで呼び出すことができます。

具体例として、`icon-chevron-down.liquid`の中身を見てみましょう。

```icon-chevron-down.liquid
<svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-chevron-down" viewBox="0 0 9 9"><path d="M8.542 2.558a.625.625 0 0 1 0 .884l-3.6 3.6a.626.626 0 0 1-.884 0l-3.6-3.6a.625.625 0 1 1 .884-.884L4.5 5.716l3.158-3.158a.625.625 0 0 1 .884 0z" fill="#fff"/></svg>
```

このように、`icon-chevron-down.liquid`の中ではsvcタグが記載されています。

svgタグとは、コードを記載して画像を描画することができるタグのことです。

Snnipetとして作成したファイルは、Sectionなどでincludeすると、何度でも呼び出すことができます。

##Assets
Assetsは、スタイルが記載されたフォルダです。

つまりは、CSSファイルの集合体です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/40f1c0b6-d648-f2cf-a952-f82f5eaba0f1.png)

##Config
Configはテーマ設定に関するjsonファイルが２つ格納されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/cc61535d-cd9b-0141-718d-bbdd4f364546.png)

###settings_data.json

Shopifyテーマストアのほとんどの無料テーマ内にあるsettings_data.jsonファイルを表示すると、2つの異なるオブジェクトに分割されています。それは、currentとpresetsです。

####Current
Currentオブジェクトには、現在のテーマ設定のデータが含まれています。これらは、現在テーマエディタで設定されている値です。

テーマはcurrentに保存されたデータのみ使用しています。

####Presets
Presetsオブジェクトには、テーマスタイルのデータが含まれています。例えばDebutのテーマを使うなら、DefaultとLightのデータが含まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/f3740bd9-765b-fe29-5868-c29844df1221.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/63721059-0c55-3877-55fe-77d2827d11c0.png)

テーマはcurrentに保存されたデータを使用するだけなので、適用したpresetsに応じて、currentの値が更新されます。しかし、テーマスタイルによって更新されない入力値があることに注意しましょう。

###setting_schema.json

`setting_schema.json`は。Shopify画面で説明します。テーマ設定の中に入りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/b82509e0-d15b-a4a8-29fe-91db3712bb1b.png)

setting_schema.jsonで定義するのは以下の部分です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/489582fb-8c7a-a061-0f4d-05bd3c0f2e30.png)


つまり、ユーザーがテーマ全体にまたがって設定できるSchemaであると考えることができます。

この`setting_schema.json`の中でSchemaを定義することで、グローバルなSchemaを定義できると覚えておきましょう。

そして、この`setting_schema.json`からユーザーが変更した値が、`setting_data.json`のcurrentに代入されます。

結局、テーマのスタイルはすべて`setting_data.json`に定義されているとおぼえておいて良いでしょう。

`setting_schema.json`や`setting_data.json`のpresetsオブジェクトで指定された値が`setting_data.json`のcurrentに代入され、それによりテーマのスタイルが変更されます。

##Locals
Localsには、翻訳の定義と内容が格納されています。

具体的には、言語ごとの翻訳がjson形式で格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/621e945f-4a59-914f-808d-4cbb035ffcce.png)

管理画面から編集することも可能です。その場合は、以下のように`言語を編集する`を選択しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411258/9ee1618f-6045-e8dd-fb93-7b16ecc9f274.png)

管理画面から修正した内容は、翻訳jsonファイルに保存されます。そのため、管理画面経由で修正したものを上書きしないように注意してください。

#終わりに
今回の記事はここまでになります。

ここまで読んでくださりありがとうございました。

# Shopify アプリのご紹介

Shopify アプリである、「商品ページ発売予告アプリ | リテリア Coming Soon」は、商品ページを買えない状態のまま、発売日時の予告をすることができるアプリです。Shopify で Coming Soon 機能を実現することができます。

https://coming-soon.reterior.jp/

https://apps.shopify.com/shopify-application-314?locale=ja&surface_detail=%E3%83%AA%E3%83%86%E3%83%AA%E3%82%A2&surface_inter_position=1&surface_intra_position=1&surface_type=search