2007年12月6日(木曜日)

Smarty “ryus_actionform_input"プラグイン

カテゴリー: - Ryuji @ 19時50分32秒

cubsonのwizardコマンドで生成される編集用テンプレートには下記のようなコードがずらっと並びます。


<{xoops_input type=text name=hoge_name value=$actionForm->get('hoge_name')}>

actionFormのプロパティ名とinputタグのname属性名は必ずしも一致させる必要が無いので、別々の指定ができるようにこのようになっています。

でも、ほとんどのケースで、inputタグのnameとactionFormのプロパティ名は合わせています。
それなのに、2回同じことを書いているので、修正時にうっかりどちらか片方の名称を変更し忘れると言うことがあります。
例えば、先ほどの例のhoge_nameをfoo_name に変更したときに、ウッカリ次のように片方だけ変更を忘れてしまうわけです。


<{xoops_input type=text name=foo_name value=$actionForm->get('hoge_name')}>

これをちょくちょくやってしまったので、nameを指定するだけで済むようにxoops_actionform_inputプラグインを作成してみました。

xoops_actionform_inputプラグイン

■使い方
foo_nameであれば、次のようにします。


<{ryus_actionform_input name=foo_name actionform=$actionForm}>

actionFormが、SmartyのactionForm変数にアサインされているのであれば、次のように省略することも可能です。
<{ryus_actionform_input name=foo_name}>

これで、少しでもウッカリミスが減ればなぁと思っています。


2007年11月12日(月曜日)

Dyna 再チャレンジ

カテゴリー: - Ryuji @ 17時16分52秒

cubsonでコードを生成すると、XoopsSimpleObjectを継承した、{TableName}Object クラスが作成されます。

例えば次のようなコードです。


class Foo_FooObject extends XoopsSimpleObject
{
    function Foo_FooObject()
    {
        $this->initVar('foo_id', XOBJ_DTYPE_INT, 0, true);
        $this->initVar('title', XOBJ_DTYPE_STRING, "", true, 255);
        $this->initVar('note', XOBJ_DTYPE_TEXT, "", true);
    }
}

コンストラクタでは、テーブルの各カラムについてinitVarメソッドを呼び出してでデータ型や、デフォルト値などを設定しています。
設定内容は、$mVarsにカラム名をキーとした連想配列で保存されます。

ほとんどのケースでは、cubsonが自動的に生成したコードで使えますが、時にはちょっと変えたい場合もあります。

変更したいときに変更できるようにするために、cubsonでは、DB情報を毎回取得して設定する方式でなく、事前にDB情報を元にコードを吐き出す形になってます。

ただ、よーく考えたら、initVarの実行結果は$mVarsに入るので、DB情報を取得してinitVarするようにしても問題なさそうです。

そんなわけで、DB情報を取得して、initVarしてくれるようなDynaXoopsSimpleObjectをちょっと試しに作成してます。
使い方としては


class Foo_FooObject extends DynaXoopsSimpleObject
{
}

で、先ほどのcubsonコードと同じようにinitVar。
noteカラムだけinitVarを変更したくなったら、


class Foo_FooObject extends DynaXoopsSimpleObject
{
    function Foo_FooObject()
    {
        parent::DynaXoopsSimpleObject();
        $this->initVar('note', XOBJ_DTYPE_TEXT, "Fooooo!!", true);
    }
}

と書けばOK

というようなのを作りたいなと(^^;
えぇ、まだ作成途中です。。。。

ただ、オブジェクト生成のたびにDBから情報取得するんじゃムダなので、そこはキャッシュ必要だなぁとか、いろいろ考えてます。

これができたら、ActionFormやActionFilterでもできないかなぁと夢想しています

PS
# exFrameのDynaXXXXは、どうもなじめなかったんで、設定ファイルを使わないDynaXXXXをつくってみようかなと。そんなわけで「Dyna再チャレンジ」です(^^;


2007年9月14日(金曜日)

Smartyのhtml_select_date,html_select_timeプラグイン用に、XCube_Propertyを作成

カテゴリー: - Ryuji @ 16時29分28秒

XOOPS Cubeのモジュール開発をしていると、日時を入力する画面を作成することがよくあります。

今回は、Smartyのhtml_select_date,html_select_timeプラグインで入力した値をunixtimeで保持するXCube_Propertyクラスをつくってみました。

下記のようなコードです。


class Ryus_UnixtimeProperty extends XCube_AbstractProperty
{
	function set($value)
	{
		if (strlen(trim($value)) > 0) {
			$this->mValue = intval($value);
		}
		else {
			$this->mValue = null;
		}
	}
	function hasFetchControl()
	{
		return true;
	}
	/**
	 * Fetches.
	 * @param XCube_ActionForm $form
	 */
	function fetch(&$form)
	{

$year = $form->mContext->mRequest->getRequest($this->mName.'Year'); $month = $form->mContext->mRequest->getRequest($this->mName.'Month'); $day = $form->mContext->mRequest->getRequest($this->mName.'Day');

$hour = $form->mContext->mRequest->getRequest($this->mName.'Hour'); $minute = $form->mContext->mRequest->getRequest($this->mName.'Minute'); $second = $form->mContext->mRequest->getRequest($this->mName.'Second'); if($year === null || $month === null || $day === null || $hour === null || $minute === null || $second === null){ $this->set(null); }else{ $datetime = sprintf("%d-%d-%d %d:%d:%d", $year, $month, $day, $hour, $minute, $second); $unixtime = strtotime($datetime); $this->set($unixtime); } }

}

ActionFormのprepareには次のように書きます


function prepare()
{
		$this->mFormProperties['schedule_unixtime'] =& new Ryus_UnixtimeProperty('schedule_unixtime');
}

mFormPropertiesに、上記の例ではschedule_unixtimeという名称で宣言してますので、
html_select_date, html_select_timeプラグインでprefixにschedule_unixtimeを指定すると、
POSTされた値を元に、Ryus_UnixtimePropertyが自動でunixtimeに変換して値を保持します。

テンプレートの例


	<{html_select_date prefix="schedule_unixtime" time=$actionForm->get('schedule_unixtime') field_order="YMD" month_format="%m"}>
	<{html_select_time prefix="schedule_unixtime" time=$actionForm->get('schedule_unixtime')}>

ただ、この方法だとPOSTされた年月日時分秒をunixtimeに変換して保持し、Smartyプラグイン側でunixtimeから年月日時分秒に変換という流れになるので、2月30日というありえない日付を入力したときに、3月2日になってしまうのが難点です(^^;

もうちょっと工夫しないと仕事では使えませんね(^^;、


2007年8月3日(金曜日)

一度に複数のテーブルを更新するモジュール 龍司の場合

カテゴリー: - Ryuji @ 23時26分31秒

氷川 XOOPS Module 開発室 一度に複数のテーブルを更新するモジュール
にて、cubson が生成する ActionForm をそのまま利用する形での実装方法が紹介されています。

私はこれとは違う方法でやっていたので、私のやり方をちょっと紹介。

ActionForm は、入力値の受け渡しに使う物とわりきって、複数テーブルを更新するケースなら、複数テーブルの項目をひとつにした ActionForm をつくってしまいます。
このとき作成する ActionForm にテーブル分だけ、load と update メソッドを用意します。

Action 側は、_setupObject メソッドで、複数テーブルのデータ読み込みと Object 作成を行います。
getDefaultView と execute で複数テーブル分 load,update を行うようにします。
# データの関連の仕方によっては、$this->mObject に関連 Object を持たせるようにすることもあります。この場合、getDefaultView と execute メソッドには変更なし。

_doExecute で更新処理が行われるので、ここで複数テーブル分更新をかけます。

複数テーブルを同時に更新する必要があるケースは多いので、最近は AbstractEditAction を下記のように書き換えて、 ActionForm への load,update はサブクラスでオーバーライドできるようにしています。


	function _actionFormLoadTarget()
	{
	    $this->mActionForm->load($this->mObject);
	}
	function getDefaultView()
	{
		if ($this->mObject == null) {
			return HOGE_FRAME_VIEW_ERROR;
		}

$this->_actionFormLoadTarget();

return HOGE_FRAME_VIEW_INPUT; }

こうしておいて実際の更新をする Action で下記のようにしています。


	function _actionFormLoadTarget()
	{
	    $this->mActionForm->load($this->mObject);
	    $this->mActionForm->loadFoo($this->mFoo);
	}

このやり方だと、書き換えるファイル数が多くなってしまうので、
氷川 XOOPS Module 開発室 一度に複数のテーブルを更新するモジュール で紹介されている方法も一度試してみたいと思います。


2007年7月7日(土曜日)

AssetManager の改造

カテゴリー: - Ryuji @ 00時02分26秒

cubson が生成するコードでは、AssetManger を通して各テーブルのハンドラを取得するようになっています。
自前のカスタムハンドラを作成して、それを使いたいときはコンストラクタで mAssetList に登録することになってます。

・参考「 cubson/壱型フレーム・開発ガイド/アセットマネージャ

しかし、カスタムハンドラを作成するたびに、AssetManager を編集するのは面倒です。

そこで、AssetManager の _createHandler メソッドを次のように書き換えて使っています。


    function &_createHandler($name)
    {
        // customHandlerチェック
        $file = XOOPS_MODULE_PATH.'/'.$this->mDirname.'/class/customHandler/'.ucfirst($name).'.class.php';
        if(file_exists($file)){
            require_once($file);
            $className = ucfirst($this->mDirname).'_'.ucfirst($name).'CustomHandler';
            $handler = new $className($GLOBALS['xoopsDB']);
            return $handler;
        }

return xoops_getmodulehandler($name, $this->mDirname); }

これで、class/customHandler/ 下にカスタムハンドラがあれば、そちらが利用されるようになります。
※カスタムハンドラのクラス名は Dirname_TablenameCustomHandler にします。


2007年6月30日(土曜日)

一覧画面に検索フォームをつける

カテゴリー: - Ryuji @ 15時20分40秒

昨日はうっかり BLOG を更新するのを忘れてしまいました(..;)

さて、仕事でモジュール開発をしていると、データの一覧画面に検索フォームをつけてほしいという要望がよくあります。

そこで FilterForm に検索条件を保持させるために cubson が生成した AbstractFilterForm に次のようなコード追加しています。


	var $params = array();
	function get($key){
		return $this->params[$key];
	}
	function set($key, $value)
	{
		$this->params[$key] = $value;
	}

各 テーブルの FilterForm の fetch を、値が保持できるように criteria に条件を追加する部分に、$this->set(検索キー , 値) を追加していきます。

ListAction も、FilterForm を render に渡すように executeViewIndex に1行追加します。


$render->setAttribute('filter', $this->mFilter);

テンプレートの検索フォームは下記のように書いていきます。


<form action="index.php" method="GET">
<{xoops_input type=hidden name=action value=HogeList}>
Foo ID : <{xoops_input type=text name=foo_id value=$filter->get('foo_id')}>
開始日 : <{xoops_input type=text name=start_date value=$filter->get('start_date')}>
<input type="submit" value=" 検索 " />
</form>

実際には完全一致だけでなく、範囲検索したり、キーワード検索することがあるので、criteria 追加部分はかなりいじることになりますが、基本はこのような感じで一覧画面に検索フォームをくわえることができます。


2007年6月22日(金曜日)

XOOPS Cube で自作 validator を使う

カテゴリー: - Ryuji @ 13時29分40秒

最近メインのパソコンが不調でまいってる龍司です。

しばらく、備忘録をかねてcubsonネタつづくかもしれません(^^;

さて、cubson が生成する編集用コードでは ActionForm が使われていることを 前回 書きました。

XCube_ActionForm では、基本的な妥当性検査(文字列長のチェックや必須チェックなど)の指定は prepare メソッド内で行います。

たとえば、username が 100 文字以内かどうか検査するための指定は次のようになります。


function prepare()
{
    $this->mFormProperties['username'] =& new XCube_StringProperty('username');

$this->mFieldProperties['username'] =& new XCube_FieldProperty($this); $this->mFieldProperties['username']->setDependsByArray(array('maxlength')); $this->mFieldProperties['username']->addMessage('maxlength', _MD_VIDEO_ERROR_MAXLENGTH, _MD_VIDEO_LANG_EDE_SUB_EVENT_NAME, '250'); $this->mFieldProperties['username']->addVar('maxlength', '100'); }

最初の new XCube_StringProperty(’username’) で username は 文字列であることを指定。

setDependsByArray() で利用する validator を配列で指定します。ここでは、maxlength を指定しています。
addMessage(validator 名 , エラーメッセージ)で validator ごとにエラーメッセージをセットします。
addVar()は、validator ごとにセットする値がことなりますが、最大値や最小値などをセットします。
(続き…)


2007年6月15日(金曜日)

ActionForm で自前 validate

カテゴリー: - Ryuji @ 22時36分05秒

cubson で生成される編集用のコードには、ActionForm が使われています。

ActionForm についての説明は、作者である minahito 氏の BLOG に詳しく書かれています。

What is ActionForm? (1)
What is ActionForm? (2)
What is ActionForm? (3)
What is ActionForm? (4)
What is ActionForm? (5)
What is ActionForm? (6)

cubson で生成される編集用の ActionForm で行われる妥当性検査は、原則としてデータベースに対して妥当な値であるかどうかだけです。

開始日と終了日を入力してもらうようなケースで、開始日が終了日よりも前の日付かどうかや、入力された文字列が日付として妥当であるかは、自動生成されたコードではチェックされません。

そこで、このようなケースでは、生成された ActionForm をカスタマイズすることになります。
(続き…)


2007年6月1日(金曜日)

cubson 用モック表示アクション

カテゴリー: - Ryuji @ 15時24分35秒

ご依頼を受けてモジュールを開発するときに、先に画面だけのモックをつくってお客様にに確認していただくことがあります。
この時に作成する HTML がテンプレートのベースになります。

モジュール開発はもっぱら cubson を利用しているのですが、このモックを表示するためだけのアクションを作成してみました。
(続き…)


2007年3月31日(土曜日)

cubson1.00 ではまらないために

カテゴリー: - Ryuji @ 14時24分11秒

ときどき XOOPS Cube の小物モジュールをつくるのに cubson を利用しているのですが、現在公開されている 1.00 では、いくつか生成コードにバグがあります。

生成されるコードのバグにはまらないために少しメモ程度に書いておきます

■モジュールディレクトリ名は全て小文字英数に。
おもに AssetManager.class.php にからむバグですが、
モジュールディレクトリ名に大文字が入ったり、アンダースコア( _ )が入ったりすると、生成コードのバグにはまりやすくなります。
当面は、モジュールディレクトリ名は全て小文字にしておくのが無難です。

■ FilterForm
生成された XxxxFilterForm.class.php のコードに対して、_mNavi を mNavi に一括置換しておきましょう。

■ユーザサイドの一覧テンプレート
{dirname}_{tablename}_list.html に対して |theme を削除するように一括置換しておきましょう。theme modifier は、管理画面用なので、ユーザサイドで使えません。

今後も気がついたら、ここに書き足すか、cubson の wiki にまとめていくかしようと思います。


2007年3月16日(金曜日)

みんな cubson 使おう!

カテゴリー: - Ryuji @ 23時28分16秒

日本電子専門学校7号館で今年もオープンソースカンファレンスが開催されました。

金曜の午前中、まだ他のブースには全然お客さんがきてないようなときに、 セカンドライフコミュニティジャパン (以下SLCOM)のブースには既に数人のお客さんが。。

その後も続々とお客さんがやってきてました。Second Life 人気の高さがうかがえます。

さて、今日のイベントにあわせて、 SLCOMではアバターコンテストを開催しています。
このアバターコンテスト用に、昨夜いきおいでモジュールをつくってしまいました。

※アバターコンテストの詳細は SLCOMのニュース をご覧ください

私は XOOPS Cube のモジュール開発をするときに minahito 氏が開発された cubson を使っていますので、今回も cubson を使って開発しました。

cubson

cubson を使うと、
1.テーブルを作成して
2.makeprojectでモジュールのひな形を作成して、
3.wizardコマンド実行
で、基本的な、一覧、詳細表示、編集、削除のコード生成されますので、非常に便利です。
# 若干生成されるコードにバグがあるのでそこは手作業で修正してますが(^^;

あとは自動生成では対応できない独自ロジックなどをコーディングしていけばモジュールの完成です。
途中なんどかはまったりしたので、時間かかってしまいましたが、およそ5時間ほどで作成できました。

ちょっとした機能をもつモジュールが欲しいときは、既存のモジュールをカスタマイズするというのも手ですが、cubsonによるコード自動生成を利用して自作してしまうのも良いと思いますので、是非お試しを。


8 queries. 0.038 sec.
Powered by WordPress Module based on WordPress ME & WordPress

〒104-0061 東京都中央区銀座1丁目3番3号 G1ビル7階
お問い合わせ TEL 03-3524-8860

Copyright(c) 2012 RYUS.All Rights Reserved.