Shopifyのカートに「利用規約への同意」チェックボックスをつける

## 目的
現在のShopifyでは利用規約やプライバシーポリシーにユーザーが同意した上でカートの先に進む機能は実装されていません。その場合、「みなし同意」と判断される場合があり、マーチャントとして慎重な対応を実施するにはカート時点でのユーザの同意のチェックボックスの実装を行う必要があります。

参考：利用規約・プライバシーポリシーの適切な同意の取り方を弁護士が解説
https://topcourt-law.com/terms_of_service/how-to-get-consent#i-8

## 実装

今回は「Debut」のテーマをカスタマイズして利用規約へのチェックボックスを実装していきます。

### ファイルを開く

まずは管理画面「オンラインストア」>「テーマ」から、既存のテーマの「アクション」> 「コードを編集する」をクリックします。

![スクリーンショット 2020-12-03 18.45.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/5570a69a-c12d-7de2-039d-67d49c75428b.png)


そして「Sections」から「cart-template.liquid」を選択します。

![スクリーンショット 2020-12-03 18.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/3ea0baab-3243-0db7-b773-6c3dddbe4af7.png)


### コードを追加
#### 1. チェックボックスの追加
※Shopify標準の法務文章ページを利用していることを前提にリンクをつけています。

```html
 <div id="policy_optin">
    <input type="checkbox" id="optin" onclick="changeDisabled();" autocomplete="off" required="required" >
        <label for="optin">
            <a href="/policies/terms-of-service" target="_blank">利用規約</a>
            と
            <a href="/policies/privacy-policy" target="_blank">プライバシーポリシー</a>
            に同意します
        </label>
</div>
```

上記コードを「cart-template.liquid」の

```html
<div class="cart__shipping rte">{{ taxes_shipping_checkout }}</div>
```

と

```html
<div class="cart__buttons-container">
```

の間に挿入します（もちろん挿入場所はサイトの都合により任意です。）

![スクリーンショット 2020-12-03 18.58.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/94d5bbcb-62e7-e20c-0ae1-7265046042f0.png)


#### 2. 送信ボタンへのIDの追加

送信ボタンにIDをふります（例：「id="checkout_btn" 」）

![スクリーンショット 2020-12-03 19.03.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/abda72ad-5e06-2e6b-9431-99458466c531.png)


#### 3. JavaScriptを追加します

同ファイルのHTML要素の下に以下のコードを追加します。（要素のIDなどは前述のコードと合わせてください）
※ Debutテーマ内ではJavaScriptはtheme.jsに記載することでサイト全体に反映することができます。今回はカートでのみ必要な実装のため、直接HTML内に記述しています。

```html
<script>
  function changeDisabled(){
      optin = document.getElementById('optin');
      if(optin.checked) {
          document.getElementById('checkout_btn').disabled = "";
      } else {
          document.getElementById('checkout_btn').disabled = "disabled";
      }
  }
  
  window.onunload = function() {};
  window.addEventListener("pageshow", function(event){
    if (event.persisted) {
      changeDisabled();
      window.location.reload();
    }
  });
  window.onload = changeDisabled();                   
</script>
```

![スクリーンショット 2020-12-03 19.06.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/2e7c4116-3fed-0096-b24e-de029987136f.png)


## 確認

カートに確認のチェックボックスがでており、初期状態では押せない状態（disabled）、チェックにより送信ボタンの色が変わることを確認してください。

![スクリーンショット 2020-12-03 19.07.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/de6984f7-3df0-323f-de63-ba1cfbdb2d83.png)


チェックを入れると色が変わります（それぞれCSSにて別途お好みの色に指定してください）

![スクリーンショット 2020-12-03 19.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/c2b0846d-d240-f307-29d1-28a1a3de9f1d.png)



## 注意点

- 動的チェックアウトボタンを利用している場合は同意を確認することができません。

![スクリーンショット 2020-12-03 18.39.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5324/6b8369e9-1c71-c24f-064b-8f8835a63eed.png)

（2020/12/07追記） ShopPayなどのダイレクト購入もカートがスキップされ対応できない

- ボタンの色のスタイルなどは別途指定してください

- みなし同意についてどこまで慎重に対応するかによって実装が変わってきます。もっとも丁寧なやり方をするとすれば利用規約についてカートページ内に全文表示することが理想的です。ここではあくまで（実際に読んでいるかどうかは確認できませんが）ユーザーが自分でチェックボックスにチェックを入れることを最低ラインとして実装を行なっています。

## 既知の課題

### （2020/12/07追記） buttonのdisableの処理かぶる問題

「InfiniteProductOptions」のようなカートのボタンと連動するようなアプリを導入している場合、disableの処理が被ってしまい、挙動が安定しない。