Puncte:1

Care este noua metodologie pentru Form Pre-Render pentru a utiliza TrustedCallbackInterface

drapel cn

Ne actualizăm site-urile pe rând de la Drupal 8 la Drupal 9 și există o linie de cod în tema noastră personalizată care este ultima dintre problemele noastre.

Primim următoarea eroare pe View care utilizează un filtru expus:

Drupal\Core\Security\UntrustedCallbackException: Render #pre_render apelurile inverse trebuie să fie metode dintr-o clasă care implementează \Drupal\Core\Security\TrustedCallbackInterface sau să fie o funcție anonimă. Reapelarea a fost MYSITE_form_alter_views_exposed_form_MYVIEW_pre_render. Consultați https://www.drupal.org/node/2966725 în Drupal\Core\Render\Renderer->doTrustedCallback() (linia 96 din core/lib/Drupal/Core/Security/DoTrustedCallbackTrait.php).

În fișierul OURTHEME.theme, avem această funcție:

/**
 * Modificare personalizată a formularelor pentru evenimente.
 */
funcția OURTHEME_form_alter_views_exposed_form_events_pre_render($form) {
  $câmpuri = [
    „field_start_date_value”,
    „field_end_date_value”,
    „localitate_adresă_câmp”,
  ];
  foreach ($câmpuri ca $câmp) {
    $form[$field]['#title_display'] = 'după';
  }
  $form['field_date_range_end_value']['#prefix'] = '<div class="event-exposed-form">';
  $form['field_event_address_locality']['#suffix'] = '</div>';
  returnează $form;
}

Și funcția este numită aici (doar un fragment de cod din această funcție):

/**
 * Acestea sunt modificările variabilelor de formulare înainte ca acestea să fie redate.
 */
funcția OURTHEME_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'views_exposed_form' && strpos($form['#id'], 'views-exposed-form-events-') === 0) {
    $form['#pre_render'][] = 'OURTHEME_form_alter_views_exposed_form_events_pre_render';
  }
  returnează $form;
}

Din ceea ce am putut intui din cercetările pe care le-am făcut până acum, se pare că, în mod normal, indiferent de clasă în care sunt utilizate aceste tipuri de funcții, au implementat Drupal. TrustedCallbackInterface. Din păcate, singurele informații pe care le-am găsit au fost în diferitele patch-uri aplicate proiectelor de pe Drupal.org, așa că încerc să împletesc o metodologie din aplicații aleatorii ale acesteia.

Desigur, există pagina Drupal API, dar aceasta nu este deosebit de utilă atunci când vine vorba de a pune împreună piesele într-o metodologie utilă fără a cunoaște restul API-ului ca pe dosul mâinii tale.

Știe cineva dacă există vreo documentație despre cum se aplică TrustedCallbackInterface la o funcție utilizată anterior $form['#pre_render'][], în special în THEME.theme care nu este configurat la fel ca orice clasă personalizată veche dintr-un Modul?

Kevin avatar
drapel in
Eroarea este chiar acolo - adăugați o funcție la pre_render care nu este aprobată pentru a fi apelată. https://www.drupal.org/node/2966725
Loopy avatar
drapel cn
Deci, răspunsul este doar „Nu încercați să modificați formularul înainte de randarea. Faceți ceea ce trebuie să faceți în alt mod”. ?
Kevin avatar
drapel in
Uitați-vă la înregistrarea modificărilor conectată
Loopy avatar
drapel cn
Fișierul .theme nu este o clasă. Deci ar trebui să creez un folder src în tema mea și să muți codul din fișierul meu .theme într-o nouă declarație de clasă?
4uk4 avatar
drapel cn
Da, consultați, de exemplu, https://drupal.stackexchange.com/a/300204/47547. Pentru un alt tip de apel invers, dar arată o clasă care implementează RenderCallbackInterface într-o temă.
Loopy avatar
drapel cn
Mulțumesc pentru exemplul mai realist.În cele din urmă, mi-a fost atât de dificil să găsesc modalitatea corectă de a transmite valorile pentru o formă și elementele sale, încât am renunțat și am abandonat complet această metodologie în favoarea doar a modificării șablonului crenguță.
Puncte:3
drapel cn

Puteți face ceva de genul acesta:

în noul tău modul my_prerenders în my_prerenders/src/ adăugați o nouă clasă:

spațiu de nume Drupal\my_prerenders;

utilizați Drupal\Core\Security\TrustedCallbackInterface;


clasa MyPreRenders implementează TrustedCallbackInterface {

  /**
   * @inheritDoc
   */
  funcție publică statică trustedCallbacks() {
    returnează ['formAlterViewsExposedFormEventsPreRender'];
  }

  funcția publică formAlterViewsExposedFormEventsPreRender($form) {
    $câmpuri = [
    „field_start_date_value”,
    „field_end_date_value”,
    „localitate_adresă_câmp”,
    ];
    foreach ($câmpuri ca $câmp) {
      $form[$field]['#title_display'] = 'după';
    }
    $form['field_date_range_end_value']['#prefix'] = '<div class="event-exposed-form">';
    $form['field_event_address_locality']['#suffix'] = '</div>';
    returnează $form;
  }

}

În TEMA NOASTRA.tema trebuie doar sa folosesti:

utilizați Drupal\my_prerenders\MyPreRenders;

...
...

$form['#pre_render'][] = [MyPreRenders::class, 'formAlterViewsExposedFormEventsPreRender'];

în loc de

$form['#pre_render'][] = 'OURTHEME_form_alter_views_exposed_form_events_pre_render';

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.