protocalendar.js 用の CakePHP1.2対応のヘルパメソッド(のひな形)をセキュリティコンポーネントに対応させて見た
皆さん、こんにちは、 redgasukiです。
スプーキーズラボさんが公開されている、prototype.jsベースのjavascriptのカレンダーライブラリprotocalendar.jsがとても便利です。
http://labs.spookies.jp/product/protocalendar
こんな感じで、リッチな日付選択(時間選択も可)ができます。
「あとで買うかも!?」でも利用させて頂いています。
スプーキーズラボさん、ありがとうございます。
CakePHP1.2対応のヘルパの雛形も公開されていますので、手軽に使うことが出来ます。
protocalendar.js 用の CakePHP1.2対応のヘルパメソッド(のひな形)を公開しました
しかし、そのまま使うと、CSRF対策がお手軽に出来るセキュリティコンポーネントの強力すぎる制約で、blackHoleCallbackコンボ喰らってしまうので、修正してみました。
2009/1/16 修正
<?php
class SpHelper extends Helper {
var $helpers = array( 'Form','Javascript');
function dateInput($fieldName, $options = array(), $calOptions = array()) {
if (!isset($options['value'])) {
$date = $this->value($fieldName);
if ($date) {
$options['value'] = date(’Y/m/d’, strtotime($date));
}
}
$result =$this->Form->input($fieldName, $options);
if (!empty($options['id'])) {
$styleId = $options['id'];
} else {
$styleId = Inflector::camelize($this->model()) . Inflector::camelize($this->field());
}
$script = ” InputCalendar.createOnLoaded(’{$styleId}’, {”;
$lang = !empty($calOptions['lang']) ? “lang:{$calOptions['lang']} ” : “lang:’ja’”;
$script .= $lang;
if (!empty($calOptions['startYear'])) {
$script .= “, startYear:{$calOptions['startYear']} “;
}
if (!empty($calOptions['endYear'])) {
$script .= “, endYear:{$calOptions['endYear']} “;
}
if (!empty($calOptions['minDate'])) {
$date = date_parse($calOptions['minDate']);
$date = $date['year'] .’,’. ($date['month'] -1) . ‘,’ . $date['day'] ;
$script .= “, minDate:new Date({$date}) “;
}
if (!empty($calOptions['maxDate'])) {
$date = date_parse($calOptions['maxDate']);
$date = $date['year'] .’,’. ($date['month'] -1) . ‘,’ . $date['day'] ;
$script .= “, maxDate:new Date({$date}) “;
}
$script .= “});”;
return ($result . $this->Javascript->codeBlock($script));
}
}
?>
修正点
元のエントリのprotocalendar.js 用の CakePHP1.2対応のヘルパメソッド(のひな形)を公開しました から素直にFormヘルパーのinputメソッドを使うように若干修正しています。
それだけでは寂しいので、入力値の範囲指定が出来るminDateとmaxDateをサポートしてみました。
注意点
Formヘルパーのinputメソッドに変更したので、以前のまま使うと、labelとdivが出力されてしまうので、以下のように
<?php
$calOptions['startYear'] = date(”Y”);$calOptions['minDate'] =date(”Y-m-d”);
echo $sp->dateInput(’reminder’,array(’value’ =>$reminder,’label’ =>false,’div’ => false),$calOptions ); ?>
labelとdivをfalseにしてください(もしくは、helperのデフォルト値に設定してもいいかも)。
これでセキュリティコンポーネントに怒られなくてすみます。
反省
猛烈に久しぶりのブログ更新。
2009年はCakeネタに限らずに色々発信したい(と思う)。
Popularity: 16 %
by redgasuki 













[...] ねとまつの小部屋 : http://blog.ne2ma2.com/archives/420 [...]
[...] な形)をセキュリティコンポーネントに対応させて見た | ねねとまつの小部屋 : http://blog.ne2ma2.com/archives/420 カテゴリー: CakePHP タグ: CakePHP, Date, JavaScript, prototype この投稿のパ [...]