Tôi đã tạo một mô-đun xác định một Biểu mẫu, nhưng khi tôi cố gắng thêm một cột liên kết, nó sẽ trống khi tôi đặt '#loại'
đến 'liên kết'
. Tôi đang thử nghiệm điều này trên Drupal 9.3.x.
Nhìn bề ngoài, điều này cũng giống như Thêm một liên kết đến một hàng chọn bảng, nhưng câu trả lời được đăng ở đó không chứa mã hoạt động đầy đủ và tôi khá chắc chắn rằng giải pháp trong ngữ cảnh của tôi sẽ khác với giải pháp được đăng ở đó.
Đây là mã đầy đủ của lớp mở rộng FormBase
.
sử dụng Drupal\Core\Form\FormBase;
sử dụng Drupal\Core\Form\FormStateInterface;
lớp MyForm mở rộng FormBase {
chức năng công khai buildForm(mảng $form, \Drupal\Core\Form\FormStateInterface $form_state) {
// Xây dựng fileNameOptions
$privatePath = 'riêng tư://webform/upload/';
$linkPath = '/system/files/webform/upload/';
$templatePath = \Drupal::service('file_system')->realpath($privatePath);
$fileList = toàn cầu($templatePath.'/*');
$fileNameOptions = [];
$pathLength = strlen($templatePath);
foreach ($fileList là $filePath) {
$fileName = substr($filePath, $pathLength + 1);
$fileNameOptions[$fileName] = [
'tên tệp' => $tên tệp,
'liên kết' => [
'dữ liệu' => [
'#type' => 'liên kết',
'#url' => $linkPath . $fileName,
'#title' => $fileName,
],
],
];
}
//Tạo bảngSelect.
$form['mẫu'] = [
'#type' => 'bảng chọn',
'#header' => ['filename' => 'File name', 'link' => 'Link'],
'#options' => $fileNameOptions,
'#empty' => t('Không tìm thấy tập tin nào.'),
'#cân nặng' => 40,
'#js_select' => SAI,
];
trả về biểu mẫu $;
}
/**
* {@inheritdoc}
*/
hàm công khai getFormId() {
trả về 'my_form';
}
/**
* {@inheritdoc}
*/
hàm công khai submitForm(mảng &$form, FormStateInterface $form_state) {
cha mẹ::submitForm($form, $form_state);
}
}
Đối với một số ngữ cảnh, biểu mẫu này đang cố gắng hiển thị cho quản trị viên danh sách các tệp riêng tư được tải lên từ biểu mẫu web, cùng với các liên kết cho phép họ kiểm tra từng tệp. Mục đích là để sử dụng các bảng chọn
để cho phép quản trị viên xóa các tệp không mong muốn. Tôi hiểu rằng có những hệ lụy về bảo mật và chỉ những quản trị viên đáng tin cậy mới có thể truy cập biểu mẫu này. Hiển thị danh sách các tệp hoạt động và tôi khá chắc chắn rằng tôi có thể xóa tệp hoạt động. Tôi có một biểu mẫu web hiển thị chính xác các liên kết nhưng sẽ mang lại trải nghiệm người dùng tốt hơn nếu biểu mẫu xóa cũng cho phép quản trị viên xem các tệp thông qua các liên kết.
Nếu tôi thay đổi '#loại'
của trường liên kết từ 'liên kết'
đến 'trương Văn bản'
hoặc 'vùng văn bản'
, cột chứa các phần tử mà tôi mong đợi - tiêu đề theo sau là trường văn bản hoặc vùng văn bản. Khi tôi thay đổi '#loại'
Quay lại 'liên kết'
(như trong đoạn mã trên), cột hoàn toàn trống. Khi tôi xem nguồn trang, cột đó chứa trống <td>
thẻ.
<td></td>
Nó hoàn toàn giống như khi tôi thay đổi '#loại'
đến 'foo'
. Điều này ngụ ý với tôi rằng 'liên kết'
loại trường không có sẵn trong ngữ cảnh của biểu mẫu này. Để kiểm tra điều này, tôi đã thử điều chỉnh Làm cách nào để tôi nhận được tất cả các loại trường biểu mẫu có sẵn? vào bối cảnh Drupal 9.
$all_types = \Drupal::moduleHandler()->invokeAll('hook_elements');
\Drupal::messenger()->addMessage(json_encode($all_types));
Tuy nhiên, hook_elements()
dường như không được sử dụng nữa, vì vậy điều này không hoạt động.
Các yếu tố biểu mẫu và kết xuất trình diễn 'liên kết'
là một phần tử kết xuất hợp lệ trong Drupal 9.4.x, vì vậy tôi hiểu rằng phần tử này phải có sẵn ở các biểu mẫu được tạo bởi một mô-đun tùy chỉnh.
Bình luậnQuản trị viênTổng quan::buildForm()
cho thấy một cách sử dụng rất giống nhau '#type' => 'liên kết'
.
Tôi đọc câu trả lời hiện có là vấn đề ở đó là cột không được thêm vào '#tiêu đề'
mảng (không hiển thị trong mã được đăng).
- Tôi đã bỏ lỡ một số chi tiết đơn giản trong mã tôi đã đăng ở trên, điều này gây ra
'liên kết'
các trường để trống, trong khi thay đổi '#loại'
đến 'trương Văn bản'
tạo ra kết quả mong đợi?
- Có cách nào để xác minh tập hợp hợp lệ
'#loại'
chuỗi trong ngữ cảnh của tôi?
- Nếu
'liên kết'
loại trường không có sẵn trong ngữ cảnh của tôi, làm cách nào tôi có thể làm cho nó khả dụng?
Không có gì được thêm vào nhật ký Drupal khi tôi tải biểu mẫu này.