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)) ?> |
この記述で、変更のあった入力値が赤くなります。