更新:此代码现在是杂货店 CRUD 版本 >= 1.4 的一部分,您不再需要使用扩展程序。有关更多信息,请参阅unique_fields的文档
我将尝试尽可能简单地解释它:
1.首先对于那些杂货CRUD低于或等于1.3.3的人必须使用这个小改动:https ://github.com/scoumbourdis/grocery-crud/commit/96ddc991a6ae500ba62303a321be42d75fb82cb2
2.其次在application/libraries创建一个名为grocery_crud_extended.php的文件
3.将以下代码复制到您的文件 application/libraries/grocery_crud_extended.php
<?php
class grocery_CRUD_extended extends grocery_CRUD
{
protected $_unique_fields = array();
public function unique_fields()
{
$args = func_get_args();
if(isset($args[0]) && is_array($args[0]))
{
$args = $args[0];
}
$this->_unique_fields = $args;
return $this;
}
protected function db_insert_validation()
{
$validation_result = (object)array('success'=>false);
$field_types = $this->get_field_types();
$unique_fields = $this->_unique_fields;
$add_fields = $this->get_add_fields();
if(!empty($unique_fields))
{
$form_validation = $this->form_validation();
foreach($add_fields as $add_field)
{
$field_name = $add_field->field_name;
if(in_array( $field_name, $unique_fields) )
{
$form_validation->set_rules( $field_name,
$field_types[$field_name]->display_as,
'is_unique['.$this->basic_db_table.'.'.$field_name.']');
}
}
if(!$form_validation->run())
{
$validation_result->error_message = $form_validation->error_string();
$validation_result->error_fields = $form_validation->_error_array;
return $validation_result;
}
}
return parent::db_insert_validation();
}
protected function db_update_validation()
{
$validation_result = (object)array('success'=>false);
$field_types = $this->get_field_types();
$unique_fields = $this->_unique_fields;
$add_fields = $this->get_add_fields();
if(!empty($unique_fields))
{
$form_validation = $this->form_validation();
$form_validation_check = false;
foreach($add_fields as $add_field)
{
$field_name = $add_field->field_name;
if(in_array( $field_name, $unique_fields) )
{
$state_info = $this->getStateInfo();
$primary_key = $this->get_primary_key();
$field_name_value = $_POST[$field_name];
$ci = &get_instance();
$previous_field_name_value =
$ci->db->where($primary_key,$state_info->primary_key)
->get($this->basic_db_table)->row()->$field_name;
if(!empty($previous_field_name_value) && $previous_field_name_value != $field_name_value) {
$form_validation->set_rules( $field_name,
$field_types[$field_name]->display_as,
'is_unique['.$this->basic_db_table.'.'.$field_name.']');
$form_validation_check = true;
}
}
}
if($form_validation_check && !$form_validation->run())
{
$validation_result->error_message = $form_validation->error_string();
$validation_result->error_fields = $form_validation->_error_array;
return $validation_result;
}
}
return parent::db_update_validation();
}
}
4.现在你只需要像这样加载grocery_CRUD_extended:
$this->load->library('grocery_CRUD');
$this->load->library('grocery_CRUD_extended');
然后使用:
$crud = new grocery_CRUD_extended();
代替:
$crud = new grocery_CRUD();
5.现在你可以简单地拥有它的unique_fields,它的工作方式如下:
$crud->unique_fields('field_name1','field_name2','field_name3');
在你的情况下:
$crud->unique_fields('equip_type_id','site_id');
很容易吧?
这是在不实际更改杂货店 CRUD 的核心的情况下检查该字段是否唯一。您可以简单地使用grocery_CRUD_extended 而不是grocery_CRUD 并照常更新grocery CRUD 库。由于我是该库的作者,我将尝试将其包含在杂货店 CRUD 1.4 版中,因此您将来不必使用杂货店_CRUD_extended。