如何在编辑时隐藏字段,在添加项目时可见?

Ken*_*lik 1 codeigniter hidden-field grocery-crud

我在编辑添加条目时必须可见的条目时尝试隐藏字段时遇到问题.

我的表结构如下:

equip_items
--------------
id (pk)
equip_type_id (fk to equip_types)
site_id (fk to sites)
equip_status_id (fk to equip_status)
name
Run Code Online (Sandbox Code Playgroud)

(equip_type_id,site_id,name)是db中的复合唯一键约束.我在name字段上实现了一个回调,它处理了unique_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;
}
}
Run Code Online (Sandbox Code Playgroud)

我将site_id和equip_type_id设置为隐藏字段,因为我不希望用户更改这些 - 没问题.

$crud->field_type('site_id', 'hidden', $site_id);
$crud->field_type('equip_status_id', 'hidden', iQS_EqStatus_InUse);
Run Code Online (Sandbox Code Playgroud)

当用户添加equip_item时,我希望他们能够从类型列表中选择equip_type - 没问题,这是默认的grocery_CRUD行为.

$crud->add_fields('equip_status_id', 'site_id', 'equip_type_id', 'name');
Run Code Online (Sandbox Code Playgroud)

当用户编辑equip_item时,我不希望用户能够编辑equip_type.我认为没问题我可以设置edit_fields以排除equip_type_id:

$crud->edit_fields('equip_status_id', 'site_id', 'name', 'barcode_no');
Run Code Online (Sandbox Code Playgroud)

但是这会对我的验证回调造成严重破坏,因为equip_type_id字段的值在编辑表单上没有,我的验证例程显然需要它.

因此,我需要使equip_type_id字段可见并在添加新记录时正常,但在编辑记录时隐藏.

我已经尝试了所有黑客的黑客攻击:

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

我的理论是"$ this-> uri-> segment(4)"只会在添加新记录时给出错误的结果,但它不起作用.

我也尝试过:

$crud->callback_edit_field('equip_type_id', array($this,'edit_equip_type_field_callback'));
Run Code Online (Sandbox Code Playgroud)

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

但这不起作用它只是搞砸了表单字段的布局 - 'Type'标签等仍然可见.

有什么建议?

Joh*_*dis 7

我认为问题是您必须将字段equip_status_id添加到编辑字段.

所以在你的情况下,这将简单地解决你的问题:

$crud->edit_fields('equip_status_id', 'site_id', 
                        'name', 'barcode_no','equip_status_id'); 
Run Code Online (Sandbox Code Playgroud)

要么

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

当然你也必须使用你的黑客:

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

或者你可以用更合适的方式做到:

$crud = new grocery_CRUD();

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

...
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您还将记住为什么您对代码执行此操作.