Tại sao hook_form_alter () quá lộn xộn?


40

Đây là một ví dụ tôi vừa chạy vào. Tôi đang cố gắng đưa một số HTML vào nhãn của lĩnh vực của mình.

$form['field_feedback']['und']['#title'] <- has the title
$form['field_feedback']['und'][0]['#title'] <- has the title
$form['field_feedback']['und'][0]['value']['#title'] <- has the title. (Works)

Tại sao có ba thuộc tính #title được điền với chỉ một thuộc tính được sử dụng?


1
mảng $ form này được tạo ở đâu? như tôi biết, chúng ta không có dạng $ với cấu trúc này trong hook_form_alter
Mohammad Ali Akbari

Cảm ơn vì điều này. Tôi đang kéo tóc ra. Cấu trúc mảng là vô lý.
JM01

Câu trả lời:


72

Những gì bạn đang thấy là cách Drupal thể hiện các trường trong một biểu mẫu. Nó bị hỏng như thế này:

  • Các phần tử con của mảng ngoài, $form['field_back']['und']( 'und'for 'undefined'), là các ngôn ngữ khác nhau mà trường đã được dịch sang. Trong Drupal, bạn được khuyến khích để sử dụng LANGUAGE_NONEcho 'und'trong mã.
  • Các con bên trong mỗi mảng ngôn ngữ, ví dụ $form['field_feedback']['und'][0], đại diện cho các mục khác nhau cho trường. Ví dụ, nếu một lĩnh vực có cardinality không giới hạn, và có một số mục cho lĩnh vực đó, họ sẽ hiển thị như $form['field_feedback']['und'][0], $form['field_feedback']['und'][1]vv
  • Cuối cùng, bạn có (các) phần tử đầu vào biểu mẫu, cho chính các giá trị trường, vd $form['field_feedback']['und'][0]['value']. Trong trường hợp này, tên cột là value, đối với kiểu trường tham chiếu nút, nó sẽ nidnhư vậy, v.v. Nếu một trường có nhiều cột dữ liệu được liên kết với nó, bạn cũng sẽ thấy nhiều trẻ em hơn. Chúng được đại diện bởi một trường văn bản / hộp chọn / tiện ích đặc biệt và cuối cùng sẽ cung cấp giá trị cho trường.

Thực tế là các tiêu đề đã được thêm vào các yếu tố khác nhau trong toàn bộ hệ thống phân cấp là ngẫu nhiên để thành thật. Việc các tiêu đề đó có được hiển thị trên biểu mẫu hay không tùy thuộc vào các cài đặt cụ thể của mảng kết xuất trong đó mỗi tiêu đề #titleđược chứa.

Để thay đổi tiêu đề trên tiện ích biểu mẫu thực tế, bạn chỉ cần lo lắng về phần tử biểu mẫu ở dưới cùng của mảng: tức là các phần tử đầu vào thực tế ( $form['field_feedback']['und'][0]['value'], v.v.).

Có lẽ đáng lưu ý rằng phần tử / widget được sử dụng cho một trường cụ thể có thể khá phức tạp. Nếu bạn chưa có nó, bạn nên cài đặt mô-đun Devel và sử dụng dpm()chức năng để kiểm tra $formmảng; nó sẽ cho bạn thấy chính xác vị trí trong các phần tử mà bạn đang nhắm mục tiêu.


3
Nói tóm lại, việc thêm #title vào thứ gì đó mà Drupal không xem xét mảng API biểu mẫu không có tác dụng gì; ngay cả trong trường hợp đó, người ta không nói #title được xem xét, vì nó không phải là một thuộc tính cho tất cả các yếu tố hình thức mà Drupal thực hiện. API trường làm phức tạp các vấn đề, vì nó thêm một mảng bình thường vào mảng biểu mẫu, nhưng điều đó không gây nhầm lẫn cho Drupal tìm kiếm #type , để nhận ra một phần tử biểu mẫu.
kiamlaluno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.