Рейтинг:1

Какова новая методология предварительного рендеринга формы для использования TrustedCallbackInterface?

флаг cn

Мы обновляем наши сайты один за другим с Drupal 8 на Drupal 9, и в нашей пользовательской теме есть одна строка кода, которая является последней из наших проблем.

Мы получаем следующую ошибку в представлении, которое использует открытый фильтр:

Drupal\Core\Security\UntrustedCallbackException: обратные вызовы Render #pre_render должны быть методами класса, реализующего \Drupal\Core\Security\TrustedCallbackInterface, или быть анонимной функцией. Обратный вызов был MYSITE_form_alter_views_exposed_form_MYVIEW_pre_render. См. https://www.drupal.org/node/2966725 в Drupal\Core\Render\Renderer->doTrustedCallback() (строка 96 core/lib/Drupal/Core/Security/DoTrustedCallbackTrait.php).

В файле OURTHEME.theme у нас есть эта функция:

/**
 * Изменение пользовательской формы для событий.
 */
функция OURTHEME_form_alter_views_exposed_form_events_pre_render($form) {
  $поля = [
    'field_start_date_value',
    'field_end_date_value',
    'field_address_locality',
  ];
  foreach ($fields как $field) {
    $form[$field]['#title_display'] = 'после';
  }
  $form['field_date_range_end_value']['#prefix'] = '<div class="event-exposed-form">';
  $form['field_event_address_locality']['#suffix'] = '</div>';
  вернуть $ форму;
}

И функция вызывается здесь (просто фрагмент кода в этой функции):

/**
 * Это изменения переменных формы перед их визуализацией.
 */
функция НАША_форма_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'views_exposed_form' && strpos($form['#id'], 'views-exposed-form-events-') === 0) {
    $form['#pre_render'][] = 'НАША ТЕМА_form_alter_views_exposed_form_events_pre_render';
  }
  вернуть $ форму;
}

Из того, что я мог предположить из исследований, которые я провел до сих пор, кажется, что обычно любой класс, в котором используются эти виды функций, реализует Drupal. TrustedCallbackInterface. К сожалению, единственная информация, которую я нашел, касалась различных исправлений, применяемых к проектам на Drupal.org, поэтому я пытаюсь собрать воедино методологию из ее случайных применений.

Конечно, есть страница API Drupal, но она не особенно полезна, когда дело доходит до фактического объединения частей в полезную методологию без знания остальной части API, как тыльной стороны руки.

Кто-нибудь знает, есть ли какая-либо документация о том, как применить TrustedCallbackInterface к функции, которая ранее использовалась $form['#pre_render'][], особенно в THEME.theme, который не настроен так же, как любой старый пользовательский класс в модуле?

Kevin avatar
флаг in
Ошибка тут же — вы добавляете в pre_render функцию, вызов которой не разрешен. https://www.drupal.org/node/2966725
Loopy avatar
флаг cn
Итак, ответ просто «Не пытайтесь изменить предварительный рендеринг формы. Делайте то, что вам нужно, по-другому». ?
Kevin avatar
флаг in
Посмотрите на связанную запись об изменении
Loopy avatar
флаг cn
Файл .theme не является классом. Итак, я должен создать папку src в моей теме и переместить код из моего файла .theme в объявление нового класса?
4uk4 avatar
флаг cn
Да, см., например, https://drupal.stackexchange.com/a/300204/47547. Для другого типа обратного вызова, но он показывает класс, реализующий RenderCallbackInterface в теме.
Loopy avatar
флаг cn
Спасибо за более реалистичный пример.В конце концов, мне было так трудно выяснить, как правильно передавать значения для формы и ее элементов, что я отказался и полностью отказался от этой методологии в пользу простого изменения шаблона ветки.
Рейтинг:3
флаг cn

Вы можете сделать что-то вроде этого:

в вашем новом модуле my_prerenders в my_prerenders/источник/ добавить новый класс:

пространство имен Drupal\my_prerenders;

используйте Drupal\Core\Security\TrustedCallbackInterface;


класс MyPreRenders реализует TrustedCallbackInterface {

  /**
   * @inheritDoc
   */
  общедоступная статическая функция trustCallbacks() {
    return ['formAlterViewsExposedFormEventsPreRender'];
  }

  публичная функция formAlterViewsExposedFormEventsPreRender($form) {
    $поля = [
    'field_start_date_value',
    'field_end_date_value',
    'field_address_locality',
    ];
    foreach ($fields как $field) {
      $form[$field]['#title_display'] = 'после';
    }
    $form['field_date_range_end_value']['#prefix'] = '<div class="event-exposed-form">';
    $form['field_event_address_locality']['#suffix'] = '</div>';
    вернуть $ форму;
  }

}

В НАША.тема вам просто нужно использовать:

используйте Drupal\my_prerenders\MyPreRenders;

...
...

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

вместо

$form['#pre_render'][] = 'НАША ТЕМА_form_alter_views_exposed_form_events_pre_render';

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

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