2010-03-14 24 views
9

Ich verwende CodeIgniter Formular Helper und Formular Validierung Bibliothek zum Erstellen meiner Formulare. Ich habe Probleme, das Drop-down-Menü "sticky" zu machen und passende Validierungsregeln zu finden. DieseValidieren Formular Dropdown in CodeIgniter

ist, wie ich bevölkern die drodown:

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

Dies wird die Möglichkeiten von Ereignissen in der Datenbank gespeichert Gebäude. Das Formular sieht gut aus und füllt alle Felder korrekt auf.

Wie auch immer, wenn ich das Formular abschicke, hält das Drop-down den ausgewählten Wert nicht fest? Auch, wie sollte ich es validieren, ich möchte es erforderlich machen, aber ich möchte auch sicherstellen, dass ich nicht die erste Option in der Dropdown 'Bitte wählen Sie eine ...'

Vielen Dank im Voraus.

Cheers, Gaz

Antwort

8

Tun Sie dies in einer Ansicht? Ich werde Ihnen zeigen, habe ich damit umgehen, aber es geschieht alles in einem Controller:

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

Die form_dropdown() Funktion ein Array nimmt die Setup wie ist: Schlüssel $ => $ value Wo der Schlüssel in Mein Fall ist eine Länder-ID, und der Wert ist der Name des Landes. Ich habe am Anfang meines Länder-Arrays das Paar '0' => 'NONE', so dass der Benutzer keinen auswählen kann. Wenn ich dies wie Ihre Situation machen wollte, könnte ich es auf '-1' setzen => 'Bitte auswählen ...' und es würde nicht validieren, da -1 keine natürliche Zahl ist.

Ich hoffe, meine Wanderung hilft!

Edit:

Okay, also, bevor Sie die Drop-down mit form_dropdown() zu erstellen, was Sie wollen, ist für einen ausgewählten Wert zu tun, überprüft von dem POST-Array kommen.

Im Falle von CI, können Sie die Funktion set_value ($ input) verwenden, so in meinem Beispiel Form ich so etwas wie tun könnte:

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

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

So, jetzt wird der ausgewählte Wert der Dropdown eingestellt werden zu dem, was im letzten Beitrag ausgewählt wurde. Sie können diesen Wert überprüfen, um sicherzustellen, dass er gültig ist. Wenn nichts ausgewählt wurde, können Sie $ ausgewählt als einen Wert in der Datenbank oder einen Standardwert auswählen, den Sie ausgewählt haben.

+0

Das ist großartig - das hat gut funktioniert. Sie würden denken, dass es einen besseren Weg gibt, es zu tun? Außerdem, irgendwelche Ideen, wie Sie das Dropdown 'klebrig' machen? – Gaz

+0

Meinst du, wenn das Formular gesendet wurde, aber etwas anderes nicht validiert wurde und du möchtest, dass das Drop-down denselben Wert hat? –

+0

Yeh, das ist was ich meine. Re: Validierung - CI scheint eine gute Dokumentation für die grundlegende Eingabevalidierung zu haben, aber nicht so sehr für Dropdowns. Außerdem hätte ich gedacht, dass es einen hohen Prozentsatz von Dropdowns geben würde, die von Datenbankwerten bevölkert werden, und so würde set_select() das berücksichtigen, scheint nicht? – Gaz

4

In Sie Zeile:

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

Wichtig: Damit set_value() funktioniert, wenn die Formularüberprüfungsbibliothek verwendet wird, muss das Feld ("Ereignisse" in diesem Beispiel) Teil der Validierungsregeln sein. –

4

Persönlich Ich mag den Aufbau meiner Form in der Ansicht, anstatt Mischen der Präsentation in die Steuerung:

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

es einfach machen. Aber das ist nur meine Meinung. Ich verstehe, dass ich Daten vorab laden muss, wenn es eine große Liste ist, aber ich glaube nicht, dass Sie wirklich das gesamte Formular nur für eine Dropdown-Liste erstellen müssen. Ich hatte das gleiche Problem und habe tatsächlich ein bisschen gegraben, um eine gute Lösung zu finden.

Um die Auswahlmöglichkeiten zu Validieren
Alles, was ich tat, eine benutzerdefinierte Methode in der Controller-Klasse liefern war, die Verarbeitung so etwas wie diese

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

In Ihrem Index() (oder je nachdem, welche Methode ist aussieht die Daten und das Laden der Ansicht), legen Sie Ihren Validierungscode für das Dropdown fest.

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

Es ist zwingend notwendig, , dass Sie Ihre benutzerdefinierte Funktion mit "callback_" voranstellen.

Benutzerauswahl beibehalten Die Auswahlmöglichkeiten zu behalten, ist auch sehr einfach, wenn Sie verwenden, was CI Ihnen gibt. Sie müssen nur die Funktion set_select() für jede Option in der Auswahlliste verwenden.

Nehmen wir an, Sie haben eine Dropdown-Liste mit zwei Optionen, um es einfach zu machen. Das ist alles was du tust.

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

Was ist mit dieser Funktion schön ist, dass es eine Vorauswahl der erste „Dummy“ Option und dann, wenn der Benutzer eine Auswahl trifft aber nicht andere Validierungen, wird die Auswahl beibehalten wird und nach der Form vorselektiert wird veröffentlicht und fordert den Benutzer auf, die anderen Fehler zu korrigieren.

Auch dies kann nicht alle zufrieden stellen, aber es ist eine ziemlich einfache Lösung für die Drop-Down-Validierung mit CodeIgniter.

+0

Einverstanden. Viel mehr von einem Fan der Arbeit mit meinem HTML auf der normalen Seite. Manchmal können Helfer das Experimentieren einschränken und die Ordentlichkeit kodieren. – ChristoKiwi

0

haben das gleiche Problem und schaffte es zu lösen:

  • javascript Validierung rüstig Validierung mit Hilfe von JavaScript
  • codeigniter Callback-Funktion in der Klasse Validierung Form

Wenn Sie spezifischen Code ich kann brauchen Hilfe

1

Ich lief auch in dieses Problem, nach dem Lesen der empfohlenen Post hier, ich habe es funktioniert, aber ich war verärgert wegen die Bestätigungsnachricht, die zurückgegeben wird. Aber ich glaube, ich habe eine bessere Option gefunden:

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

Dann mit der Validierung können Sie einfach tun:

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

Dann wird die Validierung der normalen ‚erforderlich‘ kehrt Nachricht

+0

Hurra! Der Trick besteht darin, den Array-Schlüssel auf eine leere Zeichenfolge festzulegen, sodass der Wert als leer validiert wird. – lwitzel