Я создал модуль, который определяет форму, но когда я пытаюсь добавить столбец ссылок, он пуст, когда я устанавливаю '#тип'
к 'соединять'
. Я тестирую это на Drupal 9.3.x.
На поверхности это то же самое, что и Добавить ссылку на строку tableselect, но опубликованный там ответ не содержит полного рабочего кода, и я уверен, что решение в моем контексте будет отличаться от опубликованного там.
Это полный код класса, который расширяет FormBase
.
используйте Drupal\Core\Form\FormBase;
используйте Drupal\Core\Form\FormStateInterface;
класс MyForm расширяет FormBase {
общедоступная функция buildForm (массив $ form, \ Drupal \ Core \ Form \ FormStateInterface $ form_state) {
// Создаем fileNameOptions
$privatePath = 'private://webform/upload/';
$linkPath = '/system/files/webform/upload/';
$templatePath = \Drupal::service('file_system')->realpath($privatePath);
$fileList = glob($templatePath.'/*');
$fileNameOptions = [];
$pathLength = strlen($templatePath);
foreach ($fileList как $filePath) {
$fileName = substr($filePath, $pathLength + 1);
$fileNameOptions[$fileName] = [
'имя_файла' => $имя_файла,
'ссылка' => [
'данные' => [
'#тип' => 'ссылка',
'#url' => $linkPath . $ имя_файла,
'#title' => $fileName,
],
],
];
}
//Построить таблицуSelect.
$ форма ['шаблоны'] = [
'#тип' => 'выбор таблицы',
'#header' => ['filename' => 'Имя файла', 'link' => 'Ссылка'],
'#options' => $fileNameOptions,
'#empty' => t('Файлы не найдены.'),
'#вес' => 40,
'#js_select' => ЛОЖЬ,
];
вернуть $ форму;
}
/**
* {@inheritdoc}
*/
публичная функция getFormId() {
вернуть 'my_form';
}
/**
* {@inheritdoc}
*/
публичная функция submitForm (массив и $ форма, FormStateInterface $ form_state) {
родитель::submitForm($form, $form_state);
}
}
В некотором контексте эта форма пытается показать администратору список личных файлов, загруженных из веб-форм, а также ссылки, позволяющие им просматривать каждый файл. Цель состоит в том, чтобы использовать выбор таблицы
разрешить администратору удалять ненужные файлы. Я понимаю, что это связано с безопасностью и что эта форма должна быть доступна только доверенным администраторам. Отображение списка файлов работает, и я уверен, что смогу заставить работать удаление файлов. У меня есть веб-форма, которая правильно отображает ссылки, но было бы лучше, если бы форма удаления также позволяла администратору просматривать файлы по ссылкам.
Если я изменю '#тип'
поля ссылки из 'соединять'
к 'текстовое поле'
или же 'текстовое поле'
, столбец содержит ожидаемые элементы — заголовок, за которым следует текстовое поле или текстовое поле. Когда я меняю '#тип'
вернуться к 'соединять'
(как показано в коде выше), столбец полностью пуст. Когда я просматриваю исходный код страницы, этот столбец содержит пустые <td>
теги.
<td></td>
Это точно так же, как если бы я изменил '#тип'
к 'фу'
. Это подразумевает для меня, что 'соединять'
Тип поля недоступен в контексте этой формы. Чтобы проверить это, я попытался адаптировать Как получить все доступные типы полей формы? в контексте Drupal 9.
$all_types = \Drupal::moduleHandler()->invokeAll('hook_elements');
\Drupal::messenger()->addMessage(json_encode($all_types));
Однако, крюк_элементы()
кажется, больше не используется, так что это не работает.
Элементы формы и рендеринга показывает 'соединять'
как действительный элемент рендеринга в Drupal 9.4.x, поэтому я понимаю, что он должен быть доступен в формах, созданных пользовательским модулем.
КомментарийAdminOverview::buildForm()
показывает очень похожее использование '#тип' => 'ссылка'
.
Мое прочтение существующего ответа заключается в том, что проблема заключалась в том, что столбец не был добавлен в '#заголовок'
массив (не виден в опубликованном коде).
- Я пропустил какую-то простую деталь в коде, который я разместил выше, что вызывает
'соединять'
поля должны быть пустыми, при изменении '#тип'
к 'текстовое поле'
дает ожидаемый результат?
- Есть ли способ проверить набор действительных
'#тип'
строки в моем контексте?
- Если
'соединять'
тип поля недоступен в моем контексте, как я могу сделать его доступным?
Когда я загружаю эту форму, в журнал Drupal ничего не добавляется.