Problems extending CI library Form_validation

Refresh

December 2018

Views

81 time

2

I have tried to extend the Form_validation library from Codeigniter with no success.

I have two functions that I'd like in this extended class but when the validation is run i get these messages in the log:

DEBUG - 06-07-2016 11:20:33 --> Unable to find validation rule: checkAccountnameForUpdate DEBUG - 06-07-2016 11:20:33 --> Unable to find validation rule: checkEmailForUpdate

Here is my extended class which is placed in

application/libraries

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

class MY_Form_validation extends CI_Form_validation 
{
    public function __construct($rules = array())
    {
        // Pass the $rules to the parent constructor.
        parent::__construct($rules);
        // $this->CI is assigned in the parent constructor, no need to do it here.
    }

    public function checkAccountnameForUpdate($accountname, $id)
    {
        return 1;
    }

    public function checkEmailForUpdate($email, $id)
    {
        return 1;
    }
}

And here's my rules:

$this->form_validation->set_rules('editAccountname', 'Brugernavn', 'required|checkAccountnameForUpdate[hiddenField]');
$this->form_validation->set_rules('editEmail', 'Email', 'required|checkEmailForUpdate[hiddenField]');
$this->form_validation->set_message('checkAccountnameForUpdate', 'Test2');
$this->form_validation->set_message('checkEmailForUpdate', 'Test');
// hiddenField is the name of a hiddenField containing the users ID.

I've googled around and tired some different stuff. I have no idea why it doesn't work.

EDIT 1:

I've tried to replace

$this->form_validation->set_rules('editAccountname', 'Brugernavn', 'required|checkAccountnameForUpdate[hiddenField]');
$this->form_validation->set_rules('editEmail', 'Email', 'required|checkEmailForUpdate[hiddenField]');

to

$this->form_validation->set_rules('editAccountname', 'Brugernavn', 'required|checkAccountnameForUpdate');
$this->form_validation->set_rules('editEmail', 'Email', 'required|checkEmailForUpdate');

No changes.

1 answers

0

Вот мое расширение библиотеки проверки. Я оставил несколько функций, как они конкретный участок, но не влияют на демо здесь.

AppPath / библиотеки / MY_Form_validation.php

class MY_Form_validation extends CI_Form_validation
{
  public function __construct($rules = array())
  {
    parent :: __construct($rules);
  }

  /*
   * reformats the input to ###-###-#### and returns formatted string, 
   * if it cannot accomplish the format (of a non-empty input) it returns FALSE.
   */
  public function phone_format($phone)
  {
    if(empty($phone))
    {
      //assume an empty field is OK. 
      //There needs to be a required rule to check a required field and that rule should
      //be before this one in the list of rules
      return TRUE;
    }
    $phone = preg_replace('/[^0-9]/', '', $phone);
    $newPhone = preg_replace("/([0-9]{3})([0-9]{3})([0-9]{4})/", "$1-$2-$3", $phone);
    if(preg_match('/((\d){3})?(\-){1}(\d){3}(\-){1}(\d){4}/', $newPhone))
    {
      //preg_replace was able to reformat it to the correct pattern - must be good
      return $newPhone;
    }
    return FALSE;
  }

  /**
   * field validation for zipcode
   */
  public function check_zipcode($zipcode)
  {
    $result = (bool) preg_match("/^([0-9]{5})(-[0-9]{4})?$/i", $zipcode);
    return $result;
  }
}

Мы можем проверить этот класс с простым контроллером и видом , показанным ниже. Тест использует phone_formatфункцию валидатора.

Пару вещей , чтобы отметить о том , как я использую form_validation->set_rules().

Во- первых, я передать массив правил вместо обычно продемонстрированной трубы разделены строки. например. «отделка | требуется». Зачем? Потому что set_rules()превращает строку в массив в любом случае , так зачем это делать лишнюю работу?

Во- вторых. Обратите внимание , я передаю четвертый аргумент. Четвертый аргумент не очень хорошо документирован. Его применение показано в сообщениях об ошибках Окружения раздела , но это не описано в справочном классе разделе документации. Аргумент принимает массив сообщений об ошибках в виде [ «RULE_NAME» => «Это сообщение об ошибке»].

Я тоже в привычку использовать короткий синтаксис для создания массивов , например. $this->data = [];а $this->data = array();главным образом потому , что это менее типирование.

Вот тест контроллера Testcase.php

class Testcase extends CI_Controller
{
  protected $data;

  function __construct()
  {
    parent::__construct();
    $this->data = [];
    $this->load->library('form_validation');
  }

  public function test_validation()
  {
    $this->form_validation->set_rules('phone', 'Phone'
      , ['trim', 'required', 'phone_format']
      , [
          'phone_format' => 'Not a valid phone number.', 
          'required' => '<em>{field}</em> required.'
        ]
    );

    if($this->form_validation->run() == FALSE)
    {
      $this->load->view('test_form_v', $this->data);
    }
    else
    {
      echo "Passed Validation<br>";
      echo $_POST['phone'];
    }
  }

}

А вот вид файла test_form_v.php

<?php    
echo form_open('testcase/test_validation');
echo form_input('phone', set_value('phone'));
echo form_error('phone');
echo form_submit('Submit', 'Submit');
echo form_close();

Запустите его, введя этот адрес в браузере your_doman.whatever/testcase/test_validation

Разместить без ввода ввода, и вы получите требуемую ошибку. Отправить «123456789», и вы получите сообщение об ошибке недействительный номер телефона. Отправить «1234567890», и вы получите

Пройдена проверка

123-456-7890

Это свидетельствует о том, что расширить класс и его новые валидаторы работы. Я надеюсь, что это поможет вам понять вашу проблему.