concrete5 レガシーバージョンのテーマをモダンバージョンで動くように改造する手順

オープンソースCMS **concrete5** には、バージョン6（5.6.x）までのレガシーバージョンと、バージョン7（5.7.x, 8.x）以降のモダンバージョンがあり、相互の互換性はありません。そのため、バージョンアップはできず、レガシーで作成されたサイトはモダンバージョンにコンテンツ移行する必要があり、テーマもモダンバージョンで動くように改修する必要があります。[レガシーバージョンのサポート期限が2019年8月24日に迫っています](https://www.concrete5.org/about/blog/community-blog/official-end-life-concrete5-version-6x)ので、弊社では様々なお客様で移行のお手伝いを行なっておりますが、技術的な改修方法についてオープンに残しておきたいと思います。

# レガシーテーマからモダンテーマに改修するポイントのまとめ

ここで紹介するのは、最新の8.xに対応させる方法です。バージョン7とバージョン8も多少違うのですが、前者の解説は割愛します。

## ディレクトリの移動

レガシーconcrete5ではテーマは `/themes` ディレクトリに置かれていましたが、モダンconcrete5では `/application/themes` ディレクトリになります。

とりあえず、テーマ全体をサクッとコピーしましょう。

```
$ cp -r /path/to/legacy/concrete/themes/greek_yogurt/ /path/to/modern/application/themes/greek_yogurt/
```

この記事ではレガシーconcrete5に同梱されていた "Greek Yogurt" テーマをコピーしているので `concrete/themes` の中からコピーしていますが、自作テーマであれば `themes` ですし、マーケットプレイスのテーマであれば `packages/package_handle/themes` の中にあります。適宜読み替えてください。

## CSS, JS などのアセットのパスを通すコードの修正

変えなくても動きますが、古い書き方は非推奨になりましたので、新しい書き方に合わせておきましょう。`$this`が`$view`に変わっただけです。

```php:レガシー
<link rel="stylesheet" href="<?php echo $this->getThemePath(); ?>/css/reset.css" />
<link rel="stylesheet" media="screen" type="text/css" href="<?php echo $this->getStyleSheet('main.css')?>" />
```

```php:モダン
<link rel="stylesheet" href="<?php echo $view->getThemePath(); ?>/css/reset.css" />
<link rel="stylesheet" media="screen" type="text/css" href="<?php echo $view->getStyleSheet('main.css')?>" />
```

## JavaScriptアセットを読み込む記述の置き換え

これもやらなくても動きますが、以下略

```php:レガシー
<?php Loader::element('header_required'); ?>
```

```php:モダン
<?php View::element('header_required'); ?>
```

## 廃止になった定数の置き換え

### 現在の表示言語

```php:レガシー
<html lang="<?php echo LANGUAGE?>">
```

```php:モダン
<html lang="<?php echo Localization::activeLanguage() ?>">
```

### サイト名

```php:レガシー
// サイト名を定数から取得
echo h(SITE);
```

```php:モダン
// 現在のサイトオブジェクトからサイト名を取得
echo h(Core::make('site')->getSite()->getSiteName());
```

## ラッパークラスの追加

モダンバージョンで編集インターフェースが大きく変わったことによる仕様変更です。

```php
/**
 * <body> の直後に追加
 */
<div class="<?php echo $c->getPageWrapperClass()?>">
```

```php
</div>
/**
 * <?php View::element('footer_required'); ?> の直前に追加
 */
```

## URLの取得方法の変更

```php:レガシー
echo $this->url('/login');
```

```php:モダン
echo URL::to('/login');
```

## 設定値の読み込み方の変更

`Config` クラスの使い方が変わっただけでなく、設定キーも大文字から小文字に変わったりと、少し改修の手間がかかる部分です。

```php:レガシー
$u = new User();
// ユーザープロフィール機能がオンになっているかで条件分岐
if (Config::get("ENABLE_USER_PROFILES")) {
    $userName = '<a href="' . $this->url('/profile') . '">' . $u->getUserName() . '</a>';
} else {
    $userName = $u->getUserName();
}
```

```php:モダン
$u = new User();
// 現在のサイトオブジェクトを取得
$site = Core::make("site")->getSite();
// 設定リポジトリを取得
$config = $site->getConfigRepository();
// ユーザープロフィール機能がオンになっているかで条件分岐
if (is_object($site) && $config->get('user.profiles_enabled')) {
    $userName = '<a href="' . URL::to('/account') . '">' . $u->getUserName() . '</a>';
} else {
    $userName = $u->getUserName();
}
```

## システムエラーの呼び出し方の変更

シングルページを表示するための `view.php` のみですが、エラー表示の位置がテンプレート内に記載されており、その記述も少し変わっているので、新しい書き方に合わせてください。変えなくても一応動きます。

```php:レガシー
Loader::element('system_errors', array('error' => $error));
```

```php:モダン
View::element('system_errors', [
    'format' => 'block',
    'error' => isset($error) ? $error : null,
    'success' => isset($success) ? $success : null,
    'message' => isset($message) ? $message : null,
]);
```

## 以上

このくらいの変更で、レガシーテーマもモダンconcrete5で動くようになります。ぶっちゃけ、変えなくても動く部分はそのままにしておいて当面は問題ないので、ちょっとした修正程度で最新版でも動かすことができます。

# ブロックテンプレートは？

ここまでテーマについてご紹介してきましたが、ブロックのカスタムテンプレートも、気にするところは同じですので、ほとんど修正することなく動くと思います。

ただし、サムネイルの取得方法については、レガシーconcrete5の`image`ヘルパーを使う方法は非推奨になっていますので、新しいやり方に変更できるときにしておきましょう。

詳しくは、concrete5日本語公式サイトの解説記事「[画像のサムネイルを取得する（画像をリサイズする）](https://concrete5-japan.org/help/5-7/recipes/how-to-get-thumbnail-image/)」を参考にしてください。