Puncte:0

Cum se creează o înregistrare dblog dintr-o trimitere a unui formular de vizualizări expuse

drapel cn

Încerc să creez o înregistrare de jurnal a căutărilor efectuate prin intermediul blocului meu de formulare expuse Search API View în Drupal 9.

Din anumite motive, la o căutare nouă, primesc 2 duplicate (3 intrări în total) și se pare că îmi amintesc că am citit undeva că formularele pot fi trimise de mai multe ori. Asa ca as dori sa stiu cum as putea elimina asta.

Actualizare: iată o problemă pentru Drupal 7 https://www.drupal.org/project/views/issues/2088549

De asemenea, la căutările de cuvinte cheie care au ca rezultat „fără rezultate”, nu văd o intrare în jurnal. Acest comportament pare greșit. Folosesc următorul cod cu succes limitat:

/**
 * Implementează hook_form_views_exposed_form_alter().
 */
funcția MY_form_views_exposed_form_alter(&$form, FormStateInterface &$form_state, $form_id) {
  // Creați o funcție de trimitere search_log pentru watchdog
  $view_names = array('search_api_view');
  $view = $form_state->getStorage('view');
  if ($form_id == 'views_exposed_form' && in_array($view['view']->id(), $view_names)) {
    if ($form['#id'] == 'vizualizări-exposed-form-search-api-view-page-1') {
      $form['#submit'][] = 'MY_search_api_log';
    }
  }
}

funcția MY_search_api_log(&$form, FormStateInterface $form_state) {
  if ($form_state->getValue('search_api_fulltext') != "") {
    // Creați un link
    $link = Url::fromRoute('view.search_api_view.page_1', [], ['query' => ['search_api_fulltext' => $form_state->getValue('search_api_fulltext'), ], ]);
    // înregistrează trimiterea
    \Drupal::logger('search_api_results')->info($form_state->getValue('search_api_fulltext'), ['link' => Link::fromTextAndUrl('results', $link)->toString()]) ;
  }
}

Încerc să convertesc această funcție dintr-un cârlig pe care îl folosesc în D7, care funcționează bine:

/**
 * Implementează hook_form_views_exposed_form_alter().
 */
funcția MY_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  //Creează o funcție de trimitere search_log pentru watchdog
  if($form_state["view"]->base_field == 'search_api_id') {
    $form['#submit'][] = 'MY_search_api_log';
  }
}

funcția MY_search_api_log(&$form, $form_state) {
  dacă ($form_state['values']['search_api_views_fulltext'] != "") {
    $link = l('results', '/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);
  }
}
Puncte:0
drapel in

Doua ganduri:

  1. În loc să faceți acest lucru pe handlerul de trimitere a formularelor, poate încercați să faceți loggerul direct în cârligul de modificare sau un cârlig de preprocesare înainte ca pagina să fie redată.

  2. Apoi, pentru a evita apelul duplicat, dacă preprocesarea sau modificarea cârligului este încă executată de mai multe ori, aveți nevoie de o modalitate de a vă asigura că mesajul dvs. de jurnal este numit doar o singură dată.

    Pentru aceasta, ar putea exista două abordări.

    • Utilizați drupal_static pentru a seta un boolean.

    • Atașați o cheie/valoare la obiectul $form după ce imprimați mesajul watchdog și apoi preveniți înregistrarea duplicată dacă $form are deja cheia.

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.