it-swarm.com.de

Filtern Sie zwischen dem ersten und dem letzten Tag des aktuellen Monats in einem beliebigen Jahr

Ich habe ein Datumsfeld in meiner Ansicht und wenn ich versuche, zwischen dem first Und dem last Tag des Monats zu filtern, wird in meiner Ansichtsvorschau kein Ergebnis angezeigt .

Hier sind meine Einstellungen. Dieser Filter ist, weil ich das Geburtsdatum aller registrierten Benutzer vergleichen und nur diejenigen drucken muss, die den Wert zwischen dem ersten und dem letzten Tag des Monats haben.

Hier sind die Screenshots meiner Ansichtseinstellungen:

Hier sind zuerst meine Datumsfeldeinstellungen:

(enter image description here

Dann die Filtereinstellungen:

(enter image description here

Und schließlich stellen Sie die Filteroption ein, um das Ergebnis zwischen dem ersten und dem letzten Tag des Monats zu erhalten:

(enter image description here

Das habe ich bisher erfolglos versucht. Kann mir jemand dabei helfen? Ich möchte dafür kein Modul verwenden. Ich brauche nur diesen Filter funktioniert.

7
martinezjc

Ich hatte vor einiger Zeit eine ähnliche Anforderung. Ich habe ein kleines Modul mit einem hook_views_query_alter () erstellt. Sie müssen ein bisschen Code schreiben, aber ich denke, es ist eleganter und einfacher zu pflegen als das Hinzufügen von PHP Code in Kontextfiltern in der Benutzeroberfläche der Ansichten).

Versuche Folgendes:

In Ihrer .module-Datei

function MODULE_views_api() {
  return array(
    'api' => 3,
  );
}

In module.views.inc

//make sure you use your date field table and field name bellow
function MODULE_views_query_alter(&$view, &$query) {
    if ($view->name == 'date_test') { // replace this with your view name

        //this line removes the year from your date field
        $formula = "DATE_FORMAT(field_data_field_date.field_date_value, '%m-%d')";

        //join the field table
        $join = new views_join();
        $join->table = 'field_data_field_date';
        $join->field = 'entity_id';
        $join->left_table = 'node';
        $join->left_field = 'nid';
        $join->type = 'left';

        //add the join the the view query
        $query->add_relationship('field_data_field_date', $join, 'node');

        $first = date('m-d', strtotime('first day of this month'));
        $last = date('m-d', strtotime('last day of this month'));

        //add the field without the year
        $query->add_field(NULL, $formula, 'date_no_year');

        //add the where clauses
        $query->add_where(0, "$formula >= '$first'", array(), 'formula');
        $query->add_where(0, "$formula <= '$last'", array(), 'formula');
    }
}
3
Stefan

Lange Rede, kurzer Sinn: Verwenden Sie Views Partial Date . Das Bild unten zeigt einige seiner Funktionen (klicken Sie auf das Bild, wenn Sie die Animation nicht sehen).

(enter image description here

Warum dies mit Views nicht möglich ist

Ansichten selbst können nur nix-Zeitstempel verarbeiten. Selbst wenn ein relatives Datum verwendet wird, verwendet der Datumsfilter von Views verwendet strotime () intern, um das relative Datum in einen Zeitstempel zu konvertieren, bevor die Filterbedingung zur Abfrage hinzugefügt wird.

Warum dies mit Datumsansichten nicht möglich ist

Date Views ist ein komplexes Tier, das eine Vielzahl von Funktionen für Datumsberechnungen bietet, einschließlich der Unterstützung mehrerer DB-Backends.
Theoretisch könnten Datumsansichten unvollständige Datumsangaben implementieren, aber da sie auch relative Datumsangaben und verschiedene Eingabe-Widgets (wie Datums-Popup) unterstützen, wäre die zusätzliche Validierung und Logik äußerst schwierig zu pflegen.

Was wir dagegen tun können

Zu diesem Zeitpunkt haben wir festgestellt, dass entweder ein zusätzliches Modul oder ein benutzerdefinierter Code in irgendeiner Form erforderlich ist.
Vor diesem Hintergrund habe ich Views Partial Date erstellt und werde diese Antwort in den folgenden Tagen erweitern, um den Ansatz zu beschreiben, den ich gewählt habe.

4
Fabian Iwand

Ok, versuch das mal.

  1. Kontextfilter "Knoten-ID" hinzufügen
  2. mehrere Werte zulassen
  3. fügen Sie diesen PHP-Code als Standardwert hinzu, wenn sich kein Filterwert in der URL befindet:

$results = db_query("SELECT entity_id FROM field_data_field_FIELDNAME 
WHERE DATE_FORMAT(field_FIELDNAME_value,'%m') = DATE_FORMAT(NOW(),'%m') 
AND entity_type = 'node' AND bundle = 'NODE_TYPE'");
$ids = array();
foreach ($results as $result) {
  $ids[] = $result->entity_id;
}
return implode(',',$ids);

Bezogen auf this .

1
Huelfe

Dieser Artikel wird Ihnen helfen ( der auch auf drupal.org ist ). Sobald Sie damit konfiguriert sind, können Sie den Inhalt zwischen genau zwei Daten filtern.

Sie müssen also ein Standardstartdatum als 1. eines bestimmten Monats und ein Enddatum als nächsten Monat - 1 hinzufügen.

Dies muss über die Standardeinstellungen der Ansichten erfolgen, oder Sie können kleines Javascript hinzufügen, das diesen bestimmten Feldern einen Standardwert hinzufügt.

1
user36960

warum machen Sie sie dazu, benutzerdefinierte Module dafür zu schreiben?

Dies ist ziemlich einfach für: First day of current month you need to add " erster Tag von " & for Last day of current month same way " letzter Tag von "

Lesen Sie die Dokumentation von PHP.NET sorgfältig durch.

Hier füge ich einen Screenshot des Datumsfilters meiner Ansicht für relative Daten hinzu. (enter image description here

0
Himanshu Pathak

Probieren Sie diese beiden Optionen aus:

erster Tag dieses Monats

letzter Tag dieses Monats

Wenn Sie diese Werte in dieser strtotime () -Tester eingeben, werden die entsprechenden Daten angegeben.

0
VanD

Die SQL-Syntax, die Sie erreichen möchten, ist mit der Funktion SQL MONTH () relativ einfach:

SELECT * 
FROM field_data_field_fecha_nacimiento 
WHERE MONTH(field_fecha_nacimiento_value) = 8; // August

Es gibt jedoch keine Möglichkeit für Views, diese Art von SQL-Ausdruck ohne ein zusätzliches Modul zu erstellen.

0
Les Lim

Ich habe dies nicht getestet, aber würde es nicht funktionieren, wenn Sie "Monat" als Granularität auswählen und dann ein einzelnes Datum (das relative "Jetzt" oder ein bestimmtes Datum) als Filterwert verwenden?

0
marcvangend