concrete5 レガシーバージョンのカスタムブロックをモダンバージョンで動くように手直しする

菱川拓郎
菱川拓郎

concrete5 のレガシーバージョン用に開発したブロックタイプを、モダンバージョン(Version 8.x)で動くようにする方法の解説です。前回「concrete5レガシーバージョンのDesigner Content製ブロックをモダンバージョンのBlock Developer製ブロックに移行する」と言う記事で、アドオンを使ってブロックを開発していた場合の方法をご紹介しましたが、今回はアドオンを使わず、独自に開発していた場合になります。レガシーバージョンとは?などの用語の解説は、前回の記事に記載していますので、ご覧ください。

今回の解説にあたって、レガシー版のドキュメント「Creating a New Block Type」からダウンロードできるサンプルブロックを使います。このサンプルブロックをインストールすると、本記事のサムネイル画像のような1つの入力欄があるブロックタイプが利用できるようになります。このレガシー版のドキュメントもいつなくなるか分からないので、本記事からもダウンロードできるようにしておきます。

ブロックタイプファイルの設置場所の変更

レガシーバージョンでは /blocks または /packages/your_package_handle/blocks 内に格納されていましたが、モダンバージョンでは設置場所が変更になりました。パッケージ内は変更がありませんが、パッケージ外の設置場所が /application/blocks に変更になりました。

データベース定義ファイルの修正

正しい場所にファイルを設置できたら、まず、ブロックタイプのデータベース定義を行う db.xml を修正しましょう。レガシーバージョンでは、レガシーバージョンまでで使用していた ADODB ライブラリと互換性のある、AXLMS と言う形式の XML ファイルでデータベース構造を定義していました。

Creating and Working with db.xml Files :: Legacy Documentation

モダンバージョンでは、ADODB ライブラリの利用が廃止され、代わりに Doctrine が使われるようになりました。データベース定義ファイルも、独自開発された Doctrine と互換性のある Doctrine XML 形式で表現するように変わりました。

Doctrine XML

この形式の変更に合わせて書き換えが発生するのですが、ご心配なく。変換ツールが用意されています。

下記URLにアクセスし、「Convert from AXLMS」ボタンを押し、古いXMLをペーストすれば、自動的に Doctrine XML 形式の変換されます。

http://concrete5.github.io/doctrine-xml/

ダウンロードしたサンプルブロックの db.xml はこのようになっていますが、

<?xml version="1.0"?>
<schema version="0.3">
	<table name="btBasicTest">
		<field name="bID" type="I">
			<key />
			<unsigned />
		</field>
		<field name="content" type="X2">
			<default value="" />
		</field>
	</table>
</schema>

ツールを使って Doctrine XML に変換すると、下記のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<schema
  xmlns="http://www.concrete5.org/doctrine-xml/0.5"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.concrete5.org/doctrine-xml/0.5 http://concrete5.github.io/doctrine-xml/doctrine-xml-0.5.xsd"
>

  <table name="btBasicTest">
    <field name="bID" type="integer">
      <unsigned/>
      <key/>
    </field>
    <field name="content" type="text">
      <default value=""/>
    </field>
  </table>

</schema>

データベース定義ファイルの修正は、これで完了です。簡単ですね。

ブロックタイプコントローラーの修正

次に、controller.php を修正しましょう。レガシーバージョンでは、このようになっていました。

<?php defined('C5_EXECUTE') or die(_("Access Denied."));
	
class BasicTestBlockController extends BlockController {
	
	protected $btTable = "btBasicTest";
	protected $btInterfaceWidth = "350";
	protected $btInterfaceHeight = "300";

	public function getBlockTypeName() {
		return t('Basic Test');
	}

	public function getBlockTypeDescription() {
		return t('A simple testing block for developers');
	}
}

モダンバージョンでは、PHPの記述方法もモダンに変わりまして、クラス名に名前空間が導入されました。

レガシー: YourBlockTypeNameController

モダン: Application\Block\YourBlockTypeName\Controller または Package\YourPackageName\Block\YourBlockTypeName\Controller

また、継承するベースの BlockController クラスも、 Concrete\Core\Block\BlockController に変わりました。

ただ、素晴らしいことに、この名前空間の変更以外は、原則変わっていません!

<?php
namespace Application\Block\BasicText;

use Concrete\Core\Block\BlockController;

class Controller extends BlockController
{
    protected $btTable = 'btBasicTest';
    protected $btInterfaceWidth = '350';
    protected $btInterfaceHeight = '300';

    public function getBlockTypeName()
    {
        return t('Basic Test');
    }

    public function getBlockTypeDescription()
    {
        return t('A simple testing block for developers');
    }
}

名前空間の変更が終われば、もうモダンバージョンで動くようになりました。

Screen Shot 2020-05-24 at 7.54.05.png

もちろん、レガシーバージョンとモダンバージョンでは、完全な互換性はありませんので、細かいところでエラーになったり動かなくなることはあるかと思います。エラーが発生した時は、公式ドキュメント A Guide to 5.7 for Existing Concrete5 Developers を参考に、古い記述を直してみてください。

とはいえ、ほとんどのコードがそのままで動くと言うのは、とても素晴らしいことです。レガシーバージョンのサポートが切れて、モダンバージョンに移行するか迷っている方は、ぜひ concrete5 を使い続けることをご検討ください!