cakephp入力フォームで、前回と変更になった入力値は入力文字を変更(赤く)して表示したい場合のサンプルです。
前提条件
前回入力した値と今回入力する値は別で情報を管理します。
その上で、前回と今回の差がわかる状態で判断します。
モデルはSampleを使用します。
変化がある場合に下記コードで違いがあったことを書き込む。
samples_controller.phpのサンプル「一部のみ記述」
function edit_sample($id = null) {
// 実際には前回と変更になっている場合のみ下記設定を行います。
$this->Sample->validationDiffs['cate'] = 'diff';
$this->Sample->validationDiffs['memo'] = 'diff';
// サンプルなので、初期値も入れておきます。
$this->data['Sample']['cate'] = 2;
$this->data['Sample']['memo'] = 'メモ';
}
helpersに下記コードを配置し、モデルの項目で変化があったことを
createとinputで関連付けます。(sample_form.php)
//*******************************************************************************
// モジュール名 : 拡張フォームヘルパー
//*******************************************************************************
App::import('Helper', "Form");
class SampleFormHelper extends FormHelper {
//----------------------------------------------------------------------------------
// フォーム開始タグ 初期値定義
//----------------------------------------------------------------------------------
function create($model = null, $options = array()) {
$defaults = array('name' => 'form', 'url' => '/'. $this->params['url']['url']);
$options = array_merge($defaults, $options);
if (isset($options['action'])) {
unset($options['url']); // 任意で定義したaction属性を優先
}
// モデル参照により、前回と変更になったフィールドを$this->validationDiffsに設定
$models = ClassRegistry::keys();
foreach ($models as $currentModel) {
if (ClassRegistry::isKeySet($currentModel)) {
$currentObject =& ClassRegistry::getObject($currentModel);
if (is_a($currentObject, 'Model') && !empty($currentObject->validationDiffs)) {
$this->validationDiffs[Inflector::camelize($currentModel)] =& $currentObject->validationDiffs;
}
}
}
return parent::create($model, $options);
}
//----------------------------------------------------------------------------------
// フォーム表示のデフォルト値変更
//----------------------------------------------------------------------------------
function input($fieldName, $options = array()) {
$arr = explode('.',$fieldName);
if (count($arr) == 2) {
$model = $arr[0];
$fld = $arr[1];
if (!empty($this->validationDiffs[$model][$fld])){
$opc = isset($options['class'])?$options['class']:"";
$op = array('class' => "diff-col {$opc}");
$options = array_merge($options, $op);
}
}
return parent::input($fieldName, $options);
}
}
入力フォームでの記述、sampleFormを利用します。
edit_sample.phpのサンプル
<?php echo $sampleForm->create(); $cateArr = array( 1 => 'カテゴリ1', 2 => 'カテゴリ2', 3 => 'カテゴリ3', 4 => 'カテゴリ4', 5 => 'カテゴリ5', ); $itemArr = array( 1 => '項目1', 2 => '項目2', 3 => '項目3', 4 => '項目4', 5 => '項目5', ); ?>sample
| カテゴリ | <?php echo $sampleForm->input('Sample.cate', array('type' => 'select', 'options' => $cateArr, 'empty' => '---')) ?> |
| メモ | <?php echo $sampleForm->input('Sample.memo', array('type' => 'text', 'size' => 20)) ?> |
この記述で、変更のあった入力値が赤くなります。