Điều này có thể được thực hiện thông qua triển khai gọi lại API Biểu mẫu:
Phía trong mô-đun/src/Element/ElementClass.php
, Trong hàm công khai getInfo() {}
xác định một cuộc gọi lại, ví dụ: processMyElement
Dưới '#tiến trình'
Chìa khóa:
hàm công khai getInfo() {
$class = tĩnh::class;
trở lại [
// […] Một số định nghĩa khác.
'#quy trình' => [
[$class, 'processMyElement'],
],
];
}
Và sau đó thực hiện hai hoạt động bổ sung.
(1) Xử lý đầu vào của người dùng và trả về một giá trị sẽ được cung cấp trong '#form_state'
giá trị trong valueCallback()
phương pháp:
hàm tĩnh công khai valueCallback(&$element, $input, FormStateInterface $form_state) {
$output = parent::valueCallback($element, $input, $form_state);
if ($input == 'SOMETHING') {
$output = 'SOMETHING_ELSE';
}
trả lại đầu ra $;
}
(2) Và ngược lại, trong processMyElement()
phương thức trả về giá trị ban đầu:
hàm tĩnh công khai processMyElement(&$element, FormStateInterface $form_state, &$complete_form) {
if ($element['#value'] == 'SOMETHING_ELSE') {
$element['#value'] = 'SOMETHING';
}
trả lại phần tử $;
}
ví dụ sử dụng
Tôi đã sử dụng điều này để mở rộng Drupal\Core\Render\Element\Textfield
class kết hợp với JS Storage Complete. Điều đó mang lại cho tôi Tự động điền (không cần URL gọi lại). Tính năng tự động hoàn thành này trả về ID thực thể thu được thông qua tải thực thể dựa trên nhãn duy nhất bên trong valueCallback()
phương pháp, nhưng người dùng vẫn được trình bày với đầu vào văn bản của nó (thu được bằng cách quay lại $entity->nhãn()
phía trong processMyElement()
phương pháp).