Zeigen Sie einen einzelnen Filter der Kombination von zwei Feldern in Ansichten an

24

Ich habe zwei Benutzerprofilfelder "Nachname" und "Vorname". Ich habe auch eine Benutzerliste. Ich möchte "Name" als Filter anzeigen, der sowohl nach Nachname als auch nach Vorname suchen kann. Wie kann ich einen einzelnen Filter für die Kombination dieser beiden Felder erstellen? Kann ich es über die Benutzeroberfläche von Ansichten erstellen?

Eine Möglichkeit ist, ein weiteres Profilfeld "Name" zu erstellen, das im Formular ausgeblendet wird. Beim Speichern durch den Benutzer würde ich die beiden Feldwerte in das Feld "Name" kombinieren und es dann als Filter in den Ansichten verfügbar machen. Diese Lösung ist jedoch hartcodiert und muss Hooks schreiben.

Sithu
quelle
Schauen Sie sich diese Frage an: drupal.stackexchange.com/questions/42366/… Vielleicht kann sie Ihnen helfen. Und nein, Sie müssen ein Modul machen. Oskar
Oskar Calvo
Diese Funktion ist im Ansichtsmodul integriert. Es ist keine Programmierung erforderlich. Dieses YouTube-Video zeigt ein vollständiges Beispiel für die Verwendung.
Asiby

Antworten:

21

Ich habe schließlich eine Lösung daraus . Ich folgte der zweiten angebotenen Primärlösung, obwohl der Blogger sie persönlich verwendete hook_views_query_alter().

  1. installiert das Modul Views Filter füllen .
  2. fügte zwei Filter "Vorname" und "Nachname" hinzu (beide dürfen nicht verfügbar sein) und fügte sie einer OR-Filtergruppe hinzu (Views 3 unterstützt dies). Ich musste den Operator "Enthält ein beliebiges Wort" für beide Felder verwenden, da die Abfrage sonst kein gewünschtes Ergebnis lieferte.
  3. hat einen Filter "Global: Filter füllen" erstellt, die beiden Felder hinzugefügt und verfügbar gemacht.

Dies gab mir eine schnelle Lösung ohne harte Codierung.
Hier ist eine andere hilfreiche Referenz.

Sithu
quelle
Ich glaube nicht, dass Sie Schritt 2 ausführen müssen - ich habe das Modul installiert und einen "Global: Felder kombinieren-Filter" verwendet, der angezeigt wurde. Ich habe die beiden Felder in den Einstellungen dieses kombinierten Feldes ausgewählt.
Laryn - CEDC.org
13

In meiner Installation, D7 mit Views 7.x-3.6, können Sie einen Filter mit dem Namen "Global: Filter für Felder kombinieren" hinzufügen, der genau das tut, was Sie benötigen, und es Benutzern ermöglicht, mit einem einzigen Filter in mehreren Feldern zu suchen.

Mona
quelle
1
Dies sollte die akzeptierte Antwort sein
frazras
5

Es ist wirklich einfach.

  1. Klicken Sie auf Filter hinzufügen.
  2. Wählen Sie "Global: Filter für Felder kombinieren".
  3. Folge den Anweisungen.

Vielen Dank.

Shitanshu Mishra
quelle
2

Funktioniert sofort

Der einfachste Weg ist die Verwendung des Filters "Suchbegriffe" , der die Kernfunktionalität von Views darstellt . Es durchsucht alle Felder der Entität und gibt das Ergebnis zurück, kein zusätzliches Modul erforderlich!

  1. Gehen Sie zu Ihrer Ansicht
  2. Fügen Sie einen neuen Filter zum Anzeigen hinzu
  3. Wählen Sie "Suche: Suchbegriffe"

Das ist es, nichts anderes zu tun (vielleicht möchten Sie es aber aussetzen)

Es funktioniert auch sehr gut.

Larzan
quelle
0

Sie können hook_views_pre_execute (& $ view) verwenden, um Ihre einzelne Bedingung auf mehrere gewünschte Felder auszudehnen

/**
 * Recursive looks for mentioning of $fname as field of in query QueryConditionInterface::conditions()
 * 
 * @param array $cond result of QueryConditionInterface::conditions to search in
 * @param string $fname a name oof field we are looking for
 * @param array $res result array containing a references of conditions having $fname
 * @param integer $rec_lvl level of recursion
 * 
 * @return array an array containing $fname mentioned in condition $res[]['field'] == $fname
 */
function dolynskyi_help_func_find_field_condition(&$cond, $fname, &$res = array(), &$rec_lvl = 0) {
    $numeric_keys = array_filter(array_keys($cond), function($k) {return is_int($k) || (substr($k, 0, 1) !== '#');});
    $rec_lvl++;
    foreach($numeric_keys as $numkey) {
        $t = gettype($cond[$numkey]['field']);
        if($t == 'string') {
            if($cond[$numkey]['field'] == $fname) {
                $res[] = &$cond[$numkey];
            }
        } elseif($t == 'object') {
            dolynskyi_help_func_find_field_condition($cond[$numkey]['field']->conditions(), $fname, $res, $rec_lvl);
        }
    }
    $rec_lvl--;
    return $res;
}

function dolynskyi_help_func_views_pre_execute(&$view) {
    if($view->name == 'appraisals_special_global_access') { // view name we wanna extend
        $fname = 'field_data_field_ap2_employee.field_ap2_employee_target_id'; // field we look for to use as source of extending
        $search = &dolynskyi_help_func_find_field_condition($view->build_info['query']->conditions(), $fname);
        foreach($search as &$v) { // looping found field references
            $or = db_or(); 
            $or->condition($v['field'], $v['value'], $v['operator']); //repeating existing field condition
            $or->condition('field_data_field_ap2_employee.field_ap2_employee_target_id', array('711'), 'IN'); //adding any extra condition
            $v = array('value'=>null, 'operator'=>'IS NULL', 'field'=>$or); // wrapping up simple condition for $fname to multiple with $fname + our extra field via OR logic
            unset($v);
        }
    }
}
Mykola Mykolayovich Dolynskyi
quelle