Проверка выпадающего списка формы в CodeIgniter - PullRequest
9 голосов
/ 14 марта 2010

Я использую помощник по формам CodeIgniter и библиотеку проверки форм для создания моих форм. У меня проблемы с тем, чтобы сделать раскрывающийся список "липким", а также найти соответствующие правила проверки.

Вот как я заполняю раскрывающийся список:

foreach($events as $event){
$options[$event->event_title] = $event->event_title;
}
$firstItem = '<option>Please select one...</option>';
echo form_dropdown('events', $options, '', $firstItem);

Это построение опций из событий, хранящихся в базе данных. Форма выглядит нормально и правильно заполняет все поля.

Однако, когда я прихожу, чтобы отправить форму, раскрывающийся список не удерживает выбранное значение? Кроме того, как я должен это проверить, я хочу сделать это обязательным, но я также хочу убедиться, что я не за исключением первого варианта в раскрывающемся списке «Пожалуйста, выберите один ...»

Заранее спасибо.

Cheers, Gaz

Ответы [ 5 ]

8 голосов
/ 15 марта 2010

Вы делаете это в представлении? Я покажу вам, я справлюсь с этим, но все это происходит в контроллере:

// first, we can set a validation rule for the input 'country' (our dropdown), in this case it is required, and must be a natural number. You can look up more rules in the CI user guide, and you can write your own functions as well and add them to the 3rd parameter here. I believe some native PHP functions can be used as well.
$this->form_validation->set_rules('country', 'Country', 'required|is_natural');

// the form is not valid! we'll enter this block whenever the form validation rules above are not met, as well as when first going to this controller-action.
if ($this->form_validation->run() == FALSE) {
    // buid your form, there's some CI functions to help with this that I'm using
    $my_form = form_open('user/edit', 'class="superform"')
        . form_fieldset()
        . '<ol>'
        . '<li>'
        . form_label('Country<br/>', 'country')
        // so here is the dropdown, matching the name given to the validation rule we've set, the second parameter takes an array, which I am grabbing from a model, the last parameter is the 'selected; value, which I am grabbing from some variable, if it's not present the first item in the dropdown will obviously be selected
        . form_dropdown('country', $this->Country_model->get_countries_dropdown(), $user->country)
 . form_error('country', ' <em>', '</em>'
        . form_submit('mysubmit', 'Save', 'class="button"')
        . '</li>'
        . '</ol>'
        . form_fieldset_close()
        . form_close()
    );
    // sending the form variable to my view, where i will simply <?=$my_form?> it
    $this->load->view('user_edit', $my_form);
} else {
    // form has validated! do something!
}

Функция form_dropdown () принимает массив, который настроен следующим образом: $ key => $ value Где ключ в моем случае - идентификатор страны, а значение - название страны. У меня есть пара '0' => 'NONE' в начале массива моей страны, поэтому пользователь не может выбрать ее. Если бы я хотел сделать это обязательным, как в вашей ситуации, я мог бы установить его на «-1» => «Пожалуйста, выберите ...», и он не будет проверяться, поскольку -1 не является натуральным числом.

Надеюсь, моя болтовня поможет!

Edit:

Хорошо, поэтому перед созданием раскрывающегося списка с помощью form_dropdown () вам нужно будет проверить, выбрано ли выбранное значение из массива POST.

В случае CI вы можете использовать функцию set_value ($ input), поэтому в моем примере формы я мог бы сделать что-то вроде:

$selected = (!empty(set_value('country'))) ? set_value($country) : '';

form_dropdown('country', $this->Country_model->get_countries_dropdown(), $selected)

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

4 голосов
/ 10 октября 2011

Лично мне ДЕЙСТВИТЕЛЬНО нравится создавать форму в представлении, а не смешивать презентацию с контроллером.Но это только мое мнение.Я понимаю необходимость предварительной загрузки данных, если это большой список, но я не думаю, что вам действительно нужно создавать всю форму только для выпадающего списка.У меня возникла та же проблема, и я немного покопался, чтобы найти хорошее решение.

Для проверки выбора выбора
Все, что я сделал для этого, - это предоставил собственный метод вкласс контроллера, который выглядит примерно так:

function select_validate($selectValue)
{
    // 'none' is the first option and the text says something like "-Choose one-"
    if($selectValue == 'none')
    {
        $this->form_validation->set_message('select_validate', 'Please pick one.');
        return false;
    }
    else // user picked something
    {
        return true;
    }
}

В вашем index () (или любом другом методе обработки данных и загрузки представления) вы устанавливаете свой код проверки для раскрывающегося списка.

$this->form_validation->set_rules('select', 'Select', 'callback_select_validate');

Это императив , чтобы вы добавили свою пользовательскую функцию к "обратному вызову _".

Сохранение выбора пользователя Сохранение выбора выбора также очень просто, еслиCI дает вам.Вам просто нужно использовать функцию set_select () для каждой опции в списке выбора.

Итак, допустим, у вас есть выпадающий список с двумя опциями, чтобы упростить его.Это все, что вы делаете.

<select name="select">
    <option value="none" <?php echo set_select('select', 'none', true);?> >- Select One -</option>
    <option value="one" <?php echo set_select('select', 'one');?> >Option one</option>
    <option value="two" <?php echo set_select('select', 'two');?> >Option two</option>
</select>

Что приятно при использовании этой функции, так это то, что она предварительно выбирает первую «фиктивную» опцию, а затем, если пользователь делает выбор, но не проходит другие проверки, выбор будетсохраняется и предварительно выбирается после публикации формы и предлагает пользователю исправить другие ошибки.

Опять же, это может не удовлетворить всех, но это довольно простое решение для проверки выпадающего списка с CodeIgniter.

4 голосов
/ 13 января 2011

В вашей строке:

echo form_dropdown('events', $options, '', $firstItem);

Просто сделай это:

echo form_dropdown('events', $options, set_value('events'), $firstItem);
1 голос
/ 19 февраля 2013

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

foreach($events as $event){
    $options[$event->event_title] = $event->event_title;
}

$firstItem[''] = 'Please select one...';

// I used array merge to ensure that my firstItem was infact my first item, 
// otherwise you could just do $options[''] = 'Please select one...'. 
// Array_unshift also does not allow you to specify the [''] array key we want
$options = array_merge($firstItem, $options);

$selected_option = $this->input->post('events', TRUE) ? $this->EE->input->post('events', TRUE) : '';

echo form_dropdown('events', $options, $selected_option);

Затем с проверкой вы можете просто сделать:

$this->form_validation->set_rules('events', 'Events', 'required');

Затем проверка возвращает обычное «обязательное» сообщение

0 голосов
/ 03 ноября 2011

Была такая же проблема и ей удалось ее решить:

  • проверка JavaScript с использованием проверки spry javascript
  • функция обратного вызова codeigniter в классе проверки формы

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

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