Сообщение об ошибке проверки пользовательской формы для Codeigniter 2 - PullRequest
5 голосов
/ 30 апреля 2011

У меня есть выпадающий список с именем "business_id".

<select name="business_id"> 
    <option value="0">Select Business</option> More options... 
</select>

Здесь приводится правило проверки, пользователь должен выбрать опцию.

$this->form_validation->set_rules('business_id', 'Business', 'greater_than[0]');

Проблема в том, что сообщение об ошибке гласит: поле Business должно содержать число больше 0. Не очень интуитивно понятно! Я хочу, чтобы он сказал: «Вы должны выбрать бизнес».

Я пытался:

$this->form_validation->set_message('Business', 'You must select a business');

Но CI complete игнорирует это. У кого-нибудь есть решение для этого?

Ответы [ 10 ]

7 голосов
/ 05 июля 2011

У меня было такое же требование для добавления сообщений об ошибках проверки пользовательских форм в codeigniter 2 (например, «Вы должны согласиться с нашими Условиями и положениями»). Естественно, было бы неправильно переопределять сообщения об ошибках для require и more_than, поскольку это привело бы к ошибочному созданию сообщений для остальной части формы. Я расширил класс CI_Form_validation и переопределил метод set_rules для принятия нового параметра 'message':

<?php

class MY_Form_validation extends CI_Form_validation
{
    private $_custom_field_errors = array();

    public function _execute($row, $rules, $postdata = NULL, $cycles = 0)
    {
        // Execute the parent method from CI_Form_validation.
        parent::_execute($row, $rules, $postdata, $cycles);

        // Override any error messages for the current field.
        if (isset($this->_error_array[$row['field']])
            && isset($this->_custom_field_errors[$row['field']]))
        {
            $message = str_replace(
                '%s',
                !empty($row['label']) ? $row['label'] : $row['field'],
                $this->_custom_field_errors[$row['field']]);

            $this->_error_array[$row['field']] = $message;
            $this->_field_data[$row['field']]['error'] = $message;
        }
    }

    public function set_rules($field, $label = '', $rules = '', $message = '')
    {
        $rules = parent::set_rules($field, $label, $rules);

        if (!empty($message))
        {
            $this->_custom_field_errors[$field] = $message;
        }

        return $rules;
    }
}

?>

С помощью приведенного выше класса вы получите свое правило с пользовательским сообщением об ошибке, например:

$this->form_validation->set_rules('business_id', 'Business', 'greater_than[0]', 'You must select a business');

Вы также можете использовать «% s» в своем пользовательском сообщении, которое автоматически заполнит метку имени поля.

6 голосов
/ 13 декабря 2012

Если вы хотите настроить сообщения об ошибках, которые отображаются с каждым правилом, вы можете найти их в массиве по адресу:

/system/language/english/form_validation_lang.php
3 голосов
/ 30 апреля 2011

Попробуйте не устанавливать атрибут значения по умолчанию, выберите ...

<select name="business_id"> 
    <option value>Select Business</option> More options... 
</select>   

, а затем просто используйте необходимые для вашего правила проверки формы ...

$this->form_validation->set_rules('business_id', 'Business', 'required'); 

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

$this->form_validation->set_message('business_id', 'You must select a business');
instead of
$this->form_validation->set_message('Business', 'You must select a business');

Я не совсем уверен, если это сработает.

1 голос
/ 09 марта 2016

Имя правила является последним параметром.

Пожалуйста, попробуйте:

$this->form_validation->set_message('greater_than[0]', 'You must select a business');

Дополнительная информация: https://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#validationrules

1 голос
/ 17 ноября 2015

для тех из вас, кто работает с CodeIgniter 3, вы можете сделать следующее:

$this->form_validation->set_rules('business_id', 'Business', 'greater_than[0]', array(
'greater_than' => 'You must select a business',
));

И если вы используете CodeIgniter 2, вам нужно будет расширить и переопределить класс CI_Form_validation (https://ellislab.com/codeigniter/user-guide/general/creating_libraries.html для получения дополнительной информации о том, как это сделать) с помощью нового класса CodeIgniter 3 CI_Form_validation и использовать вышеуказанную функцию.

1 голос
/ 28 августа 2012

Небольшой взлом может не подойти, но я сделал это для небольшого изменения.

Например, я хочу изменить сообщение «Поле электронной почты должно иметь уникальное значение».

Я сделал это как

<?php
$error = form_error('email');
echo str_replace('field must be a unique value', 'is already in use.', $error); 
// str_replace('string to search/compare', 'string to replace with', 'string to search in')
?>

Если найдена строка, то она напечатает наше пользовательское сообщение, в противном случае будет отображено сообщение об ошибке, например «Поле электронной почты должно быть действительным адресом электронной почты» и т. Д ...

1 голос
/ 05 июля 2011

Вот простая функция обратного вызова CI2, которую я использовал.Я хотел что-то другое, чем просто «требуемый» в качестве параметра по умолчанию для проверки.Документация помогает: http://codeigniter.com/user_guide/libraries/form_validation.html#callbacks

    public function My_form() {

        ...Standard CI validation stuff...
        $this->form_validation->set_rules('business_id', 'Business', 'callback_busid');
        ...

        if ($this->form_validation->run() == FALSE) {
            return false; 
    }
    else {
        ...process the form...
        $this->email->send();
        }
    } // Close My_form method

    // Callback method
    function busid($str) {

        if ($str == '') {
        $this->form_validation->set_message('business_id', 'Choose a business, Mang!');
        return FALSE;
    }
    else {
        return TRUE;
    }
         } // Close the callback method

Для вашего случая вы можете изменить обратный вызов, чтобы проверить на if($str<0) - я предполагаю, что вы использовали номера в вашем меню выбора / раскрытия.

Если обратный вызов возвращает false, форма удерживается и отображается сообщение об ошибке.В противном случае, он передается и отправляется «else» из form method.

1 голос
/ 04 июля 2011

Вы должны расширить библиотеку Form_validation, как сказал Энтони.

Например, я делаю что-то подобное в файле с именем MY_Form_validation.php, который должен быть помещен в /application/libraries

function has_selection($value, $params)
{
    $CI =& get_instance();

    $CI->form_validation->set_message('has_selection', 'The %s need to be selected.');

    if ($value == -1) {
        return false;
    } else {
        return true;
    }
}

В вашем случае, поскольку ваш первый вариант (вариант навигации - выберите ...) имеет значение 0, вы можете изменить условный оператор с -1 на 0.Затем с этого момента вы можете иметь эту строку для проверки значения выбора:

$this->form_validation->set_rules('business_id', 'Business', 'has_selection');

Надеюсь, это поможет!

0 голосов
/ 03 ноября 2013

Создать метод username_check функция обратного вызова

01.

public function username_check($str)
{
    if ($str=="")
    {
        $this->form_validation->set_message('username_check', 'Merci d’indiquer le nombre d’adultes');
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}

- 02. Затем поместите этот код проверки в свой класс

$this->form_validation->set_rules('number_adults', 'Label Name','Your Message',) 'callback_username_check');

Это может помочь вам

0 голосов
/ 15 сентября 2011

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

приложение / библиотеки / MY_Form_validation.php

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

class MY_Form_validation extends CI_Form_validation {

    function __construct()
    {
        parent::__construct();
        $this->CI->lang->load('MY_form_validation');
    }

     /**
     * Make sure a drop down field doesn't have its default value selected.
     *
     * @access  public
     * @param   string
     * @param   field
     * @return  bool
     * @author  zechdc
     */
    function require_dropdown($str, $string_to_compare)
    {   
        return ($str == $string_to_compare) ? FALSE : TRUE;
    }
}

приложение / язык / английский / MY_Form_validation_lang.php

$lang['require_dropdown']   = 'The %s field must have an item selected.';

Как использовать:

1) Создайте форму в выпадающем списке:

<select name="business_id"> 
    <option value="select">Select Business</option> More options... 
</select>

2) Создайте правило проверки.Возможно, вы сможете установить значение 0 и использовать require_dropdown [0], но я никогда не пробовал этого.

$this->form_validation->set_rules('business_id', 'Business', 'require_dropdown[select]');

3) Установите свое собственное сообщение: (Или пропустите этот шаг и используйте тот вязыковой файл.)

$this->form_validation->set_message('business_id', 'You must select a business');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...