Функция set_select () не работает

Я использовал некоторые коды, как показано ниже,

<select class="form-control selection" name="currency"> <option value="">select currency</option> <option value="AED"<?php echo set_select('currency', 'AED'); ?> >AED</option> <option value="SAR"<?php echo set_select('currency', 'SAR'); ?> >SAR</option> <option value="MAD"<?php echo set_select('currency', 'MAD'); ?> >MAD</option> <option value="TRY"<?php echo set_select('currency', 'TRY'); ?> >TRY</option> </select> 

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

Прежде чем использовать set_value() , set_select() , set_checkbox() , set_radio() , вы должны передать эти поля для проверки, даже если это не требуется / проверено.

TL; DR

Есть только два случая, когда вы используете вспомогательные функции формы CodeIgnIter set_* :

  1. Библиотека Form_validation не загружена.
  2. Объект проверки Form_validation экземпляром (вы используете библиотеку Form_validation ).

Чтобы использовать вспомогательные функции set_* , вам необязательно использовать библиотеку проверки формы, но если вы используете библиотеку проверки, вы ДОЛЖНЫ установить хотя бы правило проверки для этого поля .

Длительный ответ (set_ * Анатомия)

Для всех вспомогательных функций формы set_* справедливо следующее. Но я попытаюсь описать, как работает set_select() :

Синтаксис: set_select($field = '', $value = '', $default = FALSE)

1. Без использования проверки формы

Когда вы используете set_select() , CodeIgniter использует _get_validation_object() для поиска объекта проверки .

_get_validation_object() возвращает либо object либо FALSE (если проверка еще не загружена).

Когда он возвращает FALSE , set_select() ищет переменную $_POST чтобы найти указанное имя field в массиве, а в следующем , проверяя функциональные параметры, такие как $value и $default , определяет, будет ли возвращено selected="selected" атрибут / значение или пустая строка '' .

Таким образом, он работает без использования библиотеки проверки формы.

2. При использовании проверки формы

Но если раньше библиотека проверки была загружена, set_select() передаст аргументы Form_validation::set_select() и вернет результат.

В классе Form_validation существует частное свойство, называемое _field_data которое представляет собой массив, содержащий все имена / значения полей ( те, для которых вы установили для них правила проверки ).

Form_validation::set_select() проверяет существование field в массиве _field_data и возвращает пустую строку при _field_data .

Массив _field_data заполняется методом validation set_rules() .

Следовательно, если вы используете библиотеку валидации, вы должны установить, по крайней мере, правило проверки для своего field чтобы получить set_select() helper-функции set_select() .

Вот почему вы не могли заставить его работать.

Я надеюсь, что этот ответ поможет получить хорошее представление о set_* .

Попробуй это:

Измените функцию set_select в set_select формы из:

 if (count($_POST) === 0) { return ' selected="selected"'; } 

в

 if (count($_POST) === 0) { if ($default) { return ' selected="selected"'; } else { return ''; } } 

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