回调表单验证在HMVC中不起作用

时间:2017-04-11 15:16:24

标签: php codeigniter validation codeigniter-3 hmvc

我在使用回调进行表单验证时遇到问题。 如果在创建新的费用类型之前存在fee_type_name,则验证应检查tbl_fees_type,如果已存在则将显示错误费用类型已存在。

我知道所需的表单验证是有效的,因为它表明它是必需的,但是当涉及回调验证时,如果使用回调它存在,则检查数据库中的信息不起作用。

这是我的代码:

所以我有一个像这样的Feestype控制器

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

      class Feestype extends MX_Controller {

        public function __construct() {
          parent::__construct();

          // loading the fees type model
          $this->load->model('model_feestype');

          // loading the form validation library
          $this->load->library('form_validation');

      }

      public function index() {

            $this->load->view('feestype');

      }

      public function create()
      {
        $validator = array('success' => false, 'messages' => array());

        $validate_data = array(
          array(
            'field' => 'fees_type_name',
            'label' => 'Fees Type Name',
            'rules' => 'trim|required|callback_validate_feestypename' 
                                      //this is the callback
          ),
          array(
            'field' => 'fees_type_role',
            'label' => 'Fees Type Role',
            'rules' => 'trim|required|'
          )
        );

        $this->form_validation->set_rules($validate_data);
        $this->form_validation->set_error_delimiters('<p class="text-danger">','</p>');

        if($this->form_validation->run() === true) {  
          $create = $this->model_feestype->create();         
          if($create === true) {
            $validator['success'] = true;
            $validator['messages'] = "Successfully added";
          }
          else {
            $validator['success'] = false;
            $validator['messages'] = "Error while inserting the information into the database";
          }     
        }   
        else {
          $validator['success'] = false;
          foreach ($_POST as $key => $value) {
            $validator['messages'][$key] = form_error($key);
          }     
        } // /else

        echo json_encode($validator);
      }

      // call back validation function to do
      public function validate_feestypename()
      {
        $validate = $this->model_feestype->validate_feestypename();

        if($validate === true) {
          $this->form_validation->set_message('validate_feestypename', 'The {field} already exists');
          return false;           
        }
        else {
          return true;
        }

       }

    }

    ?>

这是model_feestype.php模型

<?php if (!defined ('BASEPATH')) exit ('No direct script access allowed');

                class Model_Feestype extends CI_Model {


                    public function __construct() {

                        parent:: __construct();

                    }

                public function create()
                {
                    $insert_data = array(
                        'fees_type_name' => $this->input->post('fees_type_name'),
                        'fees_type_role' => $this->input->post('fees_type_role')
                    );
                    $status = $this->db->insert('tbl_fees_type', $insert_data);     
                    return ($status === true ? true : false);
                }



                public function validate_feestypename()
                {
                    $feestypeName = $this->input->post('fees_type_name');
                    $sql = "SELECT * FROM tbl_fees_type WHERE fees_type_name = ?";
                    $query = $this->db->query($sql, array($feestypeName));

                    return ($query->num_rows() == 1 ? true : false);        
                }

            }
            ?>

这是我的模态表单视图php文件。

<div class="modal fade" tabindex="-1" role="dialog" id="addFeetype">
                  <div class="modal-dialog" role="document">
                    <div class="modal-content">
                      <div class="modal-header">
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        <h4 class="modal-title">Add Fees Type</h4>
                      </div>

                      <form method="post" action="feestype/create" id="createFeetypeForm">
                          <div class="modal-body">



                              <div class="form-group">
                                <label for="fees_type_name">Fees Type Name</label>
                                <input type="text" class="form-control" id="fees_type_name" name="fees_type_name" placeholder="Fees Type Name">
                              </div>

                              <div class="form-group">
                              <label for="fees_type_name">Fees Type Role</label>
                                <select class="form-control" name="fees_type_role" id="fees_type_role">
                                  <option></option>
                                  <option>School Fees</option>
                                  <option>Personal Fees</option>
                                </select>
                              </div>


                          </div>

                          <div class="modal-footer">
                            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                            <button type="submit" class="btn btn-primary">Save changes</button>
                          </div>

                      </form>

                    </div><!-- /.modal-content -->
                  </div><!-- /.modal-dialog -->
                </div><!-- /.modal -->

表单所需的验证工作如下所示。 Form validation required working

这是我想要实现的示例表单,它具有相同的源代码,但它在codeigniter(不是HMVC)中运行,但它在我的工作中不起作用(HMVC)。

Woking callback validation should look like this

2 个答案:

答案 0 :(得分:0)

在文件夹库中创建类MY_Form_validation

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Form_validation extends CI_Form_validation{

function run($module = '', $group = ''){
(is_object($module)) AND $this->CI = &$module;
return parent::run($group);
}

// call back validation function to do
      public function validate_feestypename()
      {
       $this->CI =& get_instance();
       $this->CI->load->model('model_feestype');
        $validate = $this->CI->model_feestype->validate_feestypename();

        if($validate === true) {
               $this->CI->form_validation->set_message->set_message('validate_feestypename', 'The {field} already exists');
          return false;           
        }
        else {
          return true;
        }

       }

}

答案 1 :(得分:0)

要让回调在HMVC中运行,您需要做的就是

MY_Form_validation.php

<?php

class MY_Form_validation extends CI_Form_validation {

    function run($module = '', $group = '') {
        (is_object($module)) AND $this->CI = &$module;
        return parent::run($group);
    }

} 

然后在运行部分中添加$this

中的run($this)
$this->form_validation->run($this)