我可以针对以下问题提出设计建议:
我正在使用Codeigniter/Grocery_CRUD.
我的系统是多租户 - 不同的自治站点 - 在同一个客户端内.我有很多具有唯一逻辑键的表实例.一个这样的表结构是:
equip_items
id(pk)
equip_type_id(fk to equip_types)
site_id(fk to sites)
名称
其中(equip_type_id,site_id,name)一起是我的数据库中的唯一键.
问题是当使用grocery_CRUD表单添加或编辑打破此数据库规则的记录时 - 添加或编辑失败(由于数据库中的约束)但我得不到任何反馈.
我需要对is_unique form_validation规则进行修改,通过该规则我可以指定必须唯一的字段*s*.
问题:
如何指定规则?set_rules()用于给定字段,我有多个规则将应用于的字段.这是否意味着我应该放弃Form_validation模式?或者我是否遵循"匹配"规则模式并以某种方式指向其他字段?
也许一个回调函数会更好,但这意味着在每个模型中编写一个自定义函数,我在这里有这个问题,这是9个表.在一个地方(扩展form_validation)似乎要好得多.
我错过了已经解决了这个问题的codeigniter或grocery_CRUD中的东西吗?
任何您可能有的建议/意见将不胜感激.
编辑: 实际上似乎Johnny提供的解决方案并没有达到标记 - 它强制unique_fields()中的每个字段独立地唯一 - 与在每个字段上设置is_unique()相同.我的问题是,在我的场景中,这些字段是复合唯一键(但不是主键).我不知道它是否重要但是对原始问题陈述更进一步:1)site_id是一个'隐藏'field_type - 我不希望我的用户担心他们在不同的网站上所以我正在处理后面的site_id场景.2)处理equip_status_id属性(不是唯一键的一部分).3)我对所有这些外键属性都有set_relations(),而grocery_CRUD对我有好处.
编辑2 我用回调解决了这个问题.
是否可以将javascript函数添加到grocery_CRUD的添加/编辑表单中?
例如,当用户在添加或编辑记录时键入特定字段时,我想在keydown事件上执行javascript.
如果是这样,怎么样?
PHP和OOP的新手所以请耐心等待......在设计和编写我的第一个PHP和OOP网站之后,我已经处于乐观的早期阶段,经过一生的写作糟糕的M $ VBA垃圾.
我有一个类"User",它有一个带有相关数据库调用的save方法等...(实际上我有DB和DBUtils类来处理连接和CRUD - 我的业务类只调用DB Utils上的select,update,delete方法并传递数据的关联数组)
Anywho ...我的"用户"类由"Admin"类扩展,除了"User"yada yada之外还有一些额外的属性......
在"管理员"中处理保存方法的最佳方法是什么?我知道如果我向Admin类添加一个save方法,它将取代User上的那个,但我不希望它.我想在Admin上编写save方法,只处理特定于Admin对象的属性等,以及继承自"User"的属性,以便在User save方法中处理.
那有意义吗?它是我正在寻找的特定OOP模式吗?任何有关如何设计和构造此代码的帮助或指导将不胜感激.
编辑:哇!感谢下面的所有答案.不确定哪个是我的首选.我将不得不做一些游戏......
我在编辑添加条目时必须可见的条目时尝试隐藏字段时遇到问题.
我的表结构如下:
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字段的值在编辑表单上没有,我的验证例程显然需要它. …