Рейтинг:0

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

флаг cn

Я пытаюсь создать запись в журнале поиска, сделанного с помощью моего блока формы Search API View в Drupal 9.

По какой-то причине при совершенно новом поиске я получаю 2 дубликата (всего 3 записи), и кажется, что я где-то читал, что формы можно отправлять несколько раз. Поэтому я хотел бы знать, как я мог бы устранить это.

Обновление: вот проблема для Drupal 7 https://www.drupal.org/project/views/issues/2088549

Кроме того, при поиске по ключевым словам, которые приводят к «отсутствию результатов», я не вижу записи в журнале. Такое поведение кажется удачным. Я использую следующий код с ограниченным успехом:

/**
 * Реализует hook_form_views_exposed_form_alter().
 */
функция MY_form_views_exposed_form_alter(&$form, FormStateInterface &$form_state, $form_id) {
  // Создаем функцию отправки search_log для сторожевого таймера
  $view_names = массив('search_api_view');
  $view = $form_state->getStorage('view');
  if ($form_id == 'views_exposed_form' && in_array($view['view']->id(), $view_names)) {
    if ($form['#id'] == 'views-exposed-form-search-api-view-page-1') {
      $form['#submit'][] = 'MY_search_api_log';
    }
  }
}

функция MY_search_api_log(&$form, FormStateInterface $form_state) {
  если ($form_state->getValue('search_api_fulltext') != "") {
    // Создаем ссылку
    $link = Url::fromRoute('view.search_api_view.page_1', [], ['query' => ['search_api_fulltext' => $form_state->getValue('search_api_fulltext'), ], ]);
    // регистрируем отправку
    \Drupal::logger('search_api_results')->info($form_state->getValue('search_api_fulltext'), ['link' => Link::fromTextAndUrl('results', $link)->toString()]) ;
  }
}

Я пытаюсь преобразовать эту функцию из хука, который я использую в D7, который отлично работает:

/**
 * Реализует hook_form_views_exposed_form_alter().
 */
функция MY_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  //Создаем функцию отправки search_log для сторожевого таймера
  if($form_state["view"]->base_field == 'search_api_id') {
    $form['#submit'][] = 'MY_search_api_log';
  }
}

функция MY_search_api_log(&$form, $form_state) {
  если ($ form_state['значения']['search_api_views_fulltext'] != "") {
    $link = l('результаты', '/search-results', ['query' => ['search_api_views_fulltext' => $form_state['values']['search_api_views_fulltext'], ], ]);
    watchdog('search_api_results', $form_state['values']['search_api_views_fulltext'], [], WATCHDOG_INFO, $link);
  }
}
Рейтинг:0
флаг in

Две мысли:

  1. Вместо того, чтобы делать это в обработчике отправки формы, попробуйте сделать логгер прямо в хуке alter или хуке предварительной обработки до того, как страница будет отображена.

  2. Затем, чтобы избежать двойного вызова, если хук предварительной обработки или изменения все еще выполняется несколько раз, вам нужен способ гарантировать, что ваше сообщение журнала вызывается только один раз.

    Для этого может быть два подхода.

    • Используйте drupal_static для установки логического значения.

    • Прикрепите ключ/значение к объекту $form после того, как вы напечатаете сторожевое сообщение, а затем предотвратите дублирование регистрации, если в $form уже есть ключ.

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

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