Codeigniter использует обратный вызов проверки для изменения представленного значения - PullRequest
3 голосов
/ 05 июня 2011

У меня есть текстовый ввод, где пользователи отправляют CSV, например, red, blue, red, yellow

Если пользователь отправляет повторяющиеся значения, например, red, как показано выше, я хочу удалить дубликат.Я начал делать обратный звонок, но я не уверен, как это сделать.

    //callback rule
    function _remove_dublicate($str) 
    {
            $val = strtolower($str); //make everything lowercase
            $colors = str_getcsv($val); //create array                          
            $result = array_unique($colors); //remove duplicates

    }

Если есть дубликаты, что я должен сделать, чтобы отправить новую строку из $result в базу данных?

Ниже приведена проверка моей формы

$this->form_validation->set_rules('colors', 'Colors', 'trim|required|xss_clean|regex_match[/^[a-z, ]+$/i]|callback__remove_dublicate');


        if ($this->form_validation->run() == FALSE) //if validation rules fail
        {           
            $this->load->view('edit/form');
        }
        else //success
        {
            $data = array (
                'colors' => $this->input->post('colors')
            );          
            $this->My_model->colors_update($data);          
        }

РЕДАКТИРОВАТЬ

на основе предложения Кабаре. Я добавил это в оператор else для удаления дубликатов

$colors = str_getcsv($this->input->post('colors')); //create array
$result = array_unique($colors); //remove duplicates
$comma_separated = implode(",", $result); //add back CSV string

$data = array (
    'colors' => $comma_separated
);          

Кажется, что он работает

Ответы [ 2 ]

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

Несмотря на комментарии, это совершенно веская причина для использования обратного вызова, подобного правилам "prep", которые фактически изменяют значение введенного ввода (например: trim, xss_clean, strtolower).

Вы на правильном пути, все, что вам нужно сделать, это return $result в вашем обратном вызове, и это изменит ввод, но убедитесь, что вы вернули строку. Пример:

//callback rule
function _remove_duplicate($str = '') 
{
    $val = strtolower($str); //make everything lowercase
    $colors = str_getcsv($val); //create array 
    // you could also use explode(',', $colors)
    // if you aren't expecting other delimiters than a comma
    // i.e. no commas within quotes                         
    $result = array_unique($colors); //remove duplicates
    $result = implode(',', $result); // back to string value
    return $result; // Return the value to alter the input
}

Теперь, если вы хотите предупредить пользователя, что есть дубликаты, а не просто удалять их, просто return FALSE, если они есть, возможно, с count($colors) === count($result), тогда как $result все еще является массивом. Это зависит от вас, но вы точно знаете, что можете вернуть true / false или , чтобы изменить доступный ввод.

На самом деле вы могли бы написать что-то подобное в новом правиле проверки формы внутри самого класса Form_validation (расширить библиотеку или даже просто глобальную функцию), и вам не нужно было бы использовать обратные вызовы, кажется, что это будет очень многоразовая функция .

Это считается "подготовительным" правилом. Из руководства пользователя :

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

$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]|xss_clean');
$this->form_validation->set_rules('password', 'Password', 'trim|required|matches[passconf]|md5');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');

В приведенном выше примере мы «обрезаем» поля, преобразовываем пароль в MD5 и запускаем имя пользователя с помощью функции «xss_clean», которая удаляет вредоносные данные.

Как правило, можно использовать любую встроенную функцию PHP, которая принимает один параметр, например htmlspecialchars, trim, MD5 и т. Д.

Примечание. Как правило, вы хотите использовать функции подготовки после правил валидации, поэтому в случае ошибки исходные данные будут показаны в форме.

Итак, после того, как вы проверили правильность ввода, вы можете приступить к его очистке, обрезке, удалению дубликатов из строки, разделенной запятыми, или что угодно. Любые глобально доступные функции являются допустимыми (включая не нативные функции PHP, например: любые вспомогательные функции CI, если они загружены и определены.), А также любые функции, которые принадлежат библиотеке Form_validation или любому ее расширению Вы можете иметь.

Следует помнить одну вещь: если функция не существует или недоступна, она будет игнорироваться. Всегда проверяйте, чтобы убедиться, что вы получаете правильные результаты.

Надеюсь, это прояснит ситуацию.

2 голосов
/ 05 июня 2011

Лично я бы выбрал метод обратного вызова и обработал бы его позже, после того, как проверка формы прошла успешно. Я не думаю, что есть способ вернуть массив результатов из обратного вызова. По крайней мере, в Руководстве пользователя ничего об этом не указано. Обратные вызовы для библиотеки проверки формы предназначены только для возврата либо true, либо false, Я думаю, .

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

Может быть, кто-то с большим опытом CI знает о лучшем способе, но я бы так и сделал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...