Puncte:1

Cum să preveniți schimbarea temei cauzată de $rendererService->renderPlain()

drapel ru

Încerc să reutilizați rezultatul de la un formatator de câmpuri puternic personalizat ca <select><option> text într-un formular Web. Am reușit să refolosesc afișarea câmpului, dar are efectul secundar de a schimba tema folosită pentru randare.

Mai jos este un cod simplificat, liniile $dateRenderArray =... și $dateHtml =... sunt originale si cauzeaza problema:

funcția mymodule_webform_options_alter(matrice &$opțiuni, matrice &$element, $opțiuni_id = NULL) {
  foreach ($opțiuni ca $valoare => $text) {
    $entity = getEntityByOption($valoare);

    //reutilizați ieșirea formatatorului de câmp personalizat
    $dateRenderArray = $entity->get('field_daterange')->view('teaser');

    // linia următoare provoacă schimbarea temei
    $dateHtml = \Drupal::service('renderer')->renderPlain($dateRenderArray);

    $datePlaintext = str_replace(["\n", " "], ["", " "], trim(strip_tags($dateHtml)));
    $muchBetterOptionText = $someOtherPlaintextFromEntity . ' ' . $datePlaintext;
    $options[$value] = $muchBetterOptionText;
  }
}

Acest lucru funcționează excelent în formularul de front-end, pentru e-mailurile de trimitere și, de asemenea, în lista de trimitere a formularelor web de administrare.

Dar într-o singură vizualizare de detaliu a trimiterii formularului web, acele linii provoacă o schimbare nedorită a temei de la tema de administrare la temă de interfață.

Întrebare:
Cum pot preveni schimbarea temei de la renderPlain() și păstrați tema de administrare atunci când vizualizați o singură trimitere a unui formular web?

Întrebare bonus opțională:
De ce funcționează corect cârligul meu în lista de trimitere a formularelor web și nu în vizualizarea detaliată a trimiterii formularelor web? Lista de trimitere folosește exact aceeași funcție, redă același text de opțiune procesat în coloana corespunzătoare, dar eu rămân corect în tema de administrare atunci când vizualizez lista. Dar numai în vizualizarea de detaliu comută la tema frontend.

4uk4 avatar
drapel cn
În mod normal, nu există nicio schimbare de temă într-o solicitare. Tema se negociază global pentru întreaga solicitare. Bănuiesc că există două solicitări, una care redă conținutul și una care invocă cârligul. Puteți verifica numele rutelor pentru ambele? Dacă aveți două rute diferite, verificați pentru fiecare cerințele pentru negocierea temei de administrare. Dacă este necesar, implementați-vă propriul negociator pentru a doua cerere. Vedeți https://drupal.stackexchange.com/questions/281447/themenegotiator-not-working-for-admin-pages
Puncte:1
drapel ru

Am aflat că este implicată o logică specifică formularului web (@vede Entitate WebformSubmission folosind un temă personalizată și logica de randare).

Redarea mea personalizată confuză logica formularului web. Am trecut la redarea proprie a Webform și am aplicat tema de administrare după redarea personalizată.

funcția mymodule_webform_options_alter(matrice &$opțiuni, matrice &$element, $opțiuni_id = NULL) {
  //Serviciul de redare propriu al webform
  $webformRenderer = \Drupal::service('webform.theme_manager');

  foreach ($opțiuni ca $valoare => $text) {
    $entity = getEntityByOption($valoare);

    //reutilizați ieșirea formatatorului de câmp personalizat
    $dateRenderArray = $entity->get('field_daterange')->view('teaser');

    // linia următoare provoacă o modificare a temei pe ruta entity.webform_submission.canonical
    $dateHtml = $webformRenderer->renderPlain($dateRenderArray);

    $datePlaintext = str_replace(["\n", " "], ["", " "], trim(strip_tags($dateHtml)));
    $muchBetterOptionText = $someOtherPlaintextFromEntity . ' ' . $datePlaintext;
    $options[$value] = $muchBetterOptionText;
  }

  //numele rutei este nul, trebuie să folosească cererea în schimb
  if (strpos(\Drupal::request()->getRequestUri(), '/admin/structure/webform/manage/MY_WEBFORM_ID/submission/') === 0) {
    //doar administratorii pot vizualiza trimiterile de formulare web
    $webformRenderer->setCurrentTheme(\Drupal::config('system.theme')->get('admin'));
  }
}

Pare puțin hacker, dar face șmecheria.

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.