Posted on

入力された情報が前回値と変わっている場合に、入力文字を変更(赤く)する方法

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)) ?>
   <?php echo $form->end(); ?>

この記述で、変更のあった入力値が赤くなります。