Blog

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() メソッドを呼ぶことが必要です。

パッケージのアンインストール

次回予告

次はブロックタイプのデータベース構造を変更し、パッケージのアップデートについて学びます。ついでに、ブロックの追加・編集でのデータのバリデーションについてもご紹介します。


Share this entry