2008-04-03

CakePHP で Dojo toolkit

CakePHP 1.2 で Dojo Toolkit を使ってみた。


全てのページで必要ではないので、layout の scripts_for_cake 変数を使います。

CakePHP Users in Japan フォーラム scripts_for_layoutとは?


試しに Dijit のポップアップカレンダー付き日付入力テキストボックス(dijit.form.DateTextBox)を使ってみます。


Dojo 配置


Dojo を app/webroot/js 以下に配置します。今回は、dojo というディレクトリを掘りました。


app
└─webroot
└─js
└─dojo
├─dijit
├─dojo
├─dojox
└─util


dojo.js と CSS 読み込み



テンプレートに以下を追加します。全てのページで Dojo を必要とはしていないので、 layout ではなくテンプレートに記述して、scripts_for_cake メカニズムを使います。



<?php
$html->css('../js/dojo/dijit/themes/tundra/tundra', 'import', array(), false);
$html->css('../js/dojo/dojo/resources/dojo', 'import', array(), false);
$this->addScript('<script type="text/javascript" src="/絶対URL/js/dojo/dojo/dojo.js" djConfig="isDebug: true, parseOnLoad: true"></script>');
$javascript->codeBlock(' dojo.require("dijit.form.DateTextBox");
dojo.require("dojo.date.locale");
dojo.require("dojo.parser"); // scan page for widgets and instantiate them', array('inline' => false));
?>


Javascript ヘルパの link では、大事な大事な djConfig が設定できなかったので addScript を使いました。弊害として、src 属性に絶対 URL を書かなければいけなくて、なんともかっこ悪い。



フォームにインプット要素を記述



他の form ヘルパの要素と混在可能です。



<?php echo $form->label('created.min', '登録日'); ?>
<input name="data[Moderu][created][min]" type="text" value="<?php echo $this->data['Moderu']['created']['min'] ?>" id="UsrpramCreatedMin"
dojoType="dijit.form.DateTextBox"
constraints="{min:'2003-01-01',max:'2013-12-31',datePattern:'yyyy/MM/dd'}"
promptMessage="登録日の検索範囲"
trim="true" />


注意点



これで、そこそこ表示されますが、落し穴が2点ほど




  1. layout の body タグに dijit テーマの class 属性が必要。

    今回は、tundra を使っているので <body class="tundra"> としないとかっこよくならない。

  2. CSS の基本セレクタが衝突。 cake.generic.css を一部変更して使っていると妙な表示(今回の場合、input ボックスの高さが異常にでかかった)になりました。

    form div セレクタを削除して対処しました。



djConfig や constraints などをうまく扱うためには、やはりヘルパが欲しいところです。

0 件のコメント: