【CakePHP】Shellを拡張してTaskで親シェルのメソッドが使える「ShellEx」クラス

CakePHPを利用するにあたり、基本的にはWeb上で動作するアプリケーションを作成すると思いますが、バックエンド等でCakeの機能を用いながら処理を実行したい場合も当然出てきます。そんなときは「シェル」が活躍します。みなさんシェルは活用されていますか?

CakePHP1.2/1.3では、シェルの中で「タスク」という小機能を呼び出す仕組みがあります。Shellの中に膨大な機能を全部押し込まなくても済むようになるためコードの可読性が上がり、大変に便利な機能です。膨大な機能を提供しているCake機能の一つ「Bake」も、コアコードを覗けば多数のタスクで構成されています。
使い方も簡単です。「app/vendors/shells/」内に、例えば「hoge_shell.php」を作成します。中身はShellクラスを継承した「HogeShell」クラスを作成します。そしてその中には「main()」メソッドを用意すれば動作します。詳しくは こちら をご覧いただくか「Pocket詳解 CakePHP辞典」をご覧ください(出来れば買って!(笑))。

さてここからなのですが、Taskを使う場合、ShellからTaskが呼ばれるのですが、Shell内は素通りしてしまうため例えばタイトルなどをShell内で制作しても表示されません。また、タイトルを表示するためのメソッドを作って共通化をはかろうとしても、タスクからは呼び出し元のシェルはアクセスが出来ないため、利用することが出来ません。タイトルに限らず、シェル内で利用したいプロパティ・メソッドがあってもアクセスが不可能のため利用不可能です。

そこで、タスク内から親シェルのオブジェクトを参照することが可能な機能を付加する「ShellExクラス」を作成してみました。やっていることは非常に簡単で、タスクの初期化時に親クラスのオブジェクト参照を付加するのみです。しかしタスクの初期化・スタートアップ・実行が全てシェルのinitialize()とstartup()の間に挟まれていますので付加するタイミングがありません。このため、ShellExクラスのinitialize()内でタスクの初期化を先行して行っています。タスク初期化は「Shell::loadTasks()」が行っていますが、結果として二度実行されます。
Shell::loadTasks()が二度実行されることで若干問題点があります。それは親シェル内にロードされる各タスクオブジェクトが1回上書きされることです。幸いだったのが、このとき上書きされるのはClassRegistry::getObject()で入手できる参照オブジェクトでした。実体ではないため、結果として同じオブジェクトになります。単純に無駄な処理が走るだけです。多少気持ち悪さは残りますが、とりあえず要求していた機能は実現できます。

ソースコードはgistに上げました。このファイルを「app/vendors/shells」等にアップロードし、シェル内であらかじめApp::import()でこれを読み込み、extendsを「ShellEx」にすれば動作します。ファイル名は「shell_ex.php」とします。

利用例


App::import('Shell', 'ShellEx');
class MyShell extends ShellEx {
	var $tasks = array('Mytask');

	function commonFunc(){
		//共通処理
		$this->out('MyShell::commonFunc()');
	}

	function main(){
		//メインで共通処理を呼び出します
		$this->commonFunc();
	}
}


App::import('Shell', 'ShellEx');
class MytaskTask extends ShellEx {
	function excute(){
		//共通処理を実行
		$this->parentShell->commonFunc();
	}
}

タイトル云々の話は、Ktai Library1.0のシェル関連機能を実装している最中に必要になりました。やっぱりオリジナルのタイトルは作りたいので(笑)。まあこのほかいくつか共通機能を実装したかったので、それだけのためって事はないですが…
また @hiromi2424 さんによりますと、CakePHP2.0ではShell機能は改良されているそうです。まあ今回の記事は思いっきりバッドノウハウですね(^^;。

【WordPress】「StatPress Reloaded」の日本語化ファイル公開

wp-logoアクセス解析ツールとして「StatPress Reloaded」という大変に優秀なツールがあるのですが、日本語化されていなかったため、日本語化ファイルを制作しました。

▼ダウンロードはこちら
statpress-reloaded-l10n-ja_JP.zip

▼プラグイン本体の入手先はこちら
http://wordpress.org/extend/plugins/statpress-reloaded/

【追記】
ファイル名が間違っていました(^^;;;。(l18nではなくl10n)
また、翻訳に誤字があったため、中身も更新しました。
タイムスタンプが11:00のものが最新です。古い場合は再度ダウンロードをお願いします。

【CakePHP】祝! candycaneソース公開です!!

cake-logo注目のBTS「candycane」のソースが公開されました!
gitでの配布ですが、cakephperさん謹製の「git2zip」でアーカイブのダウンロードも可能です。

▼CakePHP版redmine candycaneのソースを公開しました
http://d.hatena.ne.jp/yandod/20090728/1248737029

▼git2gip
http://git2zip.com/thechaw/

yandodさんのブログの情報によると、まだチケット管理等は出来ないとのことで、実用として使えるようになるのはもう少し先のようです。でも、どんな風にCakePHPに移植したのか、もっと言えばredmineがどんな仕組みなのかが勉強できる素晴らしい教材でもあるので、興味がある方は是非ダウンロードしてみてはいかがでしょうか。

いやー、本当に楽しみなツールです。BTS勢力地図の塗り替えなるか???

ちょっと現在は別件で忙しくて試用したりバグ報告したりする時間が作れないため大変に申し訳ないのですが、今後KtaiLibrary等のツール公開では是非使わせていただきたいですし、それ以降で私にも何かお手伝いできることがありましたら是非したいと思います(でも足手まといかもしれませんね(^^;;;)。

【KtaiLibrary】0.2.0RC1版公開!

icon_ktaiお待たせいたしました。「Ktai Library」の最新バージョンである0.2.0RC1版を公開いたします。
本バージョンで、0.1.0版で発生していました大きな不具合が解消されていると思います。
上記メニュー「Ktai Library for CakePHP1.2」からダウンロード可能です。

先のご案内通り、今回から正式バージョンの公開前に「リリース候補版」として公開させていただくことにしました。今までの機能が安定してきたことと、目に見えない部分をいち早く試していただいて、何か問題がありましたらすぐにご連絡いただくことで、少しでも良いものを使っていただこう、というのが今回の趣旨です。

今回は2桁目の番号をインクリメントしています。機能的にはそれほど変化はないように見えるかもしれませんが、ソースをご覧いただくとお分かりになるかと思いますが、構造が大きく変化しております。とはいえ、基本的には丸ごと入れ替えていただくだけで大丈夫かと思いますのでご安心ください。

今回大変だった点は、何と言っても「URL処理」です。CakePHPでお使いの場合に、1つのドメインでいろいろ置いている人向けに、URLをしっかりRouter::url()に通すようにしました。lib3gkで無理矢理呼び出すために、「コールバック関数」を駆使しています。もう少し良い実装方法があるかもしれませんが、とりあえず許してください。基本的に「他のプラットホームでも動く」様に作っていますので、そもそも無理があるのかもしれませんけど… 先のバージョンで見直していきたいと思います。

とりあえず公開が先とのことで、見送った新機能があります。その辺は後のお楽しみということで(^^;;;。

【KtaiLibrary】バージョン0.1.1を公開しました!

icon_ktaiバグフィックス版である「Ktai Libraryバージョン0.1.1」を公開しました。
上記リンク「 Ktai Library for CakePHP1.2 」からダウンロードしてください。

変更箇所は次の通りです。

  • 「session_save」オプションを廃止(Session.saveの値をそのまま引き継ぎます)
  • DoCoMo携帯で、core.php内でConfigure::write(‘Session.save’, ‘php’);以外だった場合にセッションが有効にならない不具合を修正
  • 一部絵文字の不備を修正
  • 「app_controller.php」のファイル名を「app_controller.php.ktai」とし、上書きを防止

絵文字問題を除いて、Session.saveを変更しないのなら特にバージョンアップの必要はありません。まあでも上書きOKですので、バージョンアップは簡単です。最新版に更新していただくことをお薦めいたします。

【KtaiLibrary】バージョン0.1.0公開!

icon_ktaiお待たせいたしました!
Ktai Library 0.1.0の公開を開始しました。
上記タブ「Ktai Library for CakePHP」からダウンロードできます。

繰り返しになりますが、構築済みサイトにKtai Libraryを適用する場合は、app_controllerを上書きしないように、特に気をつけてください。バックアップをとることをお薦めいたします。

今後のバージョンアップについてですが、現在 app_controllerに書いているリダイレクト対応を、将来的にはコンポーネント中で行うようにしたいと考えています。他の記事でも書いていますが、現在のCakePHPで実装されています「beforeRedirectコールバック」が想定していない実装になっているためで、チケットを投げている最中です(regenさんありがとうございます)。修正されたら、Ktai Libraryも修正を行い、さらに手間のかからない導入が出来るようにしたいと考えています。
機能的なバージョンアップは、後は細々としたものになりそうです。GPS対応とか、そういったものになりそうです。また、現在い携帯SCOについて勉強を始めたところでして(遅すぎ?)、そういったものも興味あります。もしアイデアなどありましたら是非お寄せください。

【追記】
ダウンロードページの0.1.0のファイルリンクが間違っていました。
0.0.2版がダウンロードされてしまった方は再度ダウンロードし直してください。
申し訳ございません。

【Tplcutter】Tplcutter0.2.0公開いたします

新バージョンのTplcutter バージョン0.2.0を公開いたします。

先日指摘しましたelement関連の不具合の修正と、新機能である「ピース」機能の実装をいたしました。

「ピース」機能を簡単に説明いたしますと、エレメントは「繰り返し流用したい部分をあらかじめファイルに書き出しておき、それを呼び出す」機能であるのに対し、「繰り返し流用したい部分をあらかじめメモリに蓄積しておき、加工時に指定の場所にコピーする」機能を提供します。こうすることで、実際の表示の際に余分な処理を抑えることが出来、展開速度の向上を見込むことが出来ます。

なお、ピースは同一アプリケーション内であれば、テンプレート内のどの場所に記述しても有効に働きます。つまり、指定した領域のあるテンプレートファイルと異なったテンプレートファイル内でも呼び出すことが出来ます。

使用例はサンプルファイル内にありますので、そちらをご覧いただけますと幸いです。

とりあえず使えるツールになったっぽいので、よほどのバグがない限り、しばらくバージョンアップは控えることにします。まだいくつかやりたい機能はありますが、それは現在構築している新企画サイトの作成が終わってからにしたいと思います。

*************************************************
    テンプレート加工ツール「Tplcutter」簡易説明書
    Copyright (C) 2008 ECWorks ( http://ecw.seesaa.net/ )
*************************************************
 設置方法など詳細につきましては、アーカイブ内のドキュメントをお読みください。

————————————————–
■はじめに
————————————————–

 現在主流になりつつある、フレームワークを用いたWEBアプリ開発では、HTMLファイルやPHPファイルを直接表示する手法は少なくなり、Viewシステムを介してテンプレートファイルを読み込み、それを加工した後に表示する手法が一般的となりました。
 ところが、テンプレートファイルは通常外部から見えない領域に格納されるため、デザイン編集作業の際にテンプレートファイル内に記述する画像など表示物等のリンクが実際のリンクと異なってしまうため、編集が困難になるという問題が発生します。

 そこで、デザイン時では普通のHTMLを編集するような感覚でデータを作成し、それらテンプレートとその他ファイルを適切な位置に配置できるようなツールが実現できないかと考え、本ツール「Tplcutter」を開発しました。
 デザイナー側から見ますと、サイト制作ツール等で編集可能なディレクトリ構造のまま作業し、それをそのままプログラマー側に受け渡せます。また、テンプレートは読み込んで加工したものを別のディレクトリに作成し、その他表示物はコピーしますので現在稼働しているサイトのデザインを崩すことなく直接編集することも可能です。
 そして、最大のメリットとしては、コマンド一発で全てのテンプレートを更新することにあります。デザイナーによって制作されたテンプレートを適用するためには、これらファイルを加工したり、異なるディレクトリに配置したりする必要がありました。デザインが変更されるたびにこの作業を行わなければならないため、無駄な手間が発生します。本ツールはこれら作業を自動化しますので、時間の節約や更新間違い等による不具合の発生を極力防ぐことが出来ます。
 本ツールは、もともとCakePHPフレームワークにて利用できるように開発したのですが、SmartyやSynfony等、ほかのフレームワーク・テンプレートシステムでも利用できるように、PHPコマンドラインでも利用できるよう拡張いたしました。ini形式ファイルにて細かな設定が出来ますので、幅広いシステムで使用することができます。

————————————————–
■動作環境
————————————————–

 本ツールは、CakePHP1.2.xのCakeコンソール、もしくはPHP4/5のコマンドラインで使用することが出来ます。

 CakePHPにてテンプレートを利用する場合は、Cakeコンソールで使用することで、ほぼ無設定でCakePHP向けのテンプレート加工をします。
 同様に、PHPのコマンドラインから利用する場合は、ほぼ無設定でPHP向けのテンプレート加工をします。

 どちらの方法でも、ini形式ファイルにて設定することで、異なるテンプレートシステム向けの加工をすることも可能です。

————————————————–
■ご利用条件
————————————————–

 本ツール一式は使用もしくは再配布について、無料でご利用いただけます。
 本ツールおよびアーカイブ内に含まれる全ての著作物に対する権利はECWorksが保有しており、GNU一般公衆利用許諾契約に基づいて配布しております。再配布・改変等は契約の範囲内で自由に行うことが出来ます。詳しくは、添付のGNU一般公衆利用許諾契約書をお読みください。
 なお、本ツールは一般的な利用において動作を確認しておりますが、ご利用の環境や状況、設定もしくはプログラム上の不具合等により期待と異なる動作をする場合が考えられます。本ツールの利用に対する効果は無保証であり、あらゆる不利益や損害等について、当方は一切の責任をいたしかねますので、ご了承いただきますようお願い申し上げます。

▼ダウンロードはこちら
tplcutter-0.2.0.zip

【SmartyView】SmartyView1.2.0.7296 For CakePHP1.2

 CakePHP1.2用SmartyViewの最新版を公開いたします。

 このViewを利用することで、SmartyテンプレートをCakePHPで利用することが出来ます。
 ご利用には別途Smartyテンプレートシステムを用意する必要があります。

 Bakeryにも1.2用SmartyViewが紹介されているのですが、CakePHP1.2.0.6311betaあたりから仕様の合わない部分や不具合等がいくつかありましたので、作り直して公開しております。基本的に、アーカイブを解凍していただき、そのままのディレクトリ構造をcakeシステムに適用していただければ動作すると思いますので、導入は簡単です。是非ご利用ください。

 詳しくは、アーカイブ中のreadmeをお読みください。

※RC1版と比べ、コードはだいたい同じなのですが、ヘルパーの呼び出し方法が違う等若干異なっています(view.phpのアップデート由来です)。RC1で本バージョンを使用した場合も、おそらく動作はするとは思いますが、どのような挙動をするかまでは良く分かりませんので、一応無保証でお願いします。

ダウンロードはこちら

▼CakePHP1.2.0.7296 RC2向け
smartyview-1.2.0.7296.zip

CakePHP1.2RC1/beta版のSmartyViewは こちら で紹介しています。