オープンソースCMS concrete5 には、バージョン6(5.6.x)までのレガシーバージョンと、バージョン7(5.7.x, 8.x)以降のモダンバージョンがあり、相互の互換性はありません。そのため、バージョンアップはできず、レガシーで作成されたサイトはモダンバージョンにコンテンツ移行する必要があり、テーマもモダンバージョンで動くように改修する必要があります。レガシーバージョンのサポート期限が2019年8月24日に迫っていますので、弊社では様々なお客様で移行のお手伝いを行なっておりますが、技術的な改修方法についてオープンに残しておきたいと思います。
レガシーテーマからモダンテーマに改修するポイントのまとめ
ここで紹介するのは、最新の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
に変わっただけです。
<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')?>" />
<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 Loader::element('header_required'); ?>
<?php View::element('header_required'); ?>
廃止になった定数の置き換え
現在の表示言語
<html lang="<?php echo LANGUAGE?>">
<html lang="<?php echo Localization::activeLanguage() ?>">
サイト名
// サイト名を定数から取得
echo h(SITE);
// 現在のサイトオブジェクトからサイト名を取得
echo h(Core::make('site')->getSite()->getSiteName());
ラッパークラスの追加
モダンバージョンで編集インターフェースが大きく変わったことによる仕様変更です。
/**
* <body> の直後に追加
*/
<div class="<?php echo $c->getPageWrapperClass()?>">
</div>
/**
* <?php View::element('footer_required'); ?> の直前に追加
*/
URLの取得方法の変更
echo $this->url('/login');
echo URL::to('/login');
設定値の読み込み方の変更
Config
クラスの使い方が変わっただけでなく、設定キーも大文字から小文字に変わったりと、少し改修の手間がかかる部分です。
$u = new User();
// ユーザープロフィール機能がオンになっているかで条件分岐
if (Config::get("ENABLE_USER_PROFILES")) {
$userName = '<a href="' . $this->url('/profile') . '">' . $u->getUserName() . '</a>';
} else {
$userName = $u->getUserName();
}
$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
のみですが、エラー表示の位置がテンプレート内に記載されており、その記述も少し変わっているので、新しい書き方に合わせてください。変えなくても一応動きます。
Loader::element('system_errors', array('error' => $error));
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日本語公式サイトの解説記事「画像のサムネイルを取得する(画像をリサイズする)」を参考にしてください。