1

エントリを追加するときに表示する必要があるエントリを編集するときに、フィールドを非表示にしようとすると問題が発生します。

私のテーブル構造は次のとおりです。

equip_items
--------------
id (pk)
equip_type_id (fk to equip_types)
site_id (fk to sites)
equip_status_id (fk to equip_status)
name

(equip_type_id、site_id、name)は、データベース内の複合一意キー制約です。一意の制約のgrocery_CRUD検証を処理する名前フィールドにコールバックを実装しました-既存のequip_itemsの編集または追加のいずれかを考慮に入れます。

function unique_equip_item_check($str, $edited_equip_item_id){
$var = $this->Equip_Item_model->is_unique_except($edited_equip_item_id,$this->input->post('site_id'),$this->input->post('equip_type_id'),$this->input->post('name'));

if ($var == FALSE) {
$s = 'You already have an equipment item of this type with this name.';
$this->form_validation->set_message('unique_equip_item_check', $s);
return FALSE;
} else {
return TRUE;
}
}

ユーザーに変更させたくないので、site_idとequip_type_idを非表示フィールドとして設定しています。問題ありません。

$crud->field_type('site_id', 'hidden', $site_id);
$crud->field_type('equip_status_id', 'hidden', iQS_EqStatus_InUse);

ユーザーがequip_itemを追加するとき、タイプのリストからequip_typeを選択できるようにします-問題ありません。これはデフォルトのgrocery_CRUDの動作です。

$crud->add_fields('equip_status_id', 'site_id', 'equip_type_id', 'name');

ユーザーがequip_itemを編集するとき、ユーザーがequip_typeを編集できないようにします。私は、edit_fieldsをequip_type_idを除外するように設定するだけで問題ないと考えました。

$crud->edit_fields('equip_status_id', 'site_id', 'name', 'barcode_no');

しかし、equip_type_idフィールドの値は編集フォームのどこにも存在せず、検証ルーチンで明らかに必要になるため、これは検証コールバックで大混乱を引き起こします。

したがって、新しいレコードを追加するときは、equip_type_idフィールドを表示して通常どおりに動作させる必要がありますが、レコードを編集するときは非表示にする必要があります。

私はすべてのハックのこのハックを試しました:

if ($this->uri->segment(4)!= FALSE){$crud->field_type('equip_type_id', 'hidden');}

私の理論では、「$ this-> uri-> segment(4)」は、新しいレコードを追加した場合にのみ誤った結果を返しますが、機能しません。

私も試しました:

$crud->callback_edit_field('equip_type_id', array($this,'edit_equip_type_field_callback'));

function edit_equip_type_field_callback($value = '', $primary_key = null){
return '<input type="hidden" value="'.$value.'" name="equip_type_id"';
}

しかし、それは機能しません。フォームフィールドのレイアウトを台無しにするだけです。「タイプ」ラベルなどは引き続き表示されます。

助言がありますか?

4

1 に答える 1

7

問題は、フィールドequip_status_idを編集フィールドに追加する必要があることだと思います。

したがって、あなたの場合、これは単に問題を解決します:

$crud->edit_fields('equip_status_id', 'site_id', 
                        'name', 'barcode_no','equip_status_id'); 

また

$crud->fields('equip_status_id', 'site_id', 'name',
                 'barcode_no','equip_status_id');  //for both add and edit form

もちろん、ハックも使用する必要があります。

if ($this->uri->segment(4)!= FALSE) {
    $crud->field_type('equip_type_id', 'hidden');
}

または、より適切な方法でそれを行うことができます:

$crud = new grocery_CRUD();

if ($crud->getState() == 'edit') {
    $crud->field_type('equip_type_id', 'hidden');
}

...

このようにして、コードをハッキングした理由も思い出すことができます。

于 2012-12-06T22:03:41.653 に答える