it-swarm.com.de

Belichtete Filter mit Dropdown-Auswahl

Ich habe ein Projekt, in dem ich eine Ansicht mit einigen grundlegenden Informationen erstellt habe, z. B. Jahr, Hersteller, Produkttyp. Sie sind alle benutzerdefinierte Textfelder. Ich kann einen Filter für sie verfügbar machen, mit dem ich eine Suche manuell eingeben kann, z. B. 2008 für das Jahr, und der mir alle Einträge für 2008 korrekt anzeigt.

Gibt es eine Möglichkeit, diese Felder als Dropdown-Auswahl basierend auf dem in jedem Knoten gespeicherten Inhalt verfügbar zu machen, z. B. so, dass im Feld Jahr 2001, 2002, 2003 ..... 2012 usw. angezeigt wird oder im Produkttyp "Tabelle, Stuhl" angezeigt wird , Lampe usw. ", aus denen der Benutzer wählen kann? Ich bin ziemlich neu in der Verwendung von Ansichten und habe Schwierigkeiten, eine Antwort zu finden.

Ich verwende Drupal 7 und Views 3.3.

5
Stuart

Das Problem hierbei ist, dass die Felder benutzerdefinierte Textfelder sind. Wenn das Feld "Produkttyp" vom Typ "Liste (Text)" wäre, wäre es ein Dropdown-Menü in Ansichten, wenn es angezeigt wird.

Vielleicht wäre der Produkttyp gut, um stattdessen Taxonomiebegriffe zu haben? Dann könnten Produkttypen einfach zum Wortschatz hinzugefügt werden, wenn die Website wächst. Das Feld in Ihrem Inhaltstyp wäre dann eine "Begriffsreferenz" zum Produkttyp Taxonomie-Vokabular. Wenn sich die Produkttypen selten oder nie ändern, können Sie bei "Liste (Text)" bleiben.

Ich würde das Feldjahr wahrscheinlich zu einem Datumsfeld, einer Taxomomie oder einer Liste (Ganzzahl) machen.

Ich hoffe, Sie sehen, wohin ich hier gehen möchte. Die Felder müssen vom richtigen Typ sein, damit Ansichten die Felder richtig interpretieren können, und "automatisch" erhalten Sie Dropdowns, wenn die Filter verfügbar sind usw.

4
Pontus Nilsson

Wenn Sie ein Modul für diese Aufgabe schreiben möchten, können Sie das Problem wie folgt lösen. Ich habe diesen Code von hier angepasst.

Erstellen Sie ein Modulverzeichnis in sites/all/themes/modules und nenne es custom_exposed_year_filter.

Erstellen Sie eine Datei custom_exposed_year_filter.info enthält Folgendes:

; custom_exposed_year_filter.info
name = Custom Exposed Year Filter
description = Sorts exposed years filter into a dropdown instead of a textfield
core = 7.x
files[] = custom_exposed_year_filter.module

Erstellen Sie dann eine Datei mit dem Namen custom_exposed_year_filter.module und füge diesen Code ein:

<?php
// custom_exposed_year_filter.module

function custom_exposed_year_filter_form_views_exposed_form_alter(&$form, &$form_state) {
    $field_id = 'field_reference_year_start';

    // Only alter forms with the necessary field
    if (isset($form[$field_id . '_value'])) {
        // Build a query to get all node ids having the specified field
        $query = new EntityFieldQuery();
        $results = $query->entityCondition('entity_type', 'node')
                ->fieldCondition($field_id, 'value', 'NULL', '!=')
                ->fieldOrderBy($field_id, 'value', 'ASC')
                ->execute();

        // Attach the field values to the nodes
        $nodes = $results['node'];
        field_attach_load('node', $nodes, FIELD_LOAD_CURRENT, array('field_id' => $field_id));

        // Add a default so the filter is optional
        $options = array('' => '<select>');

        // Buld the options array based on the query results, overwriting duplicate entries
        foreach ($nodes as $node) {
            $value = $node->{"$field_id"}['und'][0]['value'];
            $options[$value] = $value;
        }

        // Alter the field
        $form[$field_id . '_value']['#type'] = 'select';
        $form[$field_id . '_value']['#options'] = $options;
        $form[$field_id . '_value']['#size'] = 1;
    }
}

Passen Sie zum Schluss die folgende Zeile so an, dass sie mit dem Namen des Felds übereinstimmt, nach dem Sie filtern möchten:

$field_id = 'field_your_field_name';

Leeren Sie dann den Cache, aktivieren Sie Ihr neues Modul in Drupal, erstellen Sie einen Filter für Ihr Feld und aktivieren Sie das Kontrollkästchen "Offen", um den Filter für Besucher verfügbar zu machen.

Wenn Sie mehrere Filter in Dropdowns umwandeln müssen, können Sie den obigen Code anpassen oder einfach mehrere Module für jedes Feld erstellen.

Wenn Sie eine sehr große Anzahl von Elementen in Ihrer Ansicht haben, können Leistungsprobleme auftreten. Es funktioniert jedoch wie ein Zauber für mich.

2
likeitlikeit

Ich hatte eine Liste von Herstellern aus mehreren Ländern und wollte einen exponierten Filter mit allen Ländern in dieser Herstellerliste hinzufügen. Ich habe einen ähnlichen Ansatz in Anthonygores Lösung oben verfolgt (danke Kumpel!), Aber mit einem hook_views_exposed_form_alter im template.php:

function your-theme_form_views_exposed_form_alter(&$form, &$form_state){

if ($form['#id'] == 'your-form-id') {

// query distinct field values for all nodes in content type

$query = db_select("field_data_your-exposed-views-filter-field}", 'f');
$options = $query
  ->fields('f', array('your-exposed-views-filter-field_value'))
  ->condition('entity_type', 'node')
  ->condition('bundle', 'fornecedor')
  ->orderBy('your-exposed-views-filter-field_value', $direction = 'ASC')
  ->distinct()
  ->execute()->fetchCol();
  }

// Create an assoc array with equal keys and values from the query array

$result = array_combine($options, $options);

// Add the option "All" to the array

$result = array_merge(array('All' => '- Any -'), $result);

// Convert the textfield exposed filter to a select list

$form['your-exposed-views-filter-field']['#type'] = 'select';
$form['your-exposed-views-filter-field']['#size'] = 'null';

// Update the form options with the query array

$form['your-exposed-views-filter-field']['#options'] = $result;


// Important! Remove "An illegal choice has been detected. Please contact the site administrator." error. More info at https://www.drupal.org/node/1177882#comment-8891105 
$form['your-exposed-views-filter-field']['#validated'] = true;

} 
2
tmsss

Eine Lösung gefunden. Hat für mich gearbeitet. Überprüfen Sie es hier. http://bryanbraun.com/2013/08/06/drupal-tutorials-exposed-filters-with-views

0
user2658838

Ich hatte ein Problem, bei dem ich Blog-Beiträge nach Erstellungsdatum filtern musste, aber das Datumsfeld in Ansichten zeigte nur einen Bereich an, z. -10 Jahre bis 0 Jahre.

Das Problem dabei ist, dass Jahre angezeigt würden, in denen es keine Blog-Beiträge gab, z. Nehmen wir an, es gab 2007 keine Beiträge, Sie hätten es immer noch als Option.

Die Lösung zum Herausfiltern nicht benötigter Jahre lautet wie folgt:

  1. In der belichteten Filterform gibt es ein Feld für das Datum, z. $form['date_value']. Es sollte einen Verarbeitungsrückruf haben, in meinem Fall war es $form['date_value']['value']['#process'][0] = 'date_select_element_process'.
  2. Nehmen Sie einen Änderungshaken für den Rückruf vor, z. mymodule_date_select_process_alter(&$element, $form_state, $context)
  3. Fragen Sie Ihre Knoten mit EntityFieldQuery() ab, um herauszufinden, welche Jahre von Ihren vorhandenen Knoten verwendet werden
  4. Filtern Sie Ihre Datumsliste entsprechend, z. unset($element['year']['options'][2007]);

Hier ist eine Beispielimplementierung

/**
 * Implements hook_date_select_process_alter().
 */
function mymodule_date_select_process_alter(&$element, $form_state, $context) {

  if (!empty($context['form']['#id'])) {

    // Check to ensure we're modifying the correct exposed form
    if ($context['form']['#id'] == "views-exposed-form-blog-page-1") {

      // Query the blog nodes to see which dates we have
      $field_id = 'field_date';
      $query = new EntityFieldQuery();
      $results = $query
        ->entityCondition('entity_type', 'node')
        ->entityCondition('bundle', 'blog')
        ->fieldCondition($field_id, 'value', 'NULL', '!=')
        ->fieldOrderBy($field_id, 'value', 'ASC')
        ->execute();

      // Attach the field values to the nodes
      $nodes = $results['node'];
      field_attach_load('node', $nodes, FIELD_LOAD_CURRENT, array('field_id' => $field_id));

      // Build the options array based on the query results
      $options = array('' => "-Year");

      foreach ($nodes as $node) {
        $value = $node->{"$field_id"}['und'][0]['value'];
        $date = DateTime::createFromFormat("Y-m-d H:i:s", $value);
        $year = $date->format("Y");
        $options[$year] = $year;
      }

      // Add the filtered options back to the element
      $element['year']['#options'] = $options;
    }
  }
}
0
anthonygore