2010-10-13 17 views
5

Trong fapi drupal có một thuộc tính "#process" .tại sao lại sử dụng nó để sao chép trường thay vì thêm nó với theming?
Tôi muốn sử dụng nó để xác định loại trường mới với hook_elements.Việc sử dụng "#process" gọi lại trong api dạng drupal là gì?

Edit:
đây là hook_elements tôi:

function test_elemets() { 
    return array(
     'test_field' => array( 
      '#input' => TRUE, 
      '#process' => array('test_field_process'), 
     ) 
    ); 
} 

và quá trình callback:

function test_field_process($element, $edit, &$form_state, $complete_form) { 
    $element = array();  
    return $element;  
} 

như bạn thấy trong chức năng quá trình tôi sử dụng $ element = array() để xem những gì sẽ xảy ra. Nhưng hình thức được hiển thị như trước đây.

Trả lời

9

Đọc the Forms API documentation on the '#process' form element property.

Đây là một mảng các hàm gọi lại, mỗi hàm sẽ được gọi với mảng định nghĩa phần tử được truyền tới nó. Hàm gọi lại sau đó có thể hoạt động trên mảng định nghĩa phần tử để biến nó thành một định nghĩa khác (thường phức tạp hơn), ví dụ như sao chép trường mật khẩu trong khi đính kèm tệp JavaScript kiểm tra bình đẳng hoặc chuyển một định nghĩa 'radio' được kết hợp thành số lượng theo định nghĩa cụ thể của 'radio', v.v.

Bạn sẽ muốn sử dụng nó nếu bạn muốn cung cấp phần tử biểu mẫu phức tạp (ví dụ: kết hợp nhiều phần tử 'chuẩn' kết hợp hoặc một phần bổ sung tự động của trình trợ giúp JavaScript chuẩn), nhưng vẫn giữ cách tiếp cận đơn giản, khai báo của API biểu mẫu. (Look Ma - chỉ có một '#type' = 'myCrazyFormElement' mảng, mà mở rộng 'automagically' một cái gì đó cách phức tạp hơn;)

Việc làm này qua lớp theming thể có thể, tùy từng trường hợp sử dụng, nhưng sẽ đòi hỏi nhiều mã , mỗi lần bạn cần.

4

api.drupal.org documentation on #process nói:

Một loạt các chức năng được gọi là khi một phần tử được xử lý. Sử dụng gọi lại này, các mô-đun có thể "đăng ký" các hành động khác. Ví dụ: loại hình dạng "radio" được mở rộng thành nhiều nút radio sử dụng chức năng xử lý .

Quá trình xử lý khác với việc lưu giữ trong API biểu mẫu. Bạn không thể thay đổi một mảng biểu mẫu trong lớp chủ đề (ít nhất là không có trong D6). Mật khẩu cụ thể, thêm form_expand_ahah vào #process. Bạn có thể có thể kludge hầu hết trong số đó vào lớp chủ đề, nhưng không phải dòng này:

$element['#cache'] = TRUE; 

Vì bộ nhớ đệm xảy ra trước lớp chủ đề, không thể thực hiện trong lớp chủ đề. Nói chung, trong khi một số điều xảy ra trong #process có thể xảy ra trong lớp chủ đề, nó không thể xảy ra ở đó vì biểu mẫu nhiều hơn màn hình đầu cuối; chúng cũng là xử lý mặt sau.

+0

Cảm ơn bạn.Nhưng tại sao mô-đun cung cấp phần tử không thêm các lệnh này vào hàm hook_elements, ví dụ tại sao viết $ element ['# cache'] = TRUE trong hàm quá trình thay vì hook example_elements? –

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