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

7

Ich habe ein Datumsfeld in meiner Ansicht und wenn ich versuche, zwischen dem ersten und dem letzten 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, deren Wert zwischen dem ersten und dem letzten Tag des Monats liegt.

Hier sind die Screenshots meiner Ansichtseinstellungen:

Hier sind zuerst meine Datumsfeldeinstellungen:

Geben Sie hier die Bildbeschreibung ein

Dann die Filtereinstellungen:

Geben Sie hier die Bildbeschreibung ein

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

Geben Sie hier die Bildbeschreibung ein

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.

martinezjc
quelle
1
Versuchen Sie "erster Tag dieses Monats" und "letzter Tag dieses Monats".
Huelfe
Es tut mir leid, ich habe es auch versucht und keinen Erfolg :(
martinezjc
Versuchen Sie "erster Tag des letzten Monats" und "letzter Tag des letzten Monats"
Prerit Mohan
warum letzten Monat?
martinezjc
1
Und darin liegt das Problem. Ich würde gerne eine gute Antwort auf diese Frage sehen und werde zu gegebener Zeit ein Kopfgeld anbieten.
J. Reynolds

Antworten:

3

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 warten, als PHP-Code in Kontextfiltern in der Benutzeroberfläche der Ansichten hinzuzufügen.

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');
    }
}
Stefan
quelle
Obwohl die hier vorgeschlagene Lösung Ihnen das gewünschte Verhalten verleiht, denke ich, dass das, was @marcvangend vorgeschlagen hat, für Ihren Fall besser ist (wenn es funktioniert ... ich, wenn Sie neben der Anzeige aller Geburtstage im aktuellen Monat keine andere Logik benötigen nicht getestet). Meine Lösung ist Teil einer etwas komplexeren Lösung, bei der ich mich mit einigen Sonderfällen befassen musste. Denken Sie also daran, dass es zwar etwas flexibler ist, aber auch ein bisschen "übertrieben" für das, was Sie brauchen.
Stefan
Und weil ich es geschafft habe, die Antwort zu finden, die mir anfangs geholfen hat, als ich dieses Problem hatte, denke ich, dass es fair für mich wäre, @Peter Lozovitskiy für drupal.stackexchange.com/a/107396/1422
Stefan
Funktioniert perfekt und ist sehr elegant.
J. Reynolds
@Stefan Muss ich in meinem Fall eine Beziehung zur Knotentabelle hinzufügen? Ich meine, da ich nur Benutzerdaten auflisten möchte?
Martinezjc
Süß, mir ist klar, dass ich mich mit der Benutzertabelle verbinden musste. Ich werde die Antwort bearbeiten, um jemand anderem zu helfen
martinezjc
4

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).

Geben Sie hier die Bildbeschreibung ein

Warum geht das mit Views nicht?

Ansichten selbst können nur Unix-Zeitstempel verarbeiten . Selbst wenn ein relatives Datum verwendet wird, verwendet der Datumsfilter von Views intern strotime () , 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 können wir dagegen tun?

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 das Teildatum "Ansichten" erstellt und werde diese Antwort in den folgenden Tagen erweitern, um den Ansatz zu beschreiben, den ich gewählt habe.

Fabian Iwand
quelle
@martinezjc Um Grenzwerte für den Bereich festzulegen, sollten Sie auf jeden Fall auf das Geburtstagsdatum zugreifen, um das Jahr kennenzulernen. Ohne Modul- oder Codeänderungen ist dies nicht möglich.
Maciek
Wo kann ich dieses Sandbox-Projekt herunterladen?
Martinezjc
@martinezjc: Es wurde im obigen Text zweimal verlinkt. Klicken Sie einfach auf den Link "Teildatum anzeigen".
Fabian Iwand
@ciss Hatte gerade die Gelegenheit, es jetzt zu nutzen und es zu lieben!
J. Reynolds
@ J. Reynolds Danke! Es gibt auch einen Patch für relative Teildaten
Fabian Iwand
1

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);

Im Zusammenhang damit .

Huelfe
quelle
1
Ich kann bestätigen, dass dies funktioniert. Man muss das PHP-Modul "Ansichten" verwenden und "Mehrere Werte zulassen" für die NID auf "Wahr" setzen.
J. Reynolds
1

Dieser Artikel wird Ihnen helfen ( der auch auf drupal.org zu finden 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 es kann ein kleines Javascript hinzugefügt werden, das diesen bestimmten Feldern einen Standardwert hinzufügt.


quelle
Wenn Sie die Fragen und Kommentare von OP sorgfältig lesen, werden Sie feststellen, dass alle Daten, die in einen bestimmten Monat fallen, unabhängig vom Jahr des Datums gefiltert werden müssen. Die Ansichten sollten sich also den Monat jetzt = Oktober ansehen und alle Daten zurückgeben, die den Oktober enthalten, unabhängig vom Jahr.
J. Reynolds
Dies ist ein defekter Link :(
Martinezjc
0

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.

Les Lim
quelle
1
Vielleicht ein benutzerdefinierter Views Filter Handler?
J. Reynolds
@ J.Reynolds Sicher, aber das würde noch ein benutzerdefiniertes Modul erfordern. ;)
Fabian Iwand
1
Es werden 250 Reputationspunkte angeboten. Wenn Sie einen Views Filter Handler veröffentlichen, gehören die Punkte definitiv Ihnen.
J. Reynolds
@ J.Reynolds bro kein benutzerdefiniertes Modul dafür. Überprüfen Sie die Lösung unten
Himanshu Pathak
0

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?

Marcvangend
quelle
1
Ich muss hier zustimmen. "zwischen dem ersten und dem letzten Tag des Monats" entspricht "im Monat". Keine Notwendigkeit für Tage ...
anou
0

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. Geben Sie hier die Bildbeschreibung ein

Himanshu Pathak
quelle
Diese Antwort filtert nur nach Datumsangaben im aktuellen Monat für das aktuelle Jahr, nicht nach dem aktuellen Monat in einem Jahr. Wie @ciss hervorhob, gibt es keine Möglichkeit, dies ohne benutzerdefinierten Code zu tun.
J. Reynolds