2010-03-14 14 views
9

Używam pomocnika formularza CodeIgniter i formularza biblioteki sprawdzania poprawności do budowania moich formularzy. Mam problem z zaznaczeniem listy "lepkie" i znalezieniem odpowiednich reguł sprawdzania poprawności.Validating dropdown formularza w CodeIgniter

To jak mam wypełniania drodown:

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

To jest budowanie opcje z wydarzeń zapisanych w bazie danych. Formularz wygląda dobrze i poprawnie wypełnia wszystkie pola.

W każdym razie, kiedy przychodzę złożyć formularz, menu nie trzyma się wybranej wartości? Ponadto, w jaki sposób powinienem to sprawdzić, chcę to uczynić, ale chcę się upewnić, że nie wybieram pierwszej opcji z menu "Wybierz jedną ..."

Z góry dziękuję.

Cheers, Gaz

Odpowiedz

8

to robisz w widoku? Pokażę trzeba sobie radzić, ale to wszystko dzieje się w kontrolerze:

// 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! 
} 

Funkcja form_dropdown() przyjmuje tablicę, która jest konfiguracja jak: $ key => $ value gdzie klucz w mój przypadek to identyfikator kraju, a wartość to nazwa kraju. Mam parę "0" => "NONE" na początku mojej tablicy kraju, więc użytkownik nie może wybrać jednej. Jeśli chciałem uczynić to wymaganym tak jak twoją sytuację, mógłbym ustawić go na "-1" => "Proszę wybrać ..." i to nie sprawdzałoby, ponieważ -1 nie jest liczbą naturalną.

Mam nadzieję, że moje wędrówki pomogą!

Edit:

Ok, więc przed utworzeniem rozwijaną z form_dropdown(), co będziemy chcieli zrobić, to sprawdzić na wybranej wartości od pochodzących z tablicy POST.

W przypadku CI, można użyć SET_VALUE function ($ wejście), więc w moim przykładzie postaci mógłbym zrobić coś takiego:

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

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

Więc teraz wybrana wartość rozwijanej zostanie ustawiony do tego, co zostało wybrane w ostatnim poście. Możesz sprawdzić tę wartość, aby upewnić się, że jest poprawna. Jeśli nic nie zostało wybrane, możesz ustawić wartość $ selected jako coś podobnego do wartości aktualnie w bazie danych lub wartość domyślną, którą wybrałeś.

+0

„niezbędna” To świetnie - że działało dobrze. Myślisz, że byłby lepszy sposób na zrobienie tego? Jakieś pomysły, w jaki sposób sprawiają, że lista rozwijana jest "lepka"? – Gaz

+0

Masz na myśli, jeśli formularz został złożony, ale coś innego nie zostało zatwierdzone, a chcesz, aby menu miało tę samą wybraną wartość? –

+0

Tak, właśnie o to mi chodzi. Re: sprawdzanie poprawności - CI wydaje się mieć dobrą dokumentację do podstawowego sprawdzania poprawności danych wejściowych, ale nie w przypadku list rozwijanych. Ponadto, byłby myślę, że będzie wysoki procent dropdowns, które są wypełniane z wartości bazy danych, a więc set_select() zaspokoi go, wydaje się nie? – Gaz

4

W Tobie wiersz:

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

Wystarczy zrobić to:

echo form_dropdown('events', $options, set_value('events'), $firstItem); 
+2

Ważne: aby funkcja set_value() działała, gdy używana jest biblioteka sprawdzania poprawności formularza, pole ("zdarzenia" w tym przykładzie) musi być częścią reguł sprawdzania poprawności. –

4

Osobiście, bardzo lubię budowy mój formularz w widoku zamiast mieszania prezentację do sterownika. Ale to tylko moja opinia. Rozumiem, że trzeba wstępnie załadować dane, jeśli jest to duża lista, ale nie sądzę, że naprawdę trzeba zbudować cały formularz tylko dla rozwijanej listy. Miałem ten sam problem i faktycznie zrobiłem mały dokument, który wykopał dobre rozwiązanie.

Aby zatwierdzić wybór wyboru
Wszystko zrobiłem do tego było opracowanie sposobu niestandardowego w klasie kontrolera, który wygląda mniej więcej tak

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; 
    } 
} 

w indeksie() (lub inny sposób jest przetwarzanie dane i ładowanie widoku) ustawiasz kod sprawdzania poprawności dla rozwijanego menu.

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

To imperatyw że prefiks swoją funkcję niestandardową z "callback_".

Utrzymanie wyboru użytkownika Zachowanie wyboru jest również bardzo proste, jeśli użyjesz tego, co CI Ci oferuje. Musisz tylko użyć funkcji set_select() dla każdej opcji z listy wyboru.

Załóżmy, że masz menu rozwijane z dwiema opcjami, aby ułatwić. To wszystko, co robisz.

<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> 

Co miłe na temat korzystania z tej funkcji jest to, że wcześniej wybiera pierwszą opcję „obojętne”, a następnie, gdy użytkownik dokonuje wyboru, ale nie inne walidacje, wybór zostanie zachowany i wstępnie wybrany po formularzu został opublikowany i monituje użytkownika o poprawienie innych błędów.

Ponownie, to może nie zaspokoić wszystkich, ale jest to całkiem proste rozwiązanie do sprawdzania spadku z CodeIgniter.

+0

Uzgodnione. Znacznie więcej fanów pracy z moim html w zwykłej witrynie. Czasami pomocnicy mogą ograniczać eksperymenty i kodować schludność. – ChristoKiwi

0

miał ten sam problem i udało się go rozwiązać:

  • javascript walidacja z użyciem Spry walidacji javascript
  • CodeIgniter funkcja zwrotna w postaci klasy walidacji

Jeśli konieczne może być określony kod mogę help out

1

Wpadłem również na ten problem, po przeczytaniu zalecanego postu tutaj, mam to działa, ale byłem zirytowany z powodu komunikat sprawdzania poprawności, który zwraca. Jednak wierzę, znalazłem lepszą opcję:

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); 

następnie walidacji można po prostu zrobić:

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

Następnie walidacja powraca normalny komunikat

+0

Hurray! Kluczem tutaj jest ustawienie klucza tablicy na pusty ciąg znaków, aby ta wartość była poprawna jako pusta. – lwitzel