如何使用Codeigniter和Jquery验证多维数组

时间:2012-09-17 17:04:22

标签: jquery arrays codeigniter validation multidimensional-array

您好,我需要验证像这样的多维表单

<input type="text" class="input-xlarge span5 req" id="contact_first_name" name="hotel[<?=$id?>][contact_first_name]" value="<?= set_value('hotel[contact_first_name]') ?>">
<input type="text" class="input-xlarge span5 req" id="contact_last_name" name="hotel[<?=$id?>][contact_last_name]" value="<?= set_value('hotel[contact_last_name]') ?>">

我不知道最终数组的维数,因为输入是通过jquery动态添加的。

我在服务器端使用Codeigniter Form_Validation,在客户端使用JQuery Validator通过JQuery。

这是我的form_validation规则

$config['add_hotel'] = array(
array(
    'field' => 'hotel[][hotel_name]', 
    'label' => 'Hotel Name', 
    'rules' => 'required'
    ),    
array(
    'field' => 'hotel[][contact_first_name]', 
    'label' => 'First Name', 
    'rules' => 'trim|required'
    ),
array(
    'field' => 'hotel[][contact_last_name]', 
    'label' => 'Last Name', 
    'rules' => 'trim|required'
    ),

这就是我通过jquery验证器

的方式
$("#add_hotel").validate({
rules: {
    "hotel[][hotel_name]": "required"

  /*  errorElement: "div",
    wrapper: "div"*/
},
messages: {
   "hotel[][hotel_name]": "Please enter the Association Name"
},
submitHandler: function(form) {
    form.submit();
}

不知道如何使用自己的id验证每个Hotel[]输入,或者可能有另一种方法来定义更简单的输入。

3 个答案:

答案 0 :(得分:9)

发布数组

$hotel = $this->input->post('hotel');
if(!empty($hotel))
{
    // Loop through hotels and add the validation
    foreach($hotel as $id => $data)
    {
        $this->form_validation->set_rules('hotel[' . $id . '][contact_first_name]', 'First name', 'required|trim');
        $this->form_validation->set_rules('hotel[' . $id . '][contact_last_name]', 'Last name', 'required|trim');
    }
}

始终适用的默认规则

$this->form_validation->set_rules('username', 'Username', 'required');

if ($this->form_validation->run() == FALSE)
{
    // Errors
}
else
{
    // Success
}

答案 1 :(得分:0)

Codeigniter有一种非常严格的方式来处理命名为数组的输入的验证规则,它只会验证字段名称是否完全相同,因此规则

array(
    'field' => 'hotel[][hotel_name]', 
    'label' => 'Hotel Name', 
    'rules' => 'required'
    ),    

仅在该字段实际命名为hotel [] [hotel_name]时才有效 由于这不是字段的名称(实际名称类似于hotel [1] [hotel_name]),因此Codeigniter将不会对其进行验证。

您可以使用dinamically生成配置数组,但我认为您最好分别为这些字段编写自己的验证规则。

答案 2 :(得分:0)

   is not working i am trying to like this
     in api data 
     {
      "fullname":"4545",
    "family_detail": [
       {
        "relation_id":""
      },
      {
        "relation_id":"11"
       }]
    }

   in controller 
   $_POST = json_decode(file_get_contents('php://input'),true);

   if ($this->form_validation->run('signup') == FALSE)
    {
     //error
    }else{
      // success
    } 
     in my config file
     $config = array(
   'signup' => array(   
    array(
     'field' => 'fullname',
     'label' => 'Full Name',
    'rules' => 'required'
      ),
     array(
    'field' => 'family_detail[][relation_id]',
    'label' => 'relation_id',
    'rules' => 'required'
     ),
     )