Puncte:0

Crearea de legături în rândurile TableSelect

drapel cn

Am creat un modul care definește un formular, dar când încerc să adaug o coloană de link-uri, acesta este gol când setez '#tip' la 'legătură'. Testez asta pe Drupal 9.3.x.

La suprafață, acesta este același ca Adăugați un link către un rând de selecție tabelă, dar răspunsul postat acolo nu conține codul de lucru complet și sunt destul de sigur că soluția în contextul meu va diferi de cea postată acolo.

Acesta este codul complet al clasei care se extinde FormBase.

utilizați Drupal\Core\Form\FormBase;
utilizați Drupal\Core\Form\FormStateInterface;

clasa MyForm extinde FormBase {

  funcția publică buildForm(array $form, \Drupal\Core\Form\FormStateInterface $form_state) {
    // Construiți fișierulNameOptions
    $privatePath = 'privat://webform/upload/';
    $linkPath = '/system/files/webform/upload/';
    $templatePath = \Drupal::service('file_system')->realpath($privatePath);
    $fileList = glob($templatePath.'/*');
    $fileNameOptions = [];
    $caleLength = strlen($templatePath);
    foreach ($fileList ca $filePath) {
      $fileName = substr($filePath, $pathLength + 1);
      $fileNameOptions[$fileName] = [
        'filename' => $fileName,
        'link' => [ 
          'date' => [
            '#type' => 'link',
            '#url' => $linkPath . $fileName,
            '#title' => $fileName,
          ],
        ],
      ];
    }

    //Construiți tableSelect.
    $form['șabloane'] = [
      '#type' => 'tableselect',
      '#header' => ['filename' => 'Numele fișierului', 'link' => 'Link'],
      '#options' => $fileNameOptions,
      '#empty' => t('Nu au fost găsite fișiere.'),
      '#weight' => 40,
      '#js_select' => FALSE,
    ];

    returnează $form;

  }

  /**
   * {@inheritdoc}
   */
  funcția publică getFormId() {
    returnează „formul_meu”;
  }

  /**
   * {@inheritdoc}
   */
  funcția publică submitForm(matrice &$form, FormStateInterface $form_state) {
    parent::submitForm($form, $form_state);
  }

}

Într-un anumit context, acest formular încearcă să arate administratorului o listă de fișiere private încărcate din formularele web, plus linkuri care le permit să inspecteze fiecare fișier. Intenția este de a folosi tableselect pentru a permite administratorului să șteargă fișierele nedorite. Înțeleg că există implicații de securitate și că acest formular ar trebui să fie accesibil numai administratorilor de încredere. Afișarea listei de fișiere funcționează și sunt destul de sigur că pot face ca ștergerea fișierului să funcționeze. Am un formular web care afișează corect linkurile, dar ar fi o experiență mai bună pentru utilizator dacă formularul de ștergere permite și administratorului să vizualizeze fișierele prin linkuri.

Dacă schimb '#tip' a câmpului link de la 'legătură' la „câmp text” sau 'textarea', coloana conține elementele la care m-aș aștepta - titlul urmat de un câmp de text sau o zonă de text. Când schimb '#tip' înapoi la 'legătură' (după cum se arată în codul de mai sus), coloana este complet goală. Când văd sursa paginii, acea coloană conține gol <td> Etichete.

<td></td>

Este exact la fel ca și cum aș schimba '#tip' la 'foo'. Acest lucru implică pentru mine că 'legătură' tipul de câmp nu este disponibil în contextul acestui formular. Pentru a testa asta, am încercat să mă adaptez Cum obțin toate tipurile de câmpuri de formular disponibile? în contextul Drupal 9.

$all_types = \Drupal::moduleHandler()->invokeAll('hook_elements');
\Drupal::messenger()->addMessage(json_encode($all_types));

In orice caz, elemente_cârlig() nu pare a mai fi folosit, așa că nu funcționează.

Elemente de formă și redare spectacole 'legătură' ca element de randare valid în Drupal 9.4.x, deci am înțeles că ar trebui să fie disponibil în formulare create de un modul personalizat.

CommentAdminOverview::buildForm() arată o utilizare foarte asemănătoare a '#type' => 'link'.

Citirea mea a răspunsului existent este că problema a fost că coloana nu a fost adăugată la '#antet' matrice (nu este vizibilă în codul postat).

  1. Am omis niște detalii simple din codul pe care l-am postat mai sus, care cauzează 'legătură' câmpurile să fie goale, în timp ce se schimbă '#tip' la „câmp text” produce rezultatul scontat?
  2. Există vreo modalitate de a verifica setul de valide '#tip' șiruri în contextul meu?
  3. Dacă 'legătură' tipul de câmp nu este disponibil în contextul meu, cum îl pot face disponibil?

Nu se adaugă nimic la jurnalul Drupal când încarc acest formular.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.