PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 16:08

1Packageで複数Blockを持つPackageを作成中です。

作り始めの時は、Blockが増えるたびに一度Packageをアンインストールして、
更新したPackageをサーバにアップデートしてからインストールして動作検証をしてきました。

そろそろ、検証し終わったBlockが多くなってきたので
PackageのバージョンアップでBlockを追加していこうかと思い、
Packageのcontroller.phpに追加したいBlock名を追記してバージョン番号を増やし、
管理画面よりPackageのアップデートをしたのですが、
追記したBlock名が増えませんでした。

ひょっとして、PackageのアップデートではBlockの追加は出来ないのでしょうか。

ちなみに同じPackageを新規でインストールすると追加したかったBlockもインストールされます。

タグ:

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 16:21
1Packageで複数Blockを持つPackageというのがよくわかりません。
どのようなものなんでしょうか。
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 16:45
tomoacさん、こんにちは。

今作成しているpackegeはこのようなディレクトリ構成で作成しています。
blocksの下にはこれから100前後のblockが増えていきますので
packegeのアップデートで認識されなかったら、packegeを分けて
行かないといけないなぁと思った次第です。

ただ、packegesの下のmodelsやcontrollersにpackege全体で使う
共通のclassがあるのでちょっと困っています。

packeges
 org_packeges_name
  themes
  models
  controllers
  blocks
   block001
   block002
   block003
   ...
   ...
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 16:54
一つのパッケージで、100近いブロックというのは驚きですね。
参考にですが、1つブロックで、設定を変えて100の挙動というのではだめなんですか?

ちなみに、他のパッケージのモデルを横から使うことはできますよ。
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 17:21
設定やパラメータでViewを切り替えるのもNGな設計にしているので
(例えば照会と入力は別のBlockにしています)
1つのBlockで複数の挙動をと言うのは今回は採用できないですねぇ(^^;

今回は共通modelとcontrollerを持つPackegeと
それ以外のある程度の塊で分けたPackegeにするべきでしょうね。
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 16:56
アップデート時にブロックが増えるケースが思いつかないので事例をお伝えできないのですが、インストール時にブロックを追加するものはたくさんあると思います。

public function install() {
$pkg = parent::install();

// install block
BlockType::installBlockTypeFromPackage('block_name', $pkg);
}


これと同じことをupdateメソッドでやれば行けると思います!
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 17:40
作成班と検証班でわかれて作業をしていて、Packegeの更新のたびに
アンインストール・新規インストールを繰りかえしていて、
そのたびにBlockが消えてしまうので、検証班が音を上げてしまいました(^^;

今、Packege.php を読んでいたのですが、interfaceにはinstallとuninstallしかないようですね。

interface Installable {

public function install();
public function uninstall();

}

管理画面でアップデートが実行された時に、BlockListを読み直して
refreshしているようですが、BlockListに追加するタイミングがないような気がします(^^;

public function upgrade() {
Package::installDB($this->getPackagePath() . '/' . FILENAME_PACKAGE_DB);
// now we refresh all blocks
$items = $this->getPackageItems();
if (is_array($items['block_types'])) {
foreach($items['block_types'] as $item) {
$item->refresh();
}
}
}
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 18:05
updateじゃなくてupgradeメソッドでした。。
やったことはないですが作成したパッケージのcontrollerでupgradeメソッドを継承してブロックをインストールすればいいと思います。
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 18:15
あぁ、そうですね!
Upgradeメソッドを継承して、InstallBlockをしてから本来のUpgradeメソッドに処理を返せばいいですね!

色々考えた結果、共通Packegeと各機能ごとのPackegeに分けて、
あらかじめ使うであろうBlockを先に枠だけ作っておくようにしました。

ありがとうございました!
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 19:34
乗り遅れましたがpackageで複数ブロックのインストール、アップデートはできます。
ただ、同じ様な機能のブロックを大量に作ると、DBのレコードが無駄に増えたりとパフォーマンスが良くない様な気がします。

参考までに僕がやってるコードを書いておきます。


public function install(){
$pkg = parent::install();
Loader::model('job');

// Install Block
BlockType::installBlockTypeFromPackage('block_handle1', $pkg);
BlockType::installBlockTypeFromPackage('block_handle2', $pkg);
BlockType::installBlockTypeFromPackage('block_handle3', $pkg);
BlockType::installBlockTypeFromPackage('block_handle4', $pkg);
BlockType::installBlockTypeFromPackage('block_handle5', $pkg);

//Install Themes
PageTheme::add('theme_handle', $pkg);

//Install Job
Job::installByPackage("job_handle", $pkg);
}

public function upgrade(){
parent::upgrade();
$pkg = Package::getByHandle('package_handle');
//Install Block
BlockType::installBlockTypeFromPackage('block_handle4', $pkg);
BlockType::installBlockTypeFromPackage('block_handle5', $pkg);

//Install Job
Loader::model('job');
Job::installByPackage("job_handle", $pkg);
}


この例ではblock4とblock5とjobをこのバージョンで新規に追加してあります。
このバージョンからインストールする事も考えて、install()では全部のブロック等の要素のインストール処理が書いてあります。
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 21:30
taoさん、こんばんは。

業務画面を作成しているため、1画面1Blockで作成しています。
似たような画面でも、Blockを分けるようにしました。

taoさんに紹介していただいた方法で、アップデート時にBlockが追加できました!
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月4日 at 22:13
業務画面を作るとしても100は多すぎだと思います。
複数の機能をまとめてひとつのブロックとしても良いでしょうし、ページ単位のMVCであるSingle Page等を使って実装した方が良いと思います。
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月5日 at 14:00
業務画面75画面に対して、1画面1Blockで開発していってました。

確かにSinglePageで作っていって、共通で使う機能だけをBlockで実装する方が
パフォーマンス面から見てもいいかもですね。

SinglePageもBlockもファイルを配置するディレクトリ名が違うだけで
ソースにほとんど手を入れずにコンバートできそうですし、
SinglePageで開発していくように検討してみます。
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月5日 at 22:07
自己レスです。

本家サイトにUpgradeの時に追加する方法が書いてありました。
先にちゃんと読んでおけば・・・

http://www.concrete5.org/documentation/how-tos/developers/add-another-block-type-or-single-page-to-an-installed-package/
 

Re: PackageのバージョンアップでBlockが増えない?

2012年11月8日 at 18:59
情報ありがとうございます。やはりupgradeメソッドでブロックタイプが無い時に足すということですね。