Blog

concrete5 アドオンの5.7対応例

Posted by admin at 14:47 日時 2014/12/06

拙作の、FacebookいいねやTwitterのツイートボタンを画面に表示できるブロックを提供するアドオン「Social Share Lite」を題材に、アドオンの5.7対応方法についてまとめてみます。あくまで、個別のアドオンでの話ですので、concrete5の全てのコンポーネントを使用しているわけではありませんが、参考にはなると思います。

ちなみに、5.7からはシェアボタンも標準機能で搭載されちゃったのですが、このアドオンははてブやLINEボタンがありまして日本仕様となっております!現在5.7のマーケットプレイスには申請済みの審査中ですが、GitHubのリポジトリにはプッシュ済みでコードが確認できます。

名前空間を宣言する

concrete5 バージョン7からの最も大きな違いは、名前空間の採用でしょう。PSRの採用によって、PHPの世界のライブラリやコンポーネントのロード方法が標準化され、開発の際に多大なメリットがもたらされた一方で、PSRに対応していない既存のconcrete5 バージョン6までのコードは動かなくなってしまいました。ただ、名前空間は書けばいいだけの話なので、難しく構える必要はありません。

パッケージコントローラー

ファイル位置は変更なし。

social_share_lite/controller.php

名前空間のルールは、

Concrete\Package\パッケージ名

です。パッケージ名は、パッケージハンドルの、先頭大文字のキャメルケースで表現します。

また、パッケージコントローラーのクラス名は Controller 固定になります。

5.6までの書き方

<?php  defined('C5_EXECUTE') or die(_("Access Denied."));    class SocialShareLitePackage extends Package {

5.7からの書き方

<?php  namespace Concrete\Package\SocialShareLite;    class Controller extends \Concrete\Core\Package\Package  {

シングルページコントローラー

ファイル位置が変更になりました。single_pagesが追加で挟まります。これ注意。

social_share_lite/controllers/dashboard/system/social_share_lite/settings.php

social_share_lite/controllers/single_page/dashboard/system/social_share_lite/settings.php

名前空間のルールは、

Concrete\Package\パッケージ名\Controller\SinglePage\ページパス

になります。

また、継承するクラスが DashboardBaseController から DashboardPageController に変更になってます。地味にハマりポイントなので注意。

5.6までの書き方

<?php defined('C5_EXECUTE') or die(_("Access Denied."));    class DashboardSystemSocialShareLiteSettingsController extends DashboardBaseController {

5.7からの書き方

<?php  namespace Concrete\Package\SocialShareLite\Controller\SinglePage\Dashboard\System\SocialShareLite;    use \Concrete\Core\Page\Controller\DashboardPageController;    class Settings extends DashboardPageController  {

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

ファイル位置は変更なし。

social_share_lite/blocks/social_share_lite/controller.php

名前空間のルールは、

Concrete\Package\パッケージ名\Block\ブロックタイプ名

になります。ブロックタイプ名はブロックタイプハンドルの先頭大文字のキャメルケースで表現します。

5.6までの書き方

<?php  defined('C5_EXECUTE') or die("Access Denied.");    class SocialShareLiteBlockController extends BlockController {

5.7からの書き方

<?php  namespace Concrete\Package\SocialShareLite\Block\SocialShareLite;    use Concrete\Core\Block\BlockController;    class Controller extends BlockController

外部の名前空間からファイルをロードする

名前空間の外のクラスを使用する際は、use 演算子でインポートすることができます。concrete5コアのクラスは基本的に Concrete 名前空間に属していますが、クラスエイリアスが定義されているクラスは

use Package;

の様に単独でインポートすることができます。クラスエイリアス定義は concrete/config/app.php に書かれています。

<?php  namespace Concrete\Package\SocialShareLite\Block\SocialShareLite;    use Concrete\Core\Block\BlockController;  use Package;  use Core;  use Page;  use Localization;    class Controller extends BlockController  {

Loader が非推奨になりました

5.6までのクラスローダークラス Loader が非推奨になり、Core クラスに置き換えることが推奨されています。と言っても、Loader クラスはコアでもまだまだ使われている箇所が残っていますが…。

5.6まで

$nh = Loader::helper('navigation');

5.7から

$nh = Core::make('helper/navigation');

Core クラスでロードできるクラスは、concrete/src ディレクトリ内の各コンポーネントごとのサービスプロバイダーにて定義されています。上記で言うと、concrete/src/Html/HtmlServiceProvider.php で定義されており、Core クラスから呼び出されるのが \Concrete\Core\Html\Service\Html クラスであることが分かります。

<?php  namespace Concrete\Core\Html;    use \Concrete\Core\Foundation\Service\Provider as ServiceProvider;    class HtmlServiceProvider extends ServiceProvider {        public function register() {          $singletons = array(              'helper/html' => '\Concrete\Core\Html\Service\Html',              'helper/overlay' => '\Concrete\Core\Html\Service\Overlay',              'helper/navigation' => '\Concrete\Core\Html\Service\Navigation',          );            foreach($singletons as $key => $value) {              $this->app->singleton($key, $value);          }            $this->app->bind('html/image', '\Concrete\Core\Html\Image');      }    }

なぜこのような回りくどいやり方になっているかと言うと、クラスのオーバーライドの仕組みが変更になったからなのですが、その詳細はまたの機会に。

一部の定数が無くなりました

PHPの定数はあとから変更ができない仕様のため、現在の言語など一部の定数が、パッケージなどから変更可能なように定数ではなくなりました。下記はその一例です。

5.6まで

echo LANGUAGE;  echo SITE;

5.7から

echo Localization::activeLanguage();  echo Config::get('concrete.site');

設定の保存方法が変わりました

パッケージから設定を保存したい場合に Config クラスを使ってできましたが、使い方が変わりました。設定キーも大文字を使った定数風な書き方が多かったように思いますが、全て小文字で、ドット(.)をつないで名前空間を定義するようになりました。名前空間の命名ルールは、まだドキュメントが公開されていないので、公開されたら追記します。

5.6まで

$pkg = Package::getByHandle('social_share_lite');  $co = new Config();  $co->setPackageObject($pkg);    // 値の取得  $example = $co->get('EXAMPLE');    // 値の保存  $co->save('EXAMPLE', $example);

5.7から

$pkg = Package::getByHandle('social_share_lite');    // 値の取得  $example = $pkg->getConfig()->get('concrete.example');    // 値の保存  $pkg->getConfig()->save('concrete.example', $example);

コーディングガイドラインが変わりました

5.7からは、PSR-2に準拠したコーディングが求められます。クラスやメソッドの開き括弧を次の行に書くなど、これまでのconcrete5のコーディングガイドラインから変化がありますが、標準化の流れには逆らえません。新しいガイドラインを覚えましょう。標準的なコーディングガイドラインなので、日本語での解説も検索すると色々出てきます。

ビューは?

これまでほとんどコントローラーの話をしてきました。ビューは、そのまま動きます。ただ、ご承知の通り管理画面のデザインも大幅に変わっていますので、5.7の管理画面のソースを見ながら、がんばって対応しましょう!


Share this entry

Blog Entry Topics