[concrete5.6] ローカルで作成したDesigner Content Proのブロックを本番へ移行する
2016.03 24

cocrete5の強力なプラグイン、Designer Content Proで作成したブロックをローカルから本番環境へ移行するためのポイントを備忘録としてまとめました。

とても便利なDesigner Content Pro

Designer Content Pro(以下、DCP)は、concrete5でコンテンツを編集・レイアウトするための機能であるブロックを自分で拡張できるプラグインです。

これを利用することで、独自の入力フォームを持ったブロック(カスタムブロック)を作成することができます。

さらにカスタムブロックを作るために必要なプログラミングの量をほぼ無くしてくれるので、HTMLによる表現部分だけに集中することができ、デザイナーの画面作成やなクライアントの運用をサポートすることができます。

使い方・カスタマイズの参考

本番稼動しながらDCPブロックへ入れ替えたい

テスト環境でブロックを作って入れ込んでしまうと、本番環境でまた作成しなおさなくてはなりません。データベースのダンプで入れ替えても良いのですが、並行して稼働したい場合だと難航します。

メンテナンス時間を長くとっての移行はなるべく避けたいところです。

concrete5は下書き保存で変更後のプレビューができるので、本番サーバーは現状を維持しながら編集を進められます。

ローカルではブロックの動作のみ確認し、中身は本番サーバー上で入力して公開すれば、メンテナンス時間をかなり短縮できます。

テーマファイルには、ブロック化する前の内容を静的に埋め込んでおいて、そこに編集エリアを併記します。ブロックの追加と中身の入れ込みも、下書き状態であればログインユーザー以外には見えません。

内容がOKとなった段階で、静的に埋め込んだ部分を削除したテーマファイルを反映し、下書きを公開すれば入れ替えがスムーズです。

ブロックタイプを追加すると自動生成されるファイル群

  • /blocks/[block_hanle]/view.php
  • /packages/designer_content_pro_blocks/blocks/[block_handle]/
    • tools/edit_repeating_item.php
    • add.php
    • controller.php
    • db.xml
    • edit.php
    • view.php

ブロックタイプを追加した時点で、後述のインストールが自動で行われます。その際、データベース上のBlockTypesテーブルにブロックタイプについてのレコードが追加されます。

ブロックのインストール、アンインストール、削除

DCPで作成したブロックは、いつでもインストールとアンインストールができます。

インストール

自動生成されたファイルのうち、重要なのはdb.xmlです。インストール時にブロックハンドルのアンダースコアをキャメルケースにした名前で、ブロック用のテーブルをデータベース上に作成します。

テーブルの名前はブロックハンドルがtest_blockだとすると、btTestBlockとなります。

テーブル定義がdb.xmlで管理されることで、データベース上でテーブル編集など直接操作を行う必要がありません。

アンインストール

ページ内で作成したブロックを使用している場合はそれらも削除されてしまうので注意が必要です。

作成したブロックをアンインストールしても、テーブルや自動生成されたファイルは消えません。

削除

削除すると以下の内容が削除されます。
1. /blocks/[block_hanle]/view.php
2. /packages/designer_content_pro_blocks/blocks/[block_handle]
3. BlockTypesテーブルからブロックタイプのレコード

移行の手順

  1. DCPをインストール済みとして、自動生成されたファイルを本番サーバーへ同じディレクトリ構成でアップロードします。
  2. 管理画面からDCPのページへ移動すると、アップロードしたブロックがインストール待ちの状態で表示されます
  3. インストールをクリックします
  4. ページの編集エリアにブロックを追加しようとすると、DCPで作成したブロックが一覧に表示されています

この記事へのコメント

[5.6]concrete5のパッケージにLaravel5を組み込む
2015.04 20

[5.6]concrete5のパッケージにLaravel5を組み込む 環境 ディレクトリ構成は、CPI ACE01 SSHではphpコマンドを打てないので、ローカルで諸々の環境を作ってからサーバー上で展開 ローカルのPH […]

[5.6]concrete5のパッケージにLaravel5を組み込む

環境

  • ディレクトリ構成は、CPI ACE01
  • SSHではphpコマンドを打てないので、ローカルで諸々の環境を作ってからサーバー上で展開
  • ローカルのPHPはphpenvで環境にあわせてバージョンを指定
└── html
    ├── blocks
    ├── concrete
    ├── config
    ├── controllers
    ├── css
    ├── elements
    ├── files
    ├── helpers
    ├── jobs
    ├── js
    ├── languages
    ├── libraries
    ├── mail
    ├── models
    ├── packages
    ├── packages
    │   └── example
    │       ├── controllers
    │       │   └── dashboard
    │       │       └── example
    │       │           └── sandbox
    │       ├── laravel
    │       └── single_pages
    │           └── dashboard
    │               └── example
    │                   └── sandbox
    ├── page_types
    ├── single_pages
    ├── themes
    ├── tools
    └── updates

Laravel5の導入

composerインストール

  • プロジェクトのルートディレクトリにcomposerをインストール
  • ローカルで運用
> curl -sS https://getcomposer.org/installer | php

Laravel5のインストール

> php composer.phar create-project laravel/laravel html/packages/example/laravel --prefer-dist

composer.jsonにForm・HTMLヘルパーを追加

Upgrade Guide – Laravel – The PHP Framework For Web Artisans

    "require": {
        "laravel/framework": "5.0.*",
        "laravelcollective/html": "~5.0" // 追加
    },

Call to undefined method Illuminate\Foundation\Application::getCachedCompilePath()

先ほど追加したForm・HTMLヘルパーを入れるためにupdateを実行して上記エラーが出た場合の対処

Call to undefined method Illuminate\Foundation\Application::getCachedCompilePath() · Issue #8127 · laravel/framework

> rm vendor/compiled.php
> php composer.phar update

パッケージ内のコントローラーからLaravel5を読み込む

パッケージのパスを取得して、autoload.phpなどをrequireしていく
concrete5 :: Get the Package Path in a Dashboard Single Page Controller

<?php
defined('C5_EXECUTE') or die("Access Denied.");

use \App\User;

class DashboardExampleSandboxController extends DashboardBaseController {

    public $helpers = array('html', 'form');

    public $laravel;

    public function on_start() {
        parent::on_start();
        $packagePath = Package::getByID($this->c->pkgID)->getPackagePath();
        require $packagePath . '/laravel/bootstrap/autoload.php';
        $this->laravel = require_once $packagePath . '/laravel/bootstrap/app.php';
    }

    public function view() {
        // Laravel5標準の認証用ユーザーモデル
        $user = new User();
    }

まとめ

強引な方法だけれども、Laravel5内のリソースにアクセスできた。Eloquentも普通に使えるはずなので検証を継続。

もっとスマートな方法があれば情報求む。

情報提供

パッケージコントローラーのon_start()で読み込むとスッキリだった。あとはPSR-0準拠として、Laravel側のnamespaceを置き換えれば良さそう

この記事へのコメント

作者について

青森県内でソフトウェア・システム開発を行うフリーランスのプログラマー。元々は集中監視システム開発に従事。現在はウェブサイト製作・オンラインシステムの開発案件を中心に、プログラミングのスキルトレーニングや講演も行う。

TEL 0172-55-7030  FAX 0172-55-7031
10:00 - 18:00 土日祝休

恐れ入りますが、お急ぎの場合を除いて、メールにてお問い合わせください。