Рейтинг:0

Создание ссылок в строках TableSelect

флаг cn

Я создал модуль, который определяет форму, но когда я пытаюсь добавить столбец ссылок, он пуст, когда я устанавливаю '#тип' к 'соединять'. Я тестирую это на 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() показывает очень похожее использование '#тип' => 'ссылка'.

Мое прочтение существующего ответа заключается в том, что проблема заключалась в том, что столбец не был добавлен в '#заголовок' массив (не виден в опубликованном коде).

  1. Я пропустил какую-то простую деталь в коде, который я разместил выше, что вызывает 'соединять' поля должны быть пустыми, при изменении '#тип' к 'текстовое поле' дает ожидаемый результат?
  2. Есть ли способ проверить набор действительных '#тип' строки в моем контексте?
  3. Если 'соединять' тип поля недоступен в моем контексте, как я могу сделать его доступным?

Когда я загружаю эту форму, в журнал Drupal ничего не добавляется.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.