2016-10-26 3 views
0

У меня есть HTML-форма, созданная с использованием Codeigniter и PHP. Я пытаюсь установить проверку на 2 поля. Поля могут быть пустыми, но если один заполняется, а не другой, то должна быть создана ошибка. Поля:HTML-поля формы - подтвердить или разрешить пустой

-ltitle []
-llink [] //array of multiple links corresponding to ltitle[]

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

 if( !empty($_POST['ltitle']) || !empty($_POST['llink'])) 
    { 
    $this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link'); 
    $this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link'); 
    } 

check_link функция:

function check_link($ltitle){ 

    $llink = $_POST['llink']; 
    if(empty($ltitle) && empty($llink)) 
    { 
     return true; 
    } 
    elseif( (empty($ltitle) && !empty($llink)) || (!empty($ltitle) && empty($llink)) ) 
     { 
     $this->form_validation->set_message('check_link', 'Complete the link fields correctly'); 
     return false; 
     } 
    else 
    { 
     return true; 
    } 

} 

В тот момент, когда форма была отправлена ​​с обоих полей пустым, то появляется сообщение об ошибке «Заполните поля ссылку правильно», что означает функцию check_link выполнил. Но поля пустые? ! Было бы очень полезно помочь в этом!

+0

Почему вы добавили '$ llink = $ _POST ['llink'];' но не '$ ltitle = $ _POST ['ltitle'];'? Ваша функция обратного вызова, похоже, работает, как ожидалось, при проверке '$ ltitle', но не при проверке' $ llink'. – roberto06

+0

изменить это 'if (! Empty ($ _ POST ['ltitle']) &&! Empty ($ _ POST ['ltitle']))' –

+0

Я изменил check_link: "function check_link() { $ ltitle = $ _POST ['ltitle']; $ llink = $ _POST ['ltitle']; if ((empty ($ ltitle) &&! Empty ($ llink)) || (! Empty ($ ltitle) && empty ($ LLINK))) { $ this-> form_validation-> set_message ('check_link', 'Заполните поля ссылку правильно'); возвращение ложным;} еще { возвращающие; } } " , который теперь позволяет отправлять пробелы. Но это не ошибка, когда заполняется только одно поле? – RebeccaRol

ответ

0

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

Изменение этого

if( !empty($_POST['ltitle']) || !empty($_POST['ltitle'])) 
{ 
$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link'); 
$this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link'); 
} 

к этому

$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link'); 
$this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link'); 
$this->form_validation->set_message('check_link', 'Complete the link fields correctly'); 

То же обратного вызова используется для каждого поля, которое означает, что параметр передается это значение поля проверяется. Вы извлекаете $_POST['llink'], но это будет переданный параметр в одном случае. Вы должны получить оба явно и игнорировать параметр. Кроме того, логика может быть значительно упрощена.

function check_link($ltitle) 
{ 
    //use trim() to make sure the value isn't a string of one (or more) space characters 
    $is_llink = !empty(trim($_POST['llink'])); 
    $is_ltitle = !empty(trim($_POST['ltitle'])); 
    return ($is_llink && $is_ltitle) || (!$is_llink && !$is_ltitle); 
} 

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

На самом деле в последней строке в функции обратного вызова может быть еще более простой.

Изменить

return ($is_llink && $is_ltitle) || (!$is_llink && !$is_ltitle); 

в

return $is_llink === $is_ltitle; 

EDIT 2

Еще более простой. Не устанавливайте правило для обоих полей. Это устраняет необходимость в получении обоих элементов $_POST, потому что один передается на обратный вызов.

В контроллере

$this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean|callback_check_link'); 
$this->form_validation->set_message('check_link', 'Complete the link fields correctly'); 

Затем обратный вызов становится

function check_link($ltitle) 
{ 
    return empty(trim($ltitle)) === empty(trim($_POST['llink'])); 
} 
0

В коде воспламенитель $ _POST [ ""] = $ этом-> вход-> пост ("")

//Set the values not to null, but to an empty variable 
$llink = ""; 
$ltitle = ""; 
if ($this->input->post("ltitle") = $ltitle AND $this->input->post("llink ") = $llink) 
//If the inputs have an empty value 
{ 

} 
//Make sure they are both set, and populated 
else if (!empty($this->input->post("ltitle")) AND !empty($this->input->post("llink ")) 
//If they are both set, then check their values 
{ 
    //Title doesn't need a link check i think 
    $this->form_validation->set_rules('ltitle[]', 'ltitle', 'xss_clean'); 
    $this->form_validation->set_rules('llink[]', 'llink', 'xss_clean|callback_check_link'); 
    //Run the validation procces 
    if ($this->form_validation->run() == FALSE) 
    { 
     $this->form_validation->set_message('check_link', 'Complete the link fields correctly'); 
    } 
    else 
    { 
     $this->load->view('formsuccess'); 
    } 
} 

И убедитесь, что ваши обратные вызовы (callback_check_link) действительны и выполняют проверку для достоверности ссылки.

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