2011-02-07 45 views
8

Trong html bình thường, chúng ta có thể có một trường mảng như person[]mảng đầu vào như name = "người []" ở dạng zend

<input name="person[]" type="text" /> 
<input name="person[]" type="text" /> 
<input name="person[]" type="text" /> 

Theo như tôi biết, Zend_Form không có điều đó. Tôi đọc another answer đề xuất rằng nó có thể được thực hiện bằng cách sử dụng một trang trí có thể thêm [] vào đúng vị trí. Đây là mã cho câu hỏi cụ thể đó

$html = ''; // some code html 
$i = 0; 
foreach ($element->getMultiOptions() as $value => $label){ 
    $html .= '<input type="checkbox" ' 
      .   'name="'.$element->getName().'[]" ' 
      .   'id="'$element->getName()'-'.$i.'" ' 
      .   'value="'.$value.'" />'; 
    $i++; 
} 
return $html; 

Điều này có vẻ như là một khởi đầu tốt, nhưng tôi tự hỏi nếu sử dụng trang trí là đủ. Các giá trị được trả lại phải được đọc chính xác và được gửi đến máy chủ, sau đó được xác thực ở phía máy chủ. Vì vậy, là một trang trí ý tưởng sai? Một yếu tố tùy chỉnh có ý nghĩa hơn ở đây không? Tôi đã không nhìn thấy một ví dụ tốt cho thấy làm thế nào điều này có thể được thực hiện.

+0

Kiểm tra hướng dẫn sử dụng: http://framework.zend.com/manual/en/zend.form.advanced.html –

Trả lời

13

Tôi nghĩ rằng ZF không cho phép tạo các trường văn bản đầu vào riêng lẻ có tên person[], mặc dù bạn có thể làm điều đó cho toàn bộ biểu mẫu hoặc biểu mẫu con. Tuy nhiên, nó cho phép một cái gì đó tương tự. Cụ thể, bạn có thể tạo ra các lĩnh vực tên person[0], person[1] vv

Để làm điều này, bạn có thể làm như sau:

$in1 = $this->createElement('text', '0'); 
$in2 = $this->createElement('text', '1'); 
$in1->setBelongsTo('person'); 
$in2->setBelongsTo('person'); 

Bằng cách này bạn thường có thể đính kèm xác nhận của bạn, bộ lọc, vv để $ in1 hoặc $ in2 và chúng sẽ hoạt động như mong đợi. Trong hành động của bạn, sau khi xác nhận biểu mẫu, bạn có thể nhận được một loạt các lĩnh vực văn bản đầu vào của người đó như:

$values = $yourForm->getValues(); 
var_dump($values['person']); 

Điều thú vị là sau đây sẽ KHÔNG công việc:

$in1 = $this->createElement('text', 'person[0]'); 
$in2 = $this->createElement('text', 'person[1]'); 

Hy vọng điều này sẽ giúp bạn .

+3

Tôi đã nhìn thấy một cái gì đó tương tự như ý tưởng của bạn trong khi tôi đang tìm kiếm, nhưng điều này không hoạt động khi số lượng 'người []' là động. Thực hiện kịch bản này: bạn yêu cầu người dùng gửi email cho bạn bè của mình nhưng bạn chỉ cho anh ấy 1 '' và nút 'thêm một số khác' nếu anh ấy muốn thêm nhiều hơn. Nút 'thêm một lần nữa' chỉ là một javascript bổ sung thêm' 'vào biểu mẫu. Số lần người dùng nhấp vào 'thêm một số khác' không xác định. Không có zend_form, tôi chỉ sử dụng 'person []' cho điều này rồi gửi nó đến backend để xác nhận. Đối với trường này, tôi lặp qua tất cả các mảng và kiểm tra từng mảng. – jblue

+0

@jblue. vâng, tôi thấy đây không phải là eo biển về phía trước. Nhưng tôi nghĩ có những khả năng khác có thể được xem xét. Một sẽ được sử dụng subforms và đánh dấu các subform ZF như là một mảng (xem trước sử dụng ZF). Khả năng khác sẽ là tạo ra nhiều đầu vào hơn trong ZF, và ẩn tất cả ngoại trừ đầu vào. JS hơn sẽ chỉ bỏ phần còn lại nếu cần. Tuy nhiên, khác, sẽ là tạo ra các lĩnh vực đầu vào cho một ZF năng động trong php. Nếu JS tạo ra 10 trường đầu vào, sau đó, sau khi gửi, bạn thêm các trường này vào Biểu mẫu Zend của bạn, với các bộ lọc (v..v ..) bạn muốn, điền vào nó và xác thực như thường lệ. – Marcin

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