it-swarm.com.de

Zeigen Sie nur verwendete Taxonomiebegriffe in exponierten Filtern an

Ich habe einen exponierten Filter für Tags in meiner Ansicht. Ich möchte, dass dieser Filter nur die verwendeten Tags anzeigt. Ich habe einige drupal 7 Optionen wie diese hier und die Views Selective Filter gefunden, kann aber anscheinend keine gute finden drupal 8 Option.

Kann mir jemand mit einer Lösung dafür helfen?

3
Joost

Wie Adrian sagte, war es möglich, den Code im Artikel ein wenig zu ändern, um ihn für Drupal 8) geeignet zu machen. Hier ist meine Lösung:

function MODULENAME_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  //id of the form you want to alter
  $formId = 'views-exposed-form-agenda-page-1';
  //field tags
  $select_field = 'field_tags_target_id';

  /**
   * Apply the form_alter to a specific form #id
   * the form #id can be found through inspecting the markup
   */
  if ($form['#id'] == $formId) {
    $available_terms = _get_available_terms();
    if (isset($available_terms)) { // Unset the existing list and add new one with available terms.
      unset($form[$select_field]['#options']);

      if ($form[$select_field]['#options']['All']) {
        $form[$select_field]['#options']['All'] = '- Any Term -';
      }

      foreach ($available_terms as $available_term) {
        $tid = $available_term[0];
        $name = $available_term[1];
        $form[$select_field]['#options'][$tid] = $name;
      }
    }
    else { // Unset all options except '- Any -'
      unset($form[$select_field]['#options']);
      $form[$select_field]['#options']['All'] = '- Any Term -';
    }
  }
}

function _get_available_terms() {
  //table name of tags field
  $node_tags_table = 'node__field_tags';

  $db = \Drupal::database();
  $query = $db->select($node_tags_table, 'nft');
  $query->distinct();
  $query->join('taxonomy_term_field_data', 'tname', 'tname.tid = nft.field_tags_target_id');
  $query->fields('nft', ['field_tags_target_id']);
  $query->fields('tname', ['name']);
  $result = $query->execute();

  $term_list = [];
  while ($row = $result->fetchAssoc()) {
    array_Push($term_list, [$row['field_tags_target_id'], $row['name']]);
  }

  return $term_list;
}
1
Joost

In Drupal 8) konnte ich nur Tags mit Ergebnissen mit dem folgenden Code anzeigen. Beachten Sie, dass ich das Contrib-Modul für besser exponierte Filter verwende und meinen Filter als Auswahl anzeige.

function mymodule_form_views_exposed_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  if ($form['#id'] == 'views-exposed-form-your-view-name-page') {

    if (array_key_exists('field_activities_target_id', $form)) {
      // Rewrite the default 'All' option
      if (!empty($form['field_activities_target_id']['#options']['All'])) {
        $option_default = ['All' => t('Choose a category')];
      }

      $options = $form['field_activities_target_id']['#options'];

      $connection = Database::getConnection();
      $query = $connection->select('node__field_activities', 'activities');
      $query->join('node_field_data', 'n', 'n.nid = activities.entity_id');
      $query->fields('activities', ['field_activities_target_id']);
      $query->fields('n', ['status']);
      $query->condition('activities.bundle', 'your_node_type_name');
      $query->condition('n.status', 1);
      $data = $query->distinct()->execute();

      $results = array_flip($data->fetchAll(\PDO::FETCH_COLUMN, 'field_activities_target_id'));
      $options = array_intersect_key($options, $results);

      // Rebuild the option select
      $form['field_activities_target_id']['#options'] = $option_default + $options;
    }
  }
}

Dieser Artikel war eine große Hilfe: https://johndevman.com/only-show-options-in-a-views-exposed-filter-that-belong-to-result-set/

2
romain ni

Hier ist das D8-Modul, mit dem ich diese Funktion ausführe: https://www.drupal.org/project/selective_better_exposed_filters

Es hängt von better_exposed_filters ab. https://www.drupal.org/project/better_exposed_filters

Es befindet sich noch in der Beta-Phase, testen Sie also zuerst lokal in Ihrer Umgebung, aber es hat bei meinen Tests gut funktioniert. Die (selektiven) Filteroptionen werden nicht hinzugefügt, wenn Sie Filterkriterien hinzufügen, wie Sie es im alten D7-Modul gewohnt sind, aber es führt dieselbe Funktion aus:

Sobald Sie einen exponierten Filter in Filterkriterien haben, gehen Sie zu "exponierter Formularstil" unter Erweitert und wechseln Sie zu besser exponierte Filter (selektiv). Klicken Sie auf Übernehmen

(enter image description here

Aktivieren Sie dann das Kontrollkästchen "Nur verwendete Begriffe anzeigen" unten. Klicken Sie auf Übernehmen.

(enter image description here

Edit : Wenn Sie mehrere exponierte Filter haben, können Sie diese einzeln unter jedem "Weitere Optionen für ..." oder alle von ihnen global ganz unten in den Einstellungsoptionen.

Ziemlich einfach für diejenigen von uns, die es nicht mögen, eigene Module zu schreiben.

1
TonyTheFerg