concrete5ブロック開発(3)パッケージ化する
Posted by admin at 17:53 日時 2015/01/28
多忙で前回の記事から1ヶ月空いてしまいましたが、続きです。前回までに開発した「Back to Top」ブロックをパッケージ化してみます。
パッケージ化とは、concrete5で使われる様々なカスタマイズを統合しバージョン管理するためのしくみです。前回の記事で、ブロックタイプのデータベース構造の変更を反映させるためにブロックタイプの「更新」ボタンをクリックしました。
ブロック1つだけであればこの手順でも問題なさそうですが、例えば複数のブロックをまとめて管理したい場合や、管理画面にブロックとは別に設定ページを作ったりする際は、まとめて管理した方が利便性が高くなります。
事前準備
まず、前回作成したブロックタイプをアンインストールします。ブロックタイプ一覧からBack to Topを選択し、削除ボタンをクリックしましょう。
個別にインストールしたブロックタイプのデータを、パッケージに移行することはできません。そのため、パッケージ化して管理する想定があれば、ブロック1つでも最初からパッケージとして 開発することをおすすめします。
パッケージディレクトリとコントローラーを作成
まず、パッケージを格納するディレクトリを作成します。パッケージディレクトリは
/packages/パッケージハンドル
という形式になります。ここでは、my_blocksというハンドルでパッケージを作成してみます。
/packages/my_blocks
パッケージには、必ずパッケージコントローラークラスが必要です。このクラスは、パッケージの名前やバージョンなどの基本情報を格納し、インストールやアンインストールの処理を記述するためのものです。パッケージコントローラークラスのファイル名は controller.php になりますので、今回の場合は
/packages/my_blocks/controller.php
になります。次にパッケージコントローラークラスの中身を示します。
<?php namespace Concrete\Package\MyBlocks; use BlockType; class Controller extends \Concrete\Core\Package\Package { protected $pkgHandle = 'my_blocks'; protected $appVersionRequired = '5.7.3'; protected $pkgVersion = '0.1'; public function getPackageName() { return t('My Blocks'); } public function getPackageDescription() { return t('Useful blocks package.'); } public function install() { // Run default install process $pkg = parent::install(); // Install block types BlockType::installBlockType('back_to_top', $pkg); } }
先頭行は名前空間の指定です。名前空間のルールは
Concrere\Package\パッケージハンドル
になります。パッケージハンドルは、先頭が大文字のキャメルケースに変換します。
パッケージコントローラークラスは、必ず \Concrete\Core\Package\Package クラスを継承するようにしてください。この親クラスがインストールやアンインストール時に必要なほとんどの処理を代行してくれますので、各パッケージコントローラークラスでは最小限の記述のみ書けば良いようになっています。
クラス変数 $pkgHandle は、パッケージハンドルを記載します。ディレクトリ名と合わせないと動きません。
クラス変数 $appVersionRequired は、このパッケージの動作に必要なconcrete5のバージョンを指定します。
クラス変数 $pkgVersion は、パッケージのバージョンを指定します。
以上の3つの変数は必須です。
メソッド getPackageName() は、パッケージの表示名を、getPackageDescription() はパッケージの説明文を返すようにしてください。上記の例では t() 関数を使って翻訳に対応しています。
メソッド install() には、インストール時の処理を記載します。冒頭で必ず $pkg = parent::install(); と記載し、親クラスのインストール処理を呼び出してください。インストールがうまくいけば、このパッケージコントローラークラス自身のインスタンスが返されます。
次に、パッケージて提供するブロックタイプのインストール処理を記載しています。ブロックタイプハンドルと、パッケージコントローラークラスのインスタンスを渡す必要があります。
BlockType::installBlockType('back_to_top', $pkg);
必要な処理としては以上です。とてもシンプルですね。
ブロックタイプの名前空間を修正
まず、作成したブロックタイプを /application ディレクトリから /packages/my_blocks ディレクトリに移動してください。そして、それに伴って名前空間を変更します。/application ディレクトリにあるときはこのようになっていましたが、
namespace Application\Block\BackToTop;
Application 部分をパッケージの名前空間に置き換えます。
namespace Concrete\Package\MyBlocks\Block\BackToTop;
ブロックタイプをパッケージで使う際に必要な変更はこの名前空間の変更のみです。
パッケージをインストールしてみましょう
[管理画面>concrete5を拡張>機能追加]ページにアクセスすると、いま作成したパッケージを発見できると思いますので、「インストール」ボタンをクリックしましょう。
これで完了です!ブロックタイプを個別にインストールした時と同様に、ブロックの追加パネルに「Back to Top」ブロックが出現していることを確認してください。
パッケージのアンインストール
機能追加のページでインストール済みのパッケージの「詳細」ボタンをクリックすると、パッケージのアンインストールができます。この際、パッケージコントローラークラス内で適切にインストール処理を行なっていれば、「ブロックタイプ」欄に、パッケージからインストールしたブロックタイプが表示されます。そのまま「パッケージをアンインストール」をクリックすると、画面に表示されたブロックタイプがパッケージと同時にアンインストールされます。このように、アンインストール時の処理はconcrete5が自動で行なってくれますので、煩わしいアンインストール処理を書く必要がありません。ただし、インストール時に独自にデータベーステーブルを追加したりしている場合は対応するアンインストール処理を uninstall() メソッドに記述する必要があります。uninstall() メソッドの中でも、親クラスのuninstall() メソッドを呼ぶことが必要です。
次回予告
次はブロックタイプのデータベース構造を変更し、パッケージのアップデートについて学びます。ついでに、ブロックの追加・編集でのデータのバリデーションについてもご紹介します。