【JS無し】Spearly CMSで、完全な静的サイトに画像ギャラリーを導入してみた

# HTMLとCSSだけで作られたサイトに動的コンテンツを追加したい
LPや、企業サイトなどで、今は全て静的なコンテンツだけど、後からお知らせや、ギャラリーなどの動的なコンテンツを追加したくなること、ありますよね。
エンジニアはともかく、HTMLやCSSの知識のないクライアントにコンテンツを管理してもらう場合、何かしらのシステムを導入する必要があります。

パッと思いつく解決策だと「Wordpress化して、動的なコンテンツを作成できるようにする」ことだと思います。（シェア6割超えてるしね。）

しかし、Wordpress化する場合、以下のような問題があります。

- Wordpress化するために**工数**が発生
- PHP、MySQLが動く**サーバを準備・メンテナンス**する必要がある
- **サーバのお引越し**が必要
- （ちゃんとした対策をしないと）**大量のアクセスに弱い**

しかも「できるだけ安くしてほしい」なんて言われたら、エンジニア的には辛いです...

そこで、**JSを使わずに、動的なコンテンツをサイトに導入できる機能を持った、Spearly CMS**を使って、静的なサイトに動的なコンテンツを導入してみます。

# TL;DR

- Spearly CMS使うとJS一切書かずに動的なコンテンツ埋め込める
- [ここから](https://cms.spearly.com/)アカウント作成して無料で始められるからとりあえず使ってみよ
- コンテンツタイプを作成して、コンテンツ作って、埋め込みタグを既存サイトに追加するだけ
- 楽勝にギャラリー追加できたぞ

# Spearly CMSってなに？
Spearly CMSは、現在急成長している**国産のヘッドレスCMS**です。

https://cms.spearly.com/

APIでのコンテンツ取得はもちろん可能ですが、「埋め込みタグ」と呼ばれている、**HTMLの記述だけで動的なコンテンツをサイトに埋め込む事ができる機能**を提供しています。

最近は、Spearly CLOUDという名前の、ホスティングサービスもリリースされました。（Netlify的なやつですね）
Githubと連携して、とても簡単にサイトをホスティングできます。

https://prtimes.jp/main/html/rd/p/000000004.000016521.html

# 実際にやってみる

では、実際に、HTMLとCSSだけで作成された完全な静的サイトに、動的なコンテンツを導入してみます。
今回は、以下のような静的なサイトを準備しました。

<p class="codepen" data-height="300" data-default-tab="result" data-slug-hash="XWZbxYo" data-user="yuta_spade" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yuta_spade/pen/XWZbxYo">
  Untitled</a> by Okkun@about 11:19 (<a href="https://codepen.io/yuta_spade">@yuta_spade</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

カードで表示している静的な部分を、埋め込みタグを使って動的化してみます。

## アカウントを作成する
まずはSpearlyのアカウントを作成します。[こちら](https://cms.spearly.com/)からSpearlyにアクセスして、Google、Githubアカウントでログインします。

ログインすると、自分のメールアドレスのチームが自動的に作成されます。

![スクリーンショット 2022-05-05 10.27.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/a31abf14-a056-732a-6333-35fbe8ffa9ae.png)

## コンテンツタイプを作成する
Spearly CMSでは、Wordpressとは異なり、**記事のカテゴリのようなものであるコンテンツタイプ**を作成する必要があります。

![スクリーンショット 2022-05-05 10.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/0416e850-99f0-39ca-a05c-9e12245e576e.png)

**コンテンツタイプは、そのコンテンツが、どんな入力フィールド（情報）を持つかを定義したもの**です。必要なフィールドを、組み合わせてコンテンツタイプを作成することができます。
フィールドにはテキスト、リッチテキスト、数値などの種類があり、そのフィールドの持つ情報に合わせて作成していきます。

といってもピンとこないかもなので、具体例を上げてみます。

今回はギャラリーを作成してみることにしましょう。まずは基本情報を入力します。

![スクリーンショット 2022-05-05 11.27.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/d42af88f-3708-6b8b-e5fc-140cc8b5188f.png)


シンプルなギャラリーには、以下の情報が必要です。

- タイトル
- 概要
- 画像

それぞれが、どんなフィールドになるかを考えて、整理するとこんな感じになります。

|フィールド|種類（フィールドタイプ）|
|:--|:--|
|タイトル|テキスト|
|概要|テキスト|
|画像|画像|

![スクリーンショット 2022-05-05 11.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/0aad0ec3-6e3f-31e5-ae31-e1823881f2ab.png)

これでコンテンツタイプの準備は完了です！

## コンテンツの作成

次にコンテンツを作成します。コンテンツを追加からコンテンツをポチポチと追加していきます。

編集画面を開くと、先程作成したフィールド達が並んでいるのがわかると思います！

![スクリーンショット 2022-05-05 11.29.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/8ab6d0fd-71e2-35f9-c234-241bfa0b7771.png)

データを入れていきます。

![スクリーンショット 2022-05-05 11.30.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/30e30d75-fe64-86b0-19c9-b39b946b7be9.png)

そして**忘れずに公開します！**

## サイトへの埋め込み
コンテンツは準備できたので、サイトに埋め込んでみましょう！

（埋め込みの方法は、Spearly CMSでも確認できます。）
![スクリーンショット 2022-05-05 10.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/a46c5c4c-5a96-5963-28f6-85b4d8b94461.png)

埋め込みタグには2つ種類があります。(フォームも埋め込めるので、それも入れると3つ)

- リスト埋め込み（コンテンツリスト）
    - コンテンツを一覧で表示するために使うやつ。
- 単体埋め込み（コンテンツ）
    - 1つのコンテンツを表示するときに使うやつ。

今回は、とりあえず一覧的に出したいので、リスト埋め込みを使います。（単体はまた別の記事で）

まず最初に、スクリプトタグを設置する必要があるので、それを設置します。
スクリプトタグにはチームごとに発行されるAPIキーが含まれているので、自分のチームのものをコピーして貼り付けるようにしましょう。

![スクリーンショット 2022-05-05 10.52.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/bcf95657-c473-c96b-6827-5c61f9aca741.png)

次に、実際にコードを追加します。コンテンツリスト表示のサンプルコードがコピペできるようになっているので、とりあえずこれを持ってきましょう。
![スクリーンショット 2022-05-05 11.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/6a69b21d-2e2d-1d51-44cd-c47949fc55f1.png)


```html
<gallery-list>
 　　　　 <!-- タイトル -->
    <h1>{%= gallery_title %}</h1>
  　　　　<!-- 画像 -->
    <img src="{%= gallery_image %}" alt= ""/>
    <div style="background: url('{%= gallery_image %}');"></div>
  　　　　<!-- 概要 -->
    <p>{%= gallery_description %}</p>
  　　　　<!--  単体ページへのリンク -->
    <a href="{%= gallery_#url %}">単体ページへのリンク</a>
</gallery-list>
```

埋め込みタグは、独自のタグ（上の例だと`gallery-list`）と、その中で使えるフィールドごとのタグ（`{%= gallery_title %}`とか）を使って書いていきます。
ぱっと見ると複雑そうに見えますが、実はとてもシンプルです。

まず、タグの名前になっている`gallery-list`は、作成したコンテンツタイプのID（`gallery`）に、リスト表示であることを示す`-list`がくっついたものです。

そして、その中で使えるフィールドごとのタグは、作成したコンテンツタイプのID（`gallery`）に、対応するフィールドのIDを（`title`とか`image`とか）をくっつけているだけです。（それを`{%= %}`で囲います）

ではこれを先程のソースにとりあえず追加してみましょう！！
こんな感じになります。
![スクリーンショット 2022-05-05 11.32.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/9df98707-c32c-5d72-03a0-ca245f69fff5.png)
クラスを当てていないので見た目はあれですが、**たったこれだけで動的なコンテンツを埋め込めました！**
普通はAPIを使って、データ取得処理作成して、表示する処理を作成して…と結構面倒なので、これは便利。


## 見た目を整える

では最後に見た目を整えます。今回はBootstrapのカードを使っているので、これに合わせて変えていきます。

以下が今回の一つの記事のカードなので。。。

```html
<div class="col my-3">
　　　　<div class="card" style="width: 18rem;">
　　　　　　　　<img src="https://placehold.jp/3d4070/ffffff/300x150.png" class="card-img-top" alt="...">
　　　　　　　　<div class="card-body">
　　　　　　　　　　　　<p class="card-text">静的なコンテンツです</p>
　　　　　　　　</div>
　　　　</div>
</div>
```

これに、埋め込みタグを合わせると、こんな感じになります。

```html
<gallery-list>
  <div class="col-3 my-3">
    <div class="card" style="width: 18rem;">
      <img src="{%= gallery_image %}" class="card-img-top" alt="...">
      <div class="card-body">
        <h5 class="card-title">{%= gallery_title %}</h5>
        <p class="card-text">{%= gallery_description %}</p>
      </div>
    </div>
  </div>
</gallery-list>
```

実際の表示がこんな感じになりました！ :tada: ほぼできてる！
![スクリーンショット 2022-05-05 11.38.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/cd6fc884-4a53-d82f-798f-3c2cc4be8411.png)

現在の仕様として、Spearly CMSのリスト表示は`ul, li`タグを自動的に生成しています。
![スクリーンショット 2022-05-05 11.14.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/359429fe-f660-6379-75f0-c2db3a4adcbe.png)
なのでCSSで`ul`に`list-style: none;`を設定して、リストのドット表示を消して、さらにflex適用します。

```css
  .gallery-list-wrapper ul {
    display: flex;
    justify-content: space-around;
    list-style: none;
  }
```

![スクリーンショット 2022-05-05 11.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/b31cb70d-8fdc-2883-695e-912e012d4647.png)

きれいになりました :tada:

あとは、コンテンツをもう2つ追加してみると、、、

![スクリーンショット 2022-05-05 11.41.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182837/5202f092-6f9f-b630-a952-548f8b8fd70a.png)

立派なギャラリーを追加できました！

Codepenでソース公開してます
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="ExQjddJ" data-user="yuta_spade" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/yuta_spade/pen/ExQjddJ">
  [try Spearly CMS] dynamic site</a> by Okkun@about 11:19 (<a href="https://codepen.io/yuta_spade">@yuta_spade</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# まとめ

JSを1行も書かずに、動的なギャラリーをサイトに追加することができました！
コストを抑えつつ、静的なサイトに動的なコンテンツを追加する1つの手段として、Spearly CMSはとても便利です。

もちろん、一部ではなく、サイト全体をSpearly CMSを使って作成することもできます。
APIを使い、高度なサイト構築や、スマートフォンアプリなどへのコンテンツ配信なども可能なので、初心者から現役バリバリのエンジニアにも使えるヘッドレスCMSだと思います。

https://cms.spearly.com/

ぜひ皆さんも、1度触ってみてくださいね！