MIN/MAX-Werte im Exposed Filter Slider
![](http://www.drupalcenter.de/files/noavatar_mini.gif)
am 08.02.2016 - 10:03 Uhr in
Hallo Community,
ich habe eine Ansicht/View mit mehreren Slider-Filter (mit Modul Better Exposed Filter), die standardmäßig die Min-/Max-Werte bestimmter Felder enthalten.
Die Min-/Max-Werte der veröffentlichten Nodes ziehe ich mir durch diesen Code im template.php:
function newbusiness_better_exposed_filters_settings_alter(&$settings) {
// MAX price
$max_query = db_query('SELECT MAX(field_grundst_ckspreise_value) AS max_preis FROM, entity_id AS eid FROM field_data_field_grundst_ckspreise LEFT JOIN node AS n ON entity_id = n.nid WHERE n.status = 1');
$record = $max_query->fetchAssoc();
$max = floatval($record['max_preis']);
$settings['field_grundst_ckspreise_value']['slider_options']['bef_slider_max'] = $max;
// MIN price
$min_query = db_query('SELECT MIN(field_grundst_ckspreise_value) AS min_preis, entity_id AS eid FROM field_data_field_grundst_ckspreise LEFT JOIN node AS n ON entity_id = n.nid WHERE n.status = 1');
$record = $max_query->fetchAssoc();
$min= floatval($record['min_preis']);
$settings['field_grundst_ckspreise_value']['slider_options']['bef_slider_min'] = $min;
}
Neben den Exposed Filter Slider habe ich auch noch Exposed Filter in Form von Checkboxen. Wenn ein User die Ergebnisse über die Checkbox-Filter eingrenzt, dann sollten sich eigentlich auch die MIN/MAX-Werte in den Exposed Filter Slider entsprechend anpassen (ich nutze Ajax in der View und die Ansicht wird nach jeder Auswahl neu geladen).
Zur Verdeutlichung:
München: Grundstückspreis 290 €/m²
Berlin: Grundstückspreis 250 €/m²
Hamburg: Grundstückspreis 280 €/m²
Freiburg: Grundstückspreis 200 €/m²
Stuttgart: Grundstückspreis 220 €/m²
Dresden: Grundstückspreis 180 €/m²
Essen: Grundstückspreis 190 €/m²
Der Filter-Slider "Grundstückspreis" hat in der Standardeinstellung die Werte 180 (MIN) bis 290 (MAX).
Über den zusätzlichen Checkbox-Filter "Städte" trifft ein User nun eine Auswahl von vier Städten, z. B. Essen, Freiburg, Hamburg und Berlin. Nun sollte sich der Slider-Filter "Grundstückspreis" automatisch auf die Werte der ausgewählten Städte anpassen: 190 (MIN) bis 280 (MAX).
Weiß jemand, wie ich den Code anpassen muss, um das zu erreichen? Mir fehlen hierzu leider die Programmierkenntnisse.
Danke und Grüße
Thomas
- Anmelden oder Registrieren um Kommentare zu schreiben
versuch mal das modul hier
am 08.02.2016 - 10:48 Uhr
versuch mal das modul hier views_selective_filters
Habe ich nun versucht, es
am 17.02.2016 - 14:04 Uhr
Habe ich nun versucht, es funktioniert leider nicht damit. Das Selective Filter Modul ist eignet sich gut für Auswahllisten, die Filteroption "zwischen", die ich für meine jQuery Slider benötige gibt es nicht. Trotzdem vielen Dank für den Tipp.
Die oben beschriebene Datenbankabfrage beinhaltet aktuell zwei Aspekte:
Jetzt bräuchte ich noch eine Abfrage, nach dem Motto:
Kennt sich damit jemand aus?
Hallo Thomas,der Filter für
am 18.02.2016 - 10:27 Uhr
Hallo Thomas,
der Filter für Stadt müsste müsste ja auch im &$settings array vorhanden sein.
Ich weiss ja nicht was Stadt für ein Feld ist, aber wenn Du Deine queries anpasst,
müsstest Du auch nur die entsprechenden min max werte für diese Stadt bekommen.
db_query('SELECT MIN(field_grundst_ckspreise_value) AS min_preis, entity_id AS eid FROM field_data_field_grundst_ckspreise LEFT JOIN node AS n ON entity_id = n.nid LEFT JOIN STADTTABELLE AS s WHERE n.status = 1 AND STADT=s.STADT ');
Grüsse
Robert
Hallo Robert, danke für deine
am 18.02.2016 - 12:08 Uhr
Hallo Robert,
danke für deine Hilfe.
Das Feld "Stadt" war eigentlich nur ein Beispiel. Ich habe mehrere Checkbox-Filter, die auf Auswahlfeldern basieren. Die Funktionalität, die ich bräuchte, müsste sich also auf alle diese Filter beziehen.
Ich kann leider kein SQL, aber gibt es nicht einen Befehl in die Richtung:
...WHERE n.status = 1 AND n.viewdisplay = active
Stümperhaft von mir, ich weiß. Aber verstehst du was ich meine?
Danke und Grüße
Thomas
Hi Thomas, die Filter für die
am 18.02.2016 - 14:04 Uhr
Hi Thomas,
die Filter für die Städte sind, wie bereits beschreiben im Array &$settings
function newbusiness_better_exposed_filters_settings_alter(&$settings) {
enthalten, wenn der User die Form submitted.
Nein, Ich verstehe tatsächlich nicht genau was Du meinst.
Bei Deinem Beispiel wäre viewdisplay ein Feld in der node Tabelle.
MfG
Robert
Hi Robert, meine
am 19.02.2016 - 10:59 Uhr
Hi Robert,
meine Datenbankabfrage bestimmt die Min- und Max-Werte meiner Exposed jQuery Slider-Filter, indem die entsprechenden Werte eines Feldes (im Beispiel oben "Grundstückspreis") ausgelesen werden. Allerdings werden nur die Felder berücksichtigt, deren Node, in der sie enthalten sind, veröffentlicht sind. Die View wird entsprechend den Filtereinstellungen angepasst - wie in einem Onlineshop. Soweit passt alles.
Neben den Exposed jQuery Slider-Filter mit den Min-/Max-Werten habe ich auch noch mehrere Exposed Filter in Form von Checkboxen. Einer von diesen Exposed Filter Checkboxen ist "Bundesland". Wenn nun jemand in dieser Checkbox "Bayern" auswählt, dann sollten sich auch die Min-/Max-Werte in den Slider-Filtern so anpassen, dass nur die Werte für Bayern ausgelesen werden. Wenn zusätzlich zu "Bayern" in einem anderen Checkbox Filter "Landkreis" der Landkreis "München" ausgewählt wird, sollten sich die Min-/Max-Werte dementsprechend wieder anpassen.
Mein Gedanke war nun: Die Ansicht/View ändert sich entsprechend den Filtereinstellungen. Klickt jemand auf Bayern, dann werden nur noch die Nodes für Bayern angezeigt. Bei zusätzlichem Klick auf "Landkreis München" werden nur noch die Nodes für den Landkreis München angezeigt. Die Anzeige der View verhält sich also genau so, wie es auch die Werte in den Filter-Slider tun sollten. Daher dachte ich, dass es vielleicht einen Befehl gibt, der sagt: "Hole nur die Min-/Max-Werte aus den Nodes, die gerade in der View/Ansicht angezeigt werden".
Mein amateurhafter Befehl "WHERE n.status = 1 AND n.viewdisplay = active" hat dich wahrscheinlich verwirrt. Ich wollte mit dem letzten Teil ausdrücken, dass die Min-/Max-Werte nur aus den Nodes gezogen werden sollen, die in der View "aktiv" sind, sprich aktuell angezeigt werden.
Hoffe, das bringt etwas Licht ins Dunkle. Oder kann ich dir noch andere Infos geben?
hat vielleicht noch jemand
am 06.03.2016 - 20:14 Uhr
hat vielleicht noch jemand eine Idee zu diesem Fall?
vielleicht probierst du doch
am 07.03.2016 - 06:11 Uhr
vielleicht probierst du doch mal views_selective_filters ohne exposed filter und dein termplate und nimmst slider fields
das Problem ist, dass ich
am 30.03.2016 - 16:10 Uhr
das Problem ist, dass ich schon online bin und viele Inhalte erstellt habe. Den Feldtyp kann man ja nicht ohne weiteres umstellen, wenn schon Inhalte erstellt sind, oder?
Und weißt du zufällig, ob man sich die Min/Max-Werte mit "Slider fields" aus der Datenbank ziehen kann (also das, was ich aktuell mit meinem Template mache)?
Danke!
Hallo, das musst Du mit JSON
am 30.03.2016 - 16:44 Uhr
Hallo,
das musst Du mit JSON / Ajax machen.
Der Slider wird im Browser bewegt (onchange Event), dann fragst Du per Ajax Request die entsprechenden Werte vom Server ab.
Anders wird es kaum gehen.
MfG
Robert
Ich habe das Thema immer noch
am 25.05.2016 - 15:50 Uhr
Ich habe das Thema immer noch nicht lösen können. Der Maintainer von Better Exposed Filter schreibt, dass das über diesen Code funktionieren sollte:
<?php
function newbusiness_better_exposed_filters_settings_alter(&$settings, $context) {
$query = 'SELECT MIN(field_einwohnerzahl1_value) as minval, MAX(field_einwohnerzahl1_value) AS maxval
FROM {field_data_field_einwohnerzahl1} AS base';
$current_filter_settings = $context['view']->exposed_input;
$field_name = 'field_einwohnerzahl1_value';
$value = array();
if (isset($current_filter_settings[$field_name])) {
// Table name is similar to the field name.
$table = 'field_data_field_einwohnerzahl1' . substr($field_name, 0, -6);
// Join the filter table to the query.
$query .= " JOIN {$table} AS $table ON base.entity_id = $table.entity_id";
// This is a multi-value filter so the value comes as an array.
$query .= " WHERE $table.$field_name IN (:value)";
// Pass the value of the filter to the query.
$value = array(':value' => $current_filter_settings[$field_name]);
}
$query = db_query($query, $value);
$result = $query->fetch();
$settings['field_einwohnerzahl1_value']['slider_options']['bef_slider_min'] = $result->minval;
$settings['field_einwohnerzahl1_value']['slider_options']['bef_slider_max'] = $result->maxval;
}
?>
Hier ist der Original-Issue zu finden. Laut Maintainer habe ich einen Fehler drin, den ich nicht ganz nachvollziehen kann. Er schreibt:
In looking in it quickly, $table doesn't look right. It should end up as field_data_field_einwohnerzahl1 but it looks like you're getting an extra field_einwohnerzahl1 in there.
Ich habe als $table die Feldtabelle genommen, aus der die Werte für den Exposed Filter Slider gezogen werden. Gibt es noch eine andere Tabelle, die ich stattdessen nehmen muss (der Maintainer schreibt vom "Filter Table", diese Tabelle finde ich aber nicht)?
Müsste der Ansatz, den der Maintainer beschreibt, eurer Ansicht nach funktionieren?
Danke und Gruß
Thomas
Hi, ich gehe davon aus dass
am 25.05.2016 - 16:34 Uhr
Hi,
ich gehe davon aus dass es sich hier um einen Typo handelt.
In looking in it quickly, $table doesn't look right. It should end up as field_data_field_einwohnerzahl1 but it looks like you're getting an extra field_einwohnerzahl1 in there.
Ich denke er meint:
In looking in it quickly, $table doesn't look right. It should end up as field_data_field_einwohnerzahl but it looks like you're getting an extra field_einwohnerzahl1 in there.
Du hast evtl. zwei gleiche Feldnamen in Deiner DB:
extra field_einwohnerzahl1
und
extra field_einwohnerzahl
Kann das sein?
MfG
Robert
Hey...nein daran liegt es
am 27.05.2016 - 07:36 Uhr
Hey...nein daran liegt es nicht. Mein Feld, auf das sich der Filter bezieht heißt field_einwohnerzahl1. Und die Tabelle heißt field_data_field_einwohnerzahl1. Der Maintainer hat in dem Issue einen Sample-Code gepostet, den ich anscheinend nur noch auf meinen Fall anpassen brauche.
Durch den Code werden z. B. die Min und Max-Werte richtig im Slider-Filter angezeigt. Nur das eigentliche Problem, dass sich die Werte nicht anpassen, sobald man an einem anderen Filter etwas ändern, funktioniert nicht. Wie gesagt, es sollten immer die Min-Max-Werte von den aktuell (also je nachdem wie die Filter gesetzt sind) angezeigten Nodes im Slider-Filter erscheinen.
Hallo Thomas, in Deinem
am 28.05.2016 - 11:40 Uhr
Hallo Thomas,
in Deinem Hook
newbusiness_better_exposed_filters_settings_alter(&$settings, $context)
werden die Einstellungen der anderen Filter nicht auch in $settings weitergegeben?
Dann benutzt Du evtl. den falschen Hook.
Schau mal hier wie Du noch auf die exposed Filter Forms in Views zugreifen kannst:
http://drupal.stackexchange.com/questions/23384/using-hook-form-alter-on-exposed-view-filters-on-drupal-7
MfG
Robert