2012-05-10 2 views
0

У меня есть эта функция поиска:Избегайте валидирующей формы в CodeIgniter

public static function search_form() 
{ 
    $form = new Form('search_form'); 

    $form->field('keyword', 'text', array 
    (
     'min_length' => 4, 
     'max_length' => 15, 
     'alphanumeric' => lang('alphanumeric') 
    )); 
    $form->field('category', 'select', array 
    (
     'cat1' => 'Category 1', 
     'cat2' => 'Category 2', 
     'cat3' => 'Category 3' 

    ), $value); 

    if($data = $form->validate()) 
    {   
     header('Location: '.WEB.sprintf('search/'.$data['keyword'].'/'.$data['category'])); 
    } 

    return $form; 
} 

И опциональные проверки, которая работает отлично с входами, но не с выпадающими:

// Validate 
public function validate() 
{ 
    $this->script(); 

    if(!$this->submitted) 
    { 
     return false; 
    } 

    $this->valid = true; 

    foreach($this->fields as $field) 
    { 
     $value = $this->request[$field[0]]; 

     if(isset($field[2]['optional']) && $field[2]['optional']) 
     { 
      if($value == '') continue; 
     } 

     foreach($field[2] as $validator=>$data) 
     { 
      if($validator == 'optional') continue; 

      $custom = !method_exists($this, $validator); 

      if((!$custom && !$this->$validator($value, $data)) || ($custom && !$this->custom($data, $value))) 
      { 
       $this->valid = false; 

       $this->errors[$field[0]] = $this->error_message($field[0], $validator, $data); 

       break; 
      } 
     } 
    } 

    return $this->valid?$this->request:false; 
} 

Когда я добавить дополнительный параметр в текстовом вводе, он работает, но не в выбранном входе:

$form->field('category', 'select', array 
    (
     'optional'  => true, 
    ................. 

Он преобразуется как значение в HT ML Вот выберите случай:

 # Input 
     switch($field[1]) 
     { 
      case 'text': 
      case 'password': 
       if($this->submitted) 
       { 
        echo '<input id="'.$this->id.'_'.$field[0].'" class="text" type="'.$field[1].'" name="'.$field[0].'" value="'.htmlentities(utf8_decode($this->request[$field[0]]), ENT_QUOTES).'"/>'; 
       } else 
       { 
        echo '<input id="'.$this->id.'_'.$field[0].'" class="text" type="'.$field[1].'" name="'.$field[0].'"'.(isset($field[3])?' value="'.$field[3].'"':'').'/>'; 
       } 
       break; 
      case 'textarea': 
       echo '<textarea type="text" id="'.$this->id.'_'.$field[0].'" name="'.$field[0].'">'; 
       echo '</textarea>'; 
       break; 
      case 'select': 
       echo '<select id="'.$this->id.'_'.$field[0].'" name="'.$field[0].'">'; 

       foreach($field[2] as $key=>$value) 
       { 
        echo '<option value="'.$key.'"'; 

        if($this->submitted && $this->request[$field[0]] == $key) 
        { 
         echo ' selected="selected"'; 
        } elseif(isset($field[3]) && $field[3] == $key) 
        { 
         echo ' selected="selected"'; 
        } 

        echo '>'.$value.'</option>'; 
       } 

       echo '</select>'; 
       break; 
     } 

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

Редактировать: На самом деле, я не знаю, почему выпадающее меню не проходит проверку, я просто получаю «error_category» при попытке отправить форму.

Проблема решена:

Функция проверки фактически пытался проверить второе поле ($ поле [2]) и ищет [ «необязательного»] значение, но не мог найти его, так как мое второе поле фактически было массивом категорий. Чтобы решить проблему, я просто добавил новый массив во вторую позицию, содержащий «optional = true», и переместил мой фактический массив в третью позицию. Валидация тогда все в порядке, но значения параметра не появился, так что я просто должен был измениться:

foreach($field[2] as $key=>$value) 
      { 
       echo '<option value="'.$key.'"'; ... 

и заменить $ поле [2] на $ поле [3] Затем просто переместите поле значения (ранее $ поля [3]) до $ поля [4]

+0

Немного смущает. Как вы производите проверку? – stef

+0

Добавляя ' 'факультативный' => верно,', например: '$ form-> поле ('пароль', 'пароль', массив \t \t ( \t \t \t 'дополнительно' \t \t => \t правда, \t \t \t 'подтверждают' \t \t => \t правда, \t \t \t 'min_length' \t => \t \t)); ' – PhilMarc

+0

Есть проблема, я, возможно, нашел решение. Я скоро скажу вам – PhilMarc

ответ

0

проблемы решена:

функция проверки была на самом деле пытается проверить второе поле ($ поля [2]) и ищем ['необязательно '] значение, но не удалось найти его, так как мое второе поле фактически было массивом категорий. Чтобы решить эту проблему, я просто добавил новый массив во вторую позицию, содержащую «optional = true» и переместил мой фактический массив в третью позицию.

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

foreach($field[2] as $key=>$value) 
     { 
      echo '<option value="'.$key.'"'; ... 

и заменить $ поле [2] по $ поле [3] Затем просто переместите поле значений (ранее $ field [3]) в поле $ [4]

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