concrete5 を eZ Publish の視点から評価してみる

## はじめに
この記事は [concrete5 Japan Advent Calendar 2016](http://www.adventar.org/calendars/1439) の16日目の予定だった記事です。大遅刻で誠に申し訳ありません…。
15日目は大人気エジプト神像 [^egypt] の @sngazm さんによる「[今からconcrete5でWebサイトを作るWebデザイナーに伝えておきたいこと](http://qiita.com/sngazm/items/f9117387d69f73a07e1a)」で、図入りで大変参考になる内容でした。

[^egypt]: http://qiita.com/sngazm/items/c27b7745fb68139213c2

普段は eZ Publish をはじめとしたオープンソース CMS 全般を用いたサイト構築の支援を主に行っています。

この記事では eZ Publish など他の CMS と比較することで、concrete5 を相対的に評価し得手不得手を確認してみたいと思います。concrete5 は実案件での利用経験がないため、事実との相違があればコメントいただけると幸いです。

##  eZ Publish とは
eZ Publish とは、ノルウェー王国の eZ Systems 社によって Concrete の4年前の1999年から PHP で開発されているエンタープライズ向けオープンソース CMS です。
conrete5 で言うところの「エクスプレス」のような「クラス（またはコンテンツタイプ）」という概念があるなど汎用性の高い CMS となっています。

次期バージョンの eZ Platform からは、concrete5 でも一部ライブラリーとして利用しているフレームワークの Symfony をフルスタックで採用しています。

詳しくは「[エンタープライズ向けオープンソースCMS「eZ Publish」の概要](http://qiita.com/bezeklik/items/5faf803ab30c9254a167)」などをご覧ください。

## シェア
CMS Market Share によると concrete5 は7位、eZ Publish は14位となっています。 [^share]

![cms-market-share.png](https://qiita-image-store.s3.amazonaws.com/0/15175/a5492a64-844e-458b-040b-43221caf656b.png)

[^share]: http://www.opensourcecms.com/general/cms-marketshare.php

## システム要件
公式サポートは Web サーバーは Apache のみ、DB は MySQL のみのようで、このあたり eZ Publish だけでなく他の CMS 全般と比べても少し寂しいところでしょうか。 [^c5-requirements] [^ezp54-requirements] [^ezplatform-requirements]

ミドルウェア|conrete5 Ver.8 |concrete5 Ver.7 |eZ Platform|eZ Publish 5
------:|:-------:|:--------:|:---------:|:----------:
Apache | 2.0以上 | 2.0以上   |2.2, 2.4   |2.2, 2.4
nginx  | ?        | ?         |1.4, 1.6, 1.8. 1.10|1.4以上
PHP    |5.5.9以上 |5.3.3以上 |5.5以上    |5.4.4以上
MySQL  |5.1.5以上 |5.1.5以上 |5.5, 5.6   |○
MariaDB|?|?|5.5, 10.0  |○
PostgreSQL|-|-|experimental|○

[^c5-requirements]: http://documentation.concrete5.org/developers/installation/system-requirements
[^ezp54-requirements]: https://doc.ez.no/display/EZP/Requirements+5.4
[^ezplatform-requirements]: https://doc.ez.no/pages/viewpage.action?pageId=31429536

## インストール
concrete5 はファイルをアップロードするだけでインストール可能でとても簡単です。このセットアップの容易さはデザイナーなどに対する敷居を下げる非常に良いものに思われます。
eZ Publish [^ezp-install] や Drupal [^drupal-install]、WordPress などは Composer や専用シェルコマンド、Yum などのパッケージ管理システムを利用することで簡易にインストールできます。

[^ezp-install]: http://qiita.com/bezeklik/items/95cf590a267d3c848185
[^drupal-install]: http://qiita.com/bezeklik/items/7ac71be49a1959b38b1f

## アドオン数
concrete5 の公開されているモジュール数は 5.7 以上の互換が 334 件で、eZ Publish のエクステンション（またはバンドル）数は 1,309 件となっており、純粋に数だけだとやや物足りない状況のようです。

ただし、concrete5 の場合は Drupal や WordPress のようにアドオンが公式サイトで管理画面と連携した形で管理されており、有償アドオンがマーケットプレイスで販売されているため、機能補完という面ではそこまで見劣りするものではないかもしれません。有償アドオンの比率の高さも特徴的かと思います。

## Symfony
concrete5 では 5.7 から Symfony および Laravel がコンポーネントとして採用されました。 eZ Publish は 5.0 からフルスタックで、Drupal は 8 からコンポーネントとして Symfony を採用しており、重量級の CMS では採用が常識となりました。

フレームワークとしての堅牢さを優先したフルスタック採用の eZ Publish と異なり、concrete5 と Drupal はコンポーネントとしてライブラリー的利用をしており、後方互換を考慮したバランスの良い選択と言えるでしょう。

## コンソールコマンド
concrete5 では 5.7.5 から Symfony の Console コンポーネントでコンソールコマンドが実装されたようです。 [^console]

```bash
concrete/bin/concrete5 list
```

ドキュメントルートで上記を実行するとコマンド一覧が表示されます。
サイトのセットアップやリセット、バージョンアップ、パッケージのインストールなどが可能なようです。

```
concrete5 version 8.0.3

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  help                            Displays help for a command
  list                            Lists commands
 c5
  c5:clear-cache                  Clear the concrete5 cache
  c5:compare-schema               Compares db.xml in concrete5 XML schema, concrete5 entities, and all installed package schemas and entities with the contents of the database and prints the difference.
  c5:config                       Set or get configuration parameters.
  c5:exec                         Execute a PHP script within the concrete5 environment
  c5:ide-symbols                  Generate IDE symbols
  c5:info                         Get server and concrete5 detailed informations.
  c5:install                      Install concrete5
  c5:job                          Run a concrete5 job
  c5:package-install              Install a concrete5 package
  c5:package-pack                 Process a package (expand PHP short tags, compile icons and translations, create zip archive)
  c5:package-translate            Creates or updates translations of a concrete5 package
  c5:package-uninstall            Uninstall a concrete5 package
  c5:package-update               Update a concrete5 package
  c5:reset                        Reset the concrete5 installation, deleting files and emptying the database
  c5:service                      Check or update the web server configuration
  c5:update                       Runs all database migrations to bring the concrete5 installation up to date.
 dbal
  dbal:import                     Import SQL file(s) directly to Database.
  dbal:run-sql                    Executes arbitrary SQL directly from the command line.
 migrations
  migrations:diff                 Generate a migration by comparing your current database to your mapping information.
  migrations:execute              Execute a single migration version up or down manually.
  migrations:generate             Generate a blank migration class.
  migrations:migrate              Execute a migration to a specified version or the latest available version.
  migrations:status               View the status of a set of migrations.
  migrations:version              Manually add and delete migration versions from the version table.
 orm
  orm:clear-cache:metadata        Clear all metadata cache of the various cache drivers.
  orm:clear-cache:query           Clear all query cache of the various cache drivers.
  orm:clear-cache:result          Clear all result cache of the various cache drivers.
  orm:convert-d1-schema           Converts Doctrine 1.X schema into a Doctrine 2.X schema.
  orm:convert-mapping             Convert mapping information between supported formats.
  orm:convert:d1-schema           Converts Doctrine 1.X schema into a Doctrine 2.X schema.
  orm:convert:mapping             Convert mapping information between supported formats.
  orm:ensure-production-settings  Verify that Doctrine is properly configured for a production environment.
  orm:generate-entities           Generate entity classes and method stubs from your mapping information.
  orm:generate-proxies            Generates proxy classes for entity classes.
  orm:generate-repositories       Generate repository classes from your mapping information.
  orm:generate:entities           Generate entity classes and method stubs from your mapping information.
  orm:generate:proxies            Generates proxy classes for entity classes.
  orm:generate:repositories       Generate repository classes from your mapping information.
  orm:info                        Show basic information about all mapped entities
  orm:mapping:describe            Display information about mapped objects
  orm:run-dql                     Executes arbitrary DQL directly from the command line.
  orm:schema-tool:create          Processes the schema and either create it directly on EntityManager Storage Connection or generate the SQL output.
  orm:schema-tool:drop            Drop the complete database schema of EntityManager Storage Connection or generate the corresponding SQL output.
  orm:schema-tool:update          Executes (or dumps) the SQL needed to update the database schema to match the current mapping metadata.
  orm:validate-schema             Validate the mapping files.
```

eZ Publish では eep および Symfony Console によるコマンドがあります。また、 Drupal には Drush と Drush Console、WordPress には wp-cli があります。

[^console]: http://documentation.concrete5.org/developers/appendix/cli-commands

concrete5 ではコンソールだけでアドオンはインストールできないようで、concrete5 コミュニティに接続してアドオンをダウンロードするところまでは Web 画面上での操作が必要なようです。その後は `concrete/bin/concrete5 c5:package-install <package-name>` でインストールできるので、アドオンがダウンロードまでされていればオンオフはコンソールでできるといった意味合いになるかと思います。

eZ Publish は Composer や Git によるインストールがメインで、こちらも少々自動化には弱い部分になります。
Drupal や WordPress ではコンソールからモジュール（プラグイン）がワンコマンドでダウンロードからインストールまで可能なので、 concrete5 ももう一声という感じでしょうか。またデータ操作などがまだ充実していないのが惜しいところです。

## 検索
機能の検索ができるのはいいですね。地味に他の CMS ではあまり実装されていないように思います。

![c5_search.png](https://qiita-image-store.s3.amazonaws.com/0/15175/95d615cf-cd1f-d626-022a-b2ee8cecc72c.png)

代わりに eZ Publish では各コンテンツへのショートカットを作成できますが、concrete5 ではそういったものはないのかな。

## ファイルマネージャー
階層移動がダブルクリックだったり、コンテキストメニューが右クリックなど Web インターフェースとしてはやや違和感のある作りになっています。
また、ファイルに関してはツリー表示は出来ないのが残念な部分です。

### ファイルの追加
incoming ディレクトリやリモートファイルなどがデフォルトで用意されているのは他の CMS のデフォルトでは見かけない便利機能ですね。

### サムネイル
画像ファイルのサムネイルの切り抜き位置を管理画面上で指定できる機能は他の CMS ではなかなか見かけないので、デザイン重視のサイトには貴重なものに感じます。

## ユーザー管理 (メンバー)
concrete5 では 5.7 からユーザーグループが多段階層で作成できます。この機能は eZ Publish では当初より実現されていますが、 Drupal や WordPress にはデフォルトで存在しておらず、大量のユーザーや複雑なグループを管理する必要がある場合は優位な点の一つです。
「グループセット」はいまいち使い道がよくわかりません。

ユーザーをツリー表示で探せないのと、カスタム属性が追加できないのは少し残念ですね。eZ Publish ではユーザーもクラス（コンテンツタイプ）のひとつなので、属性（フィールド）の自由な追加ができます。

また、コミュニティサイトの構築が想定されているのか、ユーザー同士でメッセージを送信できる機能が実装されているのも他 CMS にはない特徴です。

本筋ではない細かい話ですが、管理画面の「Members」（メンバー）というカテゴライズは感覚的に分かりづらい…。

## 権限
### 編集権限
上級者モードにしてしまうとページ単位で個別に設定するしかなくなるようで、これは少々しんどいものがあります。
とはいえ、eZ Publish は同等に細かく権限設定できますが、Drupal や WordPress ではなかなかそうもいかないので、権限管理は優位な点と思います。

### アクセスエンティティ
権限の時間指定ができるアクセスエンティティの概念は他の CMS では見かけない特徴的な機能です。

### ワークフロー
承認待ちかどうかの状態が非常に分かりづらく感じました。

eZ Publish では多段承認などのワークフローが可能ですが concrete5 で可能なのかは検証できませんでした。

## バージョン履歴
指定したバージョンをタブで切り替えてプレビューできるのはかなり便利な機能に思います。
ただ、eZ Publish や WordPress のような差分表示がないようなので、そこはもう一声というところでしょうか。

## 多言語対応
管理画面の多言語対応については [transifex](https://www.transifex.com/concrete5/concrete5/) で管理されていて、言語翻訳に参加しやすくなっています。
またログイン時に言語を選べるようにするオプションがあるなど、多国籍での利用がしやすくなっているのは優位な点と思わます。
ただ、ページタイプやエクスプレスなどで多言語ラベルが考慮されておらずちょっと残念ですね。

コンテンツの多言語対応は別言語のサイトを構築するイメージで、言語ごとに内容や構造が異なる場合は有効かと思いますが、同一コンテンツの多言語展開の場合は管理が辛くなるように思います。
このあたりは、項目ごとに各言語データを保持できる eZ Publish の方が向いているかもしれません。

## エクスプレス（データオブジェクト）
concrete5 Version 8 から実装されたエクスプレスによって汎用的なデータ管理が可能になりました。
eZ Publish では当初から設計されているクラス（コンテンツタイプ）、Drupal では 7 で導入されたエンティティと似た概念になります。

PHP フレームワークのようにアソシエーションを指定できるのはなかなか攻めているように思います。

## ページタイプ
eZ Publish ではクラス（コンテンツタイプ）、Drupal ではコンテンツタイプ（エンティティ）、WordPress ではカスタム投稿タイプと呼ばれています。
WordPress ではカスタム投稿タイプをまだデフォルトでは管理画面から増やせないようです。


## 属性
eZ Publish では同じく属性（またはフィールド）、WordPress や Drupal ではカスタムフィールドと呼ばれます。

## スタックとブロック
何と言ってもこのブロックの概念が concrete5 の特徴ではないでしょうか。プロダクト名にも暗喩されていますしね。商用 CMS だとサイトパブリスが、オープンソースだと pimcore が近いように思います。

eZ Publish でも eZ Flow というブロック概念を採用した機能がありますが、concrete5 ほど使いやすく仕上がっていません。

ただ、このブロックの概念はコンテンツの汎用性が高くなるため、コンテンツ管理という面では要求されるスキルが高くなってしまいます。
15日の記事のように、先々をよく検討して慎重に設計する必要が出てくるかと思います。

## まとめ
全体的にデフォルトでかなりの機能が実装されており、細かい便利機能もあちらこちらにあり想像以上に高機能という印象でした。

その分 CMS 自体の制約を受けやすく、案件への適用は向き不向きを慎重に見極めて、事前によく設計を考えないと余計な工数がかかってしまいそうです。また設定等も細かく指定できる分、網羅的に把握調整するインターフェースが十分とは言えない現状では、事前によく設計しておかないと調整に手間がかかりそうです。

純粋なビジュアル面でのリッチさや汎用性の高さはブロックの概念が似た後発の [pimcore](http://qiita.com/bezeklik/items/1aed99d3a68367be7a2b) が優位かと思いますが、利用のしやすさと機能の網羅性を考えるとやはり concrete5 が採用しやすいように感じました。

eZ Publish との比較という点では、多言語対応とワークフローおよび権限に関しては concrete5 ももう一声という感じでしたが、それ以外の点ではよく作り込まれており、コンテンツ編集者が積極的にあるいは自由にオペレーションするサイトには特に優位かと思います。

テンプレートやアドオンの実装面も触れたかったのですが、まったくもって追いつきませんでしたので、別の機会に触れられればと思います。

17日目の記事はみるくさんによる「[concrete5テーマ開発にgulp.jsを導入してみました。](https://white-stage.com/article.php/concrete5-gulp)」です（でした）。

## 参照文献