Search code examples
phpcodeignitervalidationcodeigniter-3hmvc

Callback form validation is not working in HMVC


I have a problem in using my call back for form validation. The validation should check the tbl_fees_type if there is an existing fees_type_name before creating a new fee type, if it exist already it will show an error The Fees Type already exists.

I know the required form validation is working because it shows it is required but when it comes to callback validation that checks the information from the database if it exists using callback its not working.

This is my code:

So I have a Feestype controller like this

<?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;
        }

       }

    }

    ?>

and this is the model_feestype.php Model

<?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);        
                }

            }
            ?>

and this is my modal form view php file.

<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 -->

The form required validation is working that looks like this. Form validation required working

this is the sample form that I want to achieve, it has the same source code but it runs in codeigniter (not HMVC) but it's not working in my work (HMVC).

Woking callback validation should look like this


Solution

  • All you need to do to make callbacks work in HMVC is

    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);
        }
    
    } 
    

    Then in the run part add $this in run($this)

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