2010-03-14 38 views
9

Tôi đang sử dụng thư viện biểu mẫu và trình trợ giúp biểu mẫu của CodeIgniter để tạo biểu mẫu của tôi. Tôi gặp sự cố khi thả xuống 'dính' và cũng tìm các quy tắc xác thực phù hợp.Xác thực thả xuống biểu mẫu trong CodeIgniter

Đây là cách tôi populating drodown:

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

này đang xây dựng các tùy chọn từ các sự kiện được lưu trữ trong cơ sở dữ liệu. Biểu mẫu có vẻ ổn và điền tất cả các trường một cách chính xác.

Tuy nhiên, khi tôi gửi biểu mẫu, trình đơn thả xuống không giữ giá trị được chọn? Ngoài ra, làm thế nào tôi nên xác nhận nó, tôi muốn làm cho nó cần thiết nhưng tôi cũng muốn chắc chắn rằng tôi không ngoại trừ tùy chọn đầu tiên trong danh sách thả xuống 'Hãy chọn một ...'

Cảm ơn trước.

Chúc mừng, Gaz

Trả lời

8

Bạn đang làm điều này trong một lần xem? Tôi sẽ chỉ cho bạn có tôi xử lý này, nhưng tất cả xảy ra trong một bộ điều khiển:

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

Các form_dropdown() chức năng phải mất một mảng được thiết lập như: $ key => $ value Trong trường hợp quan trọng trong việc trường hợp của tôi là id quốc gia và giá trị là tên quốc gia. Tôi có cặp '0' => 'KHÔNG' ở đầu mảng quốc gia của tôi, vì vậy người dùng không thể chọn một cặp. Nếu tôi muốn thực hiện điều này theo yêu cầu của bạn, tôi có thể đặt nó thành '-1' => 'Vui lòng chọn ...' và nó sẽ không xác thực, vì -1 không phải là số tự nhiên.

Hy vọng rambling của tôi sẽ giúp bạn!

Edit:

Được rồi, vì vậy trước khi bạn tạo menu thả xuống với form_dropdown(), những gì bạn sẽ muốn làm là kiểm tra một giá trị được lựa chọn từ đến từ các mảng POST.

Trong trường hợp của CI, bạn có thể sử dụng chức năng set_value ($ input), do đó dưới dạng ví dụ của tôi, tôi có thể làm điều gì đó như:

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

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

Vì vậy, bây giờ giá trị được lựa chọn thả xuống sẽ được thiết lập với những gì đã được chọn trên bài đăng cuối cùng. Bạn có thể muốn kiểm tra giá trị đó để đảm bảo giá trị hợp lệ. Nếu không có gì được chọn, thì bạn có thể đặt $ được chọn làm giá trị như hiện tại trong cơ sở dữ liệu hoặc giá trị mặc định bạn đã chọn.

+0

Đó là tuyệt vời - đó làm việc tốt. Bạn sẽ nghĩ rằng sẽ có một cách tốt hơn để làm điều đó mặc dù? Ngoài ra, bất kỳ ý tưởng làm thế nào bạn thực hiện thả xuống 'dính'? – Gaz

+0

Bạn có ý định như thế, nếu biểu mẫu đã được gửi nhưng cái gì khác không xác thực và bạn muốn trình đơn thả xuống có cùng giá trị được chọn không? –

+0

Yeh, đó là ý tôi. Re: validation - CI dường như có tài liệu tốt để xác thực đầu vào cơ bản nhưng không quá nhiều cho dropdowns. Ngoài ra, tôi đã có thể nghĩ rằng sẽ có một tỷ lệ cao của dropdowns được dân cư từ các giá trị cơ sở dữ liệu và do đó set_select() sẽ phục vụ cho nó, có vẻ không? – Gaz

4

Trong bạn xếp hàng:

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

Chỉ cần làm cho nó:

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

Quan trọng: đối với set_value() hoạt động khi thư viện xác nhận hợp lệ biểu mẫu được sử dụng, trường ('sự kiện' trong ví dụ này) phải là một phần của quy tắc xác thực. –

4

Cá nhân, tôi thực sự giống như xây dựng hình thức của tôi trong giao diện chứ không phải là pha trộn các bài thuyết trình vào bộ điều khiển. Nhưng đó chỉ là ý kiến ​​của tôi. Tôi hiểu phải tải trước dữ liệu nếu đó là một danh sách lớn nhưng tôi không nghĩ rằng bạn thực sự cần phải xây dựng toàn bộ biểu mẫu chỉ cho một danh sách thả xuống. Tôi đã có cùng một vấn đề và thực sự đã làm một chút doc đào để tìm ra một giải pháp tốt.

để xác nhận lựa chọn Selection
Tất cả tôi đã làm cho điều đó là cung cấp một phương pháp tùy chỉnh trong lớp điều khiển trông giống như thế này

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

Trong chỉ số của bạn() (hoặc bất cứ phương pháp là chế biến dữ liệu và tải chế độ xem), bạn đặt mã xác thực của mình cho menu thả xuống.

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

Đó là bắt buộc rằng bạn có tiền tố chức năng tùy chỉnh của bạn với "callback_".

Duy trì lựa chọn người dùng Việc giữ lại lựa chọn lựa chọn cũng rất đơn giản nếu bạn sử dụng những gì CI cung cấp cho bạn. Bạn chỉ cần sử dụng hàm set_select() cho mỗi tùy chọn trong danh sách lựa chọn.

Vì vậy, giả sử bạn có danh sách thả xuống có hai tùy chọn để giúp dễ dàng. Đây là tất cả những gì bạn làm.

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

Những gì tốt đẹp về việc sử dụng chức năng này là nó trước lựa chọn "giả" tùy chọn đầu tiên và sau đó nếu người dùng thực hiện một lựa chọn nhưng không kiểm chứng thực khác, việc lựa chọn sẽ được giữ lại và được lựa chọn trước sau dưới dạng được đăng và nhắc người dùng sửa các lỗi khác.

Một lần nữa, điều này có thể không làm hài lòng tất cả mọi người, nhưng đó là một giải pháp khá đơn giản để giảm xác thực với CodeIgniter.

+0

Đồng ý. Nhiều hơn nữa của một fan hâm mộ làm việc với html của tôi trong trang web đơn giản. Đôi khi người trợ giúp có thể giới hạn thử nghiệm và mã gọn gàng. – ChristoKiwi

0

Đã cùng một vấn đề và cố gắng giải quyết nó:

  • javascript xác nhận sử dụng xác nhận Spry javascript
  • hàm callback
  • CodeIgniter trong hình thức xác nhận lớp

Nếu bạn có thể cần mã cụ thể tôi có thể giúp đỡ

1

Tôi cũng gặp vấn đề này, sau khi đọc bài đăng được đề xuất ở đây, tôi đã làm việc nhưng tôi cảm thấy bực mình vì thông báo xác thực nó trả về. Tuy nhiên tôi tin rằng tôi đã tìm thấy một lựa chọn tốt hơn:

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

Sau đó, với sự xác nhận bạn chỉ có thể làm:

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

Sau đó xác nhận trả về bình thường 'cần thiết' nhắn

+0

Hoan hô! Bí quyết ở đây là đặt khóa mảng thành một chuỗi rỗng, để giá trị đó xác nhận là rỗng. – lwitzel

Các vấn đề liên quan