案件でよく使うCMSのあれこれ
これは [Craft CMS Advent Calendar 2018](https://adventar.org/calendars/2941)、[Movable Type Advent Calendar 2018](https://adventar.org/calendars/2900)、[a-blog cms Advent Calendar 2018](https://adventar.org/calendars/2948)、[MTAppjQuery Advent Calendar 2018](https://adventar.org/calendars/3006) の17日目の記事です。

昨日の岩崎さんの [Movable Type Advent Calendar 2018](https://adventar.org/calendars/2900) のエントリー「[20周年の mushikabu.netで MovableTypeを使い続ける理由 - 岩崎仁の俺は語りたい！](https://mushikabu.net/2018/movabletype/)」は多言語の話など共感・参考になりました。

[a-blog cms Advent Calendar 2018](https://adventar.org/calendars/2948) の井斉さんのエントリー「[＠includeと@extendsを整理する | ablogcms | IORI-ST](http://isaikaori.com/ablogcms/20181216.html)」を拝見して extends を Craft CMS で知った時の便利さを思い出しました。テンプレートバリバリ書いてると面白いだろうなー。

---

今年も案件ではいくつかのCMSを触る機会がありました。各CMSについてスキルが追いついていないところが多々あり、一緒に案件をやるメンバーに助けてもらいながらやってこれました。

ディレクターとして話せるレベルくらいは理解してるつもりですが、時々用語を間違えたり、特徴を忘れたりすることがあるので整理してみようと思ったのがこの記事になります。
[a-blog cms Training Camp 2018 TOKYO](https://ablogcms.doorkeeper.jp/events/75246) で藤田さんが話された内容の簡易版みたいな感じですかね。

# 目次

1. 機能拡張の呼び方
1. ブロックエディタ
1. データの持たせ方・分類
1. エントリ同士の関連付け
1. テーマ機能、URL、テンプレート
1. 管理画面カスタマイズ

# 機能拡張の呼び方

CMS自体の機能を拡張するものの呼び方？がCMSによっては違ったりしますね。

| MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- |
| プラグイン | プラグイン | モジュール | 拡張アプリ？ | プラグイン |

Drupalはモジュールですが、MTでモジュールと言ってるとテンプレートモジュール？とかなったりするのでややこしい時があります。

あとは、モジュール一覧とかになると、コンテンツで利用するデザインパターンというかそういう感じのイメージになるときもあるので、この辺りは話の前提が揃っていないと噛み合わなくなることがありますね。

a-blog cms の場合はCMSが提供している機能を元にして使っていくという位置付けなので制限はあるかもですが安全性が担保されてますね。

# ブロックエディタ

賛否両論ありますが、リッチエディタでやるのは難しいことやカスタムフィールド職人が登場したりすることもありますので、場合によってはブロックエディタがいい場面もありますね。

| MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- |
| ブロックエディタ<br>プラグイン：[MTAppjQuery](https://bit-part.net/products/mtappjquery/)（multifield） | マトリックス<br>プラグイン：[Super Table](https://verbb.io/craft-plugins/super-table/features), [Neo](https://github.com/spicywebau/craft-neo) | [Paragraphs](https://www.drupal.org/project/paragraphs) | ユニット | Gutenberg<br>プラグイン：[Advanced Custom Fields](https://www.advancedcustomfields.com/) |

ブロックエディタといえば a-blog cms だと思います。
Movable Type は7からコンテンツタイプでブロックエディタをつかうことができるようになりましたね。
Craft CMS も元々使えるのでかなり魅力的です。
WordPress は最近登場した 5 で Gutenberg も採用されましたね。
Drupal は Paragraphs モジュールを使うことでブロックエディタが使えますね。

前述の「モジュール」話は個人的には「ユニット」も最初はなじめないこともありましたが、少しずつ慣れてきてる感じがします。

ブロックエディタを使う時はデータ移行などがある時は少し注意して考えておいた方が良い気がします。
インポート機能やプラグインなどで対応できるのかどうか？なども検討事項になるかな、と思います。

# データの持たせ方・分類

設計するときの肝になるのは（ざっくりとした表現ですが）データの持たせ方になると思います。

| | MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- | --- |
| マルチサイト・ブログ | マルチサイト | マルチサイト | マルチサイトいけないこともない？ | ブログ＞子ブログ | マルチサイト？ |
| コンテンツの種類 | コンテンツタイプ、記事、Webページ | セクション<br>（チャンネル、シングル、ストラクチャ） | コンテンツタイプ | エントリ | 記事、固定ページ<br>カスタム投稿タイプ |
| カテゴリ・タグ | カテゴリ、タグ | カテゴリ、タグ | タクソノミー | カテゴリ、タグ | カテゴリ、タグ |

データをどう分けておくと将来も使っていけるか？とか考えないといけないですね。
あとはワークフロー（承認フロー）とかが絡むこともあるので、それによる影響も考えたりしますね。
マルチサイトと書いちゃってますが、複数ドメインのサイトを持てる、という意味で使われる時もありますが、それらも含めた感じでひとまず書いてます。ブログ的なものを複数持てるというのも含めてます。

MT や a-blog はサイトの構成に合わせて複数サイト作ったり、ブログ作ったりすることが多い気がします。
（a-blog cms の場合はカテゴリで代用するといったこともあるようです。MTでもやることありますが。）

Craft の場合はとりあえずデータの箱としてセクションを作っておいてあとはどう見せるか？がテンプレート側での制御だったり、マルチサイトの時はセクションごとに使うかどうか？の設定になったりしますね。

Drupalもまずはコンテンツありきでコンテンツタイプを用意していくという使い方が多いのではないか？と思います。

# エントリ同士の関連付け

関連記事の選択に使われたり、データの分類に使われたり様々ありますが、必要な機能ですね。

| MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- |
| コンテンツタイプフィールド<br>プラグイン：[MTAppjQuery](https://bit-part.net/products/mtappjquery/)（MTAppListing） | エントリフィールド | リファレンス | 関連エントリー | プラグイン：[Advanced Custom Fields](https://www.advancedcustomfields.com/) |

データの種別として別のエントリー群を用意しておきそこから選択する、といったカテゴリ的な使い方もあると思います。
コンテンツを管理するという視点からは出来るだけデータの粒度は小さくしつつも、関連付けしやすくなっているというのはありがたいところかと思います。

カテゴリやタグ、サイト、という単位でまとめるのは当然ありですが、関連付けができるということはカテゴリとかがなくてもどうにかなる話だったりもします。

カテゴリ用のテンプレートがある、とか一覧ページがあるといった出力用の機能に合わせて何を選択するか？は変わってきそうですね。


# テーマ機能、URL、テンプレート

テンプレート類がまとまったものがテーマ機能とざっくりとは考えられると思います。

| MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- |
| あり | なし | あり | あり | あり |

WordPress が多く使われているのはCMSの機能とプラグイン、豊富なテーマが故かと思います。

テーマ機能はゼロからサイト構築する際は結局HTMLをCMS用に作り込んでいくことになるので、なくても良い話だったりはしますね。
DrupalとMTのテーマは結構似た感じの位置づけかな、という印象です。

MTの場合はテーマにマッピング（URL）も依存してくるのでそこが少々手間かもしれないです。
a-blog cms のテーマを継承する機能はWPの子テーマと似てる感じで便利な印象です。CMSがテーマ内をいい感じに置き換えて処理してくれるので、慣れが必要だなーと思いました。


## 出力されるURL

| MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- |
| テンプレートのマッピング | セクションの設定＋テンプレート | コンテンツタイプ、URLエイリアス | ブログ＋カテゴリ＋エントリの設定 | カテゴリ＋エントリ |

MTを使ってくることが長かったのであまり意識していなかったのですが、MTの場合は後述のテンプレートの種類が決まっていて、それをベースにURLが決まります。
静的CMSならではかもしれませんが、URLの指定の自由度が高いなぁと思うことが増えました。

Craft CMS も自由度は高いですね。
URLについては都度設定するのが楽な場合と、自動の方が楽な場合とがあると思うのでこの辺りは要件次第で変わってきますね。

リニューアル案件でURLをなるべく維持したいという要件がある場合はどう設計するか？を考えておく必要があるので重要な点かな、と思います。

## テンプレートの種類と書き方

| | MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- | --- |
| 書き方 | MTタグ | TwigとCraftのお作法 | Twig | a-blog cms のタグ | PHPとWPのタグ |
| テンプレートの種類 | インデックステンプレート<br>アーカイブテンプレート<br>テンプレートモジュール<br>システムテンプレート | 種類的なものは特になし | 全体用<br>ページ部分用<br>node用<br>他 | トップページ<br>一覧ページ<br>詳細ページ<br>他 | index.php<br>home.php<br>single.php<br>page.php<br>archive.php<br>他 |

MTのテンプレート種類が複数パターンあるってのは慣れないとわからないですが、マッピングの自由度がこれに繋がってきてるのでいい仕組みと思うことはあります。

Craft はtemplateディレクトリにおけばなんでもいけるので、その意味で自由度も高いですね。テンプレートの構成と表示のURLが近いのもわかりやすいです。ルーティングとか組み合わせれば色々できます。

a-blog cms はURLコンテキストに合わせられているので、設計時点でこの辺りまで理解しておかないとハマることがありそうです。ただ慣れてしまえばそのルールに乗っかるだけで良いのですごくわかりやすい仕組みかと思います。


# 管理画面カスタマイズ

CMS独自の管理画面でも問題ないですが、何かしら調整して欲しいと言われるのが管理画面ですね。

| MT | Craft | Drupal | a-blog | WP |
| --- | --- | --- | --- | --- |
| alt template<br>プラグイン：[MTAppjQuery](https://bit-part.net/products/mtappjquery/) | cp.css, cp.js<br>プラグインで画面追加。<br>オリジナルダッシュボード | 管理用テーマ。ダッシュボード | 標準機能 | ？ |

ユーザの権限によってメニューが増減するのは当然として、そこからどのくらい自由にカスタマイズして使いやすいCMSとして提供できるか？は製作者の腕の見せ所、考え所かと思います。

a-blog cms は標準でカスタマイズできるというメリットがありますが、CMS本体のアップデートの影響を受けるというところが悩ましいところです。

MTはその部分をalt tmplで補おうとしましたが、alt tmpl自体があくまで管理画面用であって難しいため、MTAppjQuery で管理画面をjs/cssで調整するニーズが続いてると思います。

Drupalは管理画面用のテーマも設定できるので柔軟性はたかそうです。この辺はまだまだ使いこなせていない領域なので今後やってみたいところです。

Craft CMS の管理画面カスタマイズは他に比べると難しいところがありそうだなー、という印象です。js,cssでやれることをやるというのMTAppjQueryに近いです。
管理画面内のページを追加する形で色々やれなくもない感じです。ただ、動的CMS ＆ RestAPI でオリジナルの管理画面が作りやすいという印象はあります。

---

あとは細かいところだと色々と違いがあったりしますね。

* 管理画面でのレイアウト機能の有無
* 1データごとの呼び方
* カスタムフィールドの作り方やデータ構造
* Drupalのviews的なもの。a-blog cms でのモジュールIDみたいなもの。
* 多言語対応のしやすさ
* 有償か無償か。オープンソースか、コードが読めるか
* 開発されている言語や拡張しやすさ
* 外部サービスとの連携のしやすさ
* バージョンアップとセキュリティ対応

---

ということで来年もまた色々なCMSを触るかもしれないですし、どれかに限定されるかもしれません。
どちらにしても使いやすいCMSを提供していければな、と思っています。

明日は [Movable Type Advent Calendar 2018](https://adventar.org/calendars/2900) は八木さん、 [a-blog cms Advent Calendar 2018](https://adventar.org/calendars/2948) は森田さんですね。どんなエントリーが上がってくるか楽しみです。

@BUN が細かく使い方を書いてくれている [Craft CMS Advent Calendar 2018](https://adventar.org/calendars/2941)、@Tinybeans が新機能の紹介を中心に書いてくれている [MTAppjQuery Advent Calendar 2018](https://adventar.org/calendars/3006)  も引き続き楽しみですね。
僕ももう1本ずつくらいは書ければな、と思っています。


# 書いた人について

* https://note.mu/mersy
    * https://note.mu/mersy/n/n43eb32725a89?current_menu_id=2570&creator_urlname=mersy
* https://note.mersy418.com/


