2016-06-10 3 views
0

У меня есть выделенный файл, расположенный в applications/config/form_validation.php для моих валидаций. Два поля для создания нового пользователя должны быть уникальными, их идентификационная карточка и электронная почта.Проблемы с проверкой Codeigniter для уникальных полей при редактировании формы

'user' => array(
    array(
     'field' => 'email', 
     'label' => 'E-MAIL', 
     'rules' => 'required|valid_email|is_unique[usuario.email]' 
    ), 
    array(
     'field' => 'cpf_cnpj', 
     'label' => 'CPF', 
     'rules' => 'required|_validate_cpf|is_unique[usuario.cpf_cnpj]' 
    ), 
    ... 
) 

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

Итак, я добавил в мою форму поле hidden, чтобы сохранить текущее значение этих полей и добавить другое, также сохраняя значение, но только тот, который отображается в представлении, будет единственным, который будет редактироваться, и затем, в методе edit, условие будет происходить, прежде чем продолжить, чтобы проверить, если hidden поле отличается от регулярного поля:

// HTML 
<input type="email" name="novoemail" class="email <?php echo form_error('novoemail') ? 'campo_aviso' : ''; ?>" value="<?php echo $u['email']; ?>"/> 
<input type="hidden" name="email" value="<?php echo $u['email']; ?>"/> 

// In `edit` 
if ($this->input->post('email') !== $this->input->post('novoemail')) { 
    $this->form_validation->set_rules('email', 'E-MAIL', 'is_unique[usuario.email]'); 
} 

if ($this->form_validation->run('edit_user')) { ... } 

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

Мне нужно найти способ редактировать уникальные поля и по-прежнему гарантировать уникальность.

ответ

1

Я не согласен с этой методологией. Если правило is_unique терпит неудачу, вы должны выяснить, почему вместо того, чтобы пытаться обойти его.

Независимо от того, вам нужно было бы запустить какой-то конкатенированный обратный вызов в правиле проверки, я бы подумал. Я считаю, что массивы проверки достоверны, поэтому я их не использую. Пожалуйста, не стесняйтесь адаптировать что-то вроде:

$this->form_validation->set_rules('test', 'Test Post', 'trim|less_than[99]'.($this->input->post('test') === $this->input->post('test2' ? 'required' : ''))); 

Там, наверное, лучше ответ, может быть каким-то образом использовать встроенный в «спичек» правила проверки. Я бросил это в проект CI, и он не сделал никаких ошибок, но я не тестировал его на законных данных.

+0

Это не удается, потому что в 'form_validations.php' издание также проверяет, является ли оно уникальным. Это проблема CI. В любом случае, ваше решение помогло мне. Я немного отредактировал, повторно использовал методы, которые я создал и работал. Очень признателен. – mfgabriel92

+0

Отлично, я рад, что вы смогли сделать что-то полезное. – Joe

1

Я согласен с методологией. Идея использования скрытых полей будет работать и полезна для определения правильного набора правил для использования с form_validation->run().

Этот ответ хранится с использованием конфигурационного файла для правил и позволяет напрямую использовать set_rule().

Вы можете легко манипулировать массивами в config/form_validation.php, чтобы вернуть нужный вам набор и в то же время не иметь кучу повторяющегося кода.

Рассмотрим эту версию config/form_validation.php

$check_email = array(
    'field' => 'novo_email', 
    'label' => 'E-MAIL', 
    'rules' => 'trim|required|valid_email|is_unique[usuario.email]' 
); 

$check_card = array(
    'field' => 'novo_cpf_cnpj', 
    'label' => 'CPF', 
    'rules' => 'trim|required|_validate_cpf|is_unique[usuario.cpf_cnpj]' 
); 

$config = array(
    'edit_email' => array($check_email), 
    'edit_cpf_cnpj' => array($check_card), 
    'new_user' => array($check_email, $check_card) 
); 

выше создает три отдельных набора правил и не воссоздании структуры кода.

Есть только два случая, когда вам даже нужно выполнить проверку поля.

  1. Новый пользователь
  2. Один или оба поля изменилось

Если для нового пользователя, вы всегда установить значение скрытых полей в пустую строку (или NULL) " новый пользователь "легко определить.В этом случае вам понадобятся правила «new_user» из файла конфигурации.

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

Вот как реализовать эту логику в функции edit. Примечание: поля novo_* - это те, которые пользователь редактирует.

public function edit() 
{ 
    //instead of multiple calls to $this->input->post, 
    //capture all the inputs in one handy array 
    $posted = $this->input->post(); 

    //check for new user (true when the hidden field 'email' is blank 
    //if 'email' is blank then 'novo_cpf_cnpj' should be too 
    if(empty($posted['email'])) 
    { 
    $rules = 'new_user'; 
    } 
    else //not a new user. What has changed? 
    { 
    //note the use of trim - in case user added spaces to an otherwise unchanged field 
    $changed_email = $posted['email'] !== trim($posted['novo_email']); 
    $changed_cpf_cnpj = $posted['cpf_cnpj'] !== trim($posted['novo_cpf_cnpj']); 
    if($changed_email && $changed_cpf_cnpj) 
    { 
     //both have changed, treat like a new user 
     $rules = 'new_user'; 
    } 
    elseif($changed_email) 
    { 
     $rules = 'edit_email'; 
    } 
    elseif($changed_cpf_cnpj) 
    { 
     //only possibility left - cpf_cnpj is changed 
     $rules = 'edit_cpf_cnpj'; 
    } 
    } 

    if(! isset($rules)) 
    { 
    //Not a new user and nothing changed so validation is not needed. 
    //Behave as if successful validation occurred and redirect to successful save page 
    redirect('controller/save_success'); 
    //redirect() does not return because it always calls the PHP 
    //function exit thereby ending script execution. 
    //So, there is no need for an else to if(!isset($rules)) 
    } 

    if($this->form_validation->run($rules)) 
    { 
    //save to database then 
    redirect('controller/save_success'); 
    } 
    //whatever happens when validation fails 
} 
+0

Спасибо, очень приятно. – mfgabriel92

Смежные вопросы