Suche nach Alter in Jahren
am 11.01.2011 - 14:58 Uhr in
Hallo Gruppe,
ich setze folgende Module ein:
Core 6.20
Content Construction Kit (CCK) 6.x-3.x-dev (2011-Jan-05)
Date 6.x-2.7
Views 6.x-3.x-dev (2011-Jan-05)
Views Custom Field 6.x-1.0
Mit "Views Custom Field" berechne ich das Alter in Jahren und zeige dies auch an. Das Geburtstag erfasse ich in einem CCK-Feld, die angelegten Personen sind "einfach nur" Nodes, also keine Drupal Benutzer.
Nun möchte ich mit den Views-Filtern (hervorgehobene Filter) nach dem Alter suchen, aktuell klappt das nur mit der Eingabe des Geburtstages (Granularität ist aktuell Jahr und Monat). Ich möchte aber nach dem Alter suchen, also von 30 bis 34 Jahre.
Wie kann ich das bewerkstelligen, ich habe vom "Birthday" Modul gelesen, das lässt sich aber nur in Verbindung mit Benutzern verwenden, soweit ich das verstanden habe, oder lässt sich das auch mit CCK einbinden und als Filterfeld verwenden.
Für Hinweise auf Module oder die Art der Vorgehensweise bin ich sehr dankbar!
Stefan
- Anmelden oder Registrieren um Kommentare zu schreiben
Computed Field
am 11.01.2011 - 21:51 Uhr
Du könntest ein verstecktes Feld mit Computed Field machen, das speichert die Ergebnisse in der Datenbank und dann hast Du mit Views Zugriff darauf.
Bei den Filtern ist das dann unter Inhalt: Feld Alter zu finden.
Hi, danke für die info, komme
am 12.01.2011 - 09:44 Uhr
Hi,
danke für die info, komme gerade nicht auf die Installation, daher die Frage:
Wenn das die Info in die Datenbank speichert, ist das dann auch dynamisch?
Ein Alter ändert sich ja jährlich ;-)
Muss ich ein Script (Cron) zur Aktualisierung der info laufen lassen?
Besten Dank
Stefan
Stefan
http://media36.de
Da hast Du allerdings Recht,
am 12.01.2011 - 12:41 Uhr
Da hast Du allerdings Recht, daran habe ich gar nicht gedacht. Aber mit einem Script, das täglich einmal den Node aktualisiert, müsste das dann auch klappen.
Habe eben das Modul
am 12.01.2011 - 13:04 Uhr
Habe eben das Modul "dynamicfield" entdeckt und versuche mich nun damit.
Das erzeugt die berechnung dynamisch.
Mal sehen, ob das klappt, werde das dann hier entsprechend posten!
Ciao
Stefan
Stefan
http://media36.de
Hallo Stefan, falls Du damit
am 12.01.2011 - 13:07 Uhr
Hallo Stefan,
falls Du damit Erfolg hast, gib hier bitte noch ein kurzes Feedback. Genau das selbe muss ich in Kürze auch umsetzen.
Danke und Gruß
Matthias
Drupal rockt!!!
Hallo Matthias und
am 12.01.2011 - 14:48 Uhr
Hallo Matthias und Interessierte,
folgendes problem stellt sich mir gerade dar.
Je nach Suche verändert Views den key des Arrays für die Ausgabe der Daten.
In der Node-Darstellung sehe ich den Eintrag in folgender Form:
[field_xx_geburtstag1] => Array ( [0] => Array ( [value] => 1226444400
Somit kann ich den Wert mit (( $node->field_xx_geburtstag1[0][value]; )) abfragen.
In Views findet Drupal den Wert nicht, denn dort sieht das so aus:
[node_data_field_xx_geburtstag1_field_xx_geburtstag1_value] => 1226444400
Die Abfrage der Werte sollte in Views dann folgendermaßen aussehn:
$data->node_data_field_xx_geburtstag1_field_xx_geburtstag1_value
Witzig wird es, wenn ich eine Filterung verwende z.B. den Vornamen, dann sieht das so aus:
[node_data_field_xx_vorname_field_xx_geburtstag1_value] => 1226444400
So, nun bin ich mit meinem Latein am Ende. Denn wenn ich nun den Wert abfragen will, aber noch ca. 10 Suchkriterien dazu habe, muss ich 10 Abfragen amchen, wo denn nun mein Datumsfeld eingetragen ist.
Gibt es eine Möglichkeit Views Beine zu machen und die Werte drupallike abzurufen?
Der nächste Punkt folgt, nämlich das Filtern nach Alter ... sieht aktuell nicht gut aus :-( Ich bleibe aber drann!
Stefan
EDIT::
Also in folgender Form:
$node->field_xx_geburtstag1[0][value];
Stefan
http://media36.de
Hallo Stefan, hmmm - hast Du
am 12.01.2011 - 14:52 Uhr
Hallo Stefan,
hmmm - hast Du mal versucht in "$static" anstatt in "$data" zu schauen ob dort vielleicht der Wert für Geburtstag "fest/statisch" ausgegeben werden kann - uach wenn man filtert?
Gruß Matthias
Drupal rockt!!!
$static höre ich leider zum
am 12.01.2011 - 14:59 Uhr
$static höre ich leider zum ersten Mal.
Bin nicht so tief drinn!
Wie kann ich auf $static zugreifen, bzw. wie gehe ich damit um?
Stefan
http://media36.de
Anstatt $data->node_data_fiel
am 12.01.2011 - 15:03 Uhr
Anstatt
$data->node_data_field_xx_geburtstag1_bla
$static->$data->node_data_field_xx_geburtstag1_bla
Eventuell die Ausgabe mal mit Devel testen/anschauen.
Wenn man z.B. Views Custom-Field verwendet, steht darunter
Available variables:
$data: contains the retrieved record from the database (e.g. $data->nid).
$static: can be used to store reusable data per row.
Weiß leider nicht ob das zum Erfolg führt, nur so eine Idee von mir.
Gruß Matthias
Drupal rockt!!!
Ne - scheint leider doch
am 12.01.2011 - 15:10 Uhr
Ne - scheint leider doch nicht zu klappen - wenn ich bei mir die static-variable ausgebe, erhalte ich NULL.
Grübel.
Drupal rockt!!!
Das klappt leider so
am 12.01.2011 - 16:16 Uhr
Das klappt leider so nicht.
$static scheint nur für Custom-Field direkt in Views zu funktionieren.
Also neuer Ansatz.
Anmerkung:
... das müssen doch noch mehr benötigen? Ich finde viele Fragen dazu, aber keine Antworten.
Leider bin ich nicht in der Lage ein modul zu schreiben, denke aber das würden sehr viele einsetzen.
Stefan
http://media36.de
Ein Aktualisiernen fällt weg,
am 12.01.2011 - 16:17 Uhr
Ein Aktualisiernen fällt weg, da ich das Aktualisierungsdatum als Information benötige, nämlich wann die Daten zuletzt aktualisiert wurden.
Ferner sind aktuell 1.000 Nodes verfügbar und es werden viele mehr sein ...
Stefan
http://media36.de
Mit Dynamic Field kann das
am 12.01.2011 - 18:23 Uhr
Mit Dynamic Field kann das nicht klappen, da wird der Wert immer beim ansehen des Nodes berechnet. Darum klappt es bei der Node Darstellung, aber nicht bei Views, das erwartet nämlich einen Datenbankeintrag.
Computed Field macht genau das, damit kann man dann auch in Views danach filtern.
Mit der Aktualisierung beim Geburtstag muss ich mir aber auch noch etwas einfallen lassen.
Auf www.mondscheinengel.de haben ich eine Demoseite eingerichtet, einloggen mit demo/demo, dann auf Benutzer suchen.
So, jetzt doch nochmal ganz
am 12.01.2011 - 22:07 Uhr
So, jetzt doch nochmal ganz anders:
Ich habe mir jetzt ein CCK Feld mit Dynamic Field gemacht, dort wird das Alter bei jedem Node-Aufruf berechnet, und dann auch in die Datenbank gespeichert.
Und noch zusätzlich ein Computed Field für Views.
So ist das Alter dann im Node sichtbar und auch für Views als Filter.
Feld alter ist das Computed Feld, alter2 das Dynamic Feld. Wenn nun der Node aufgerufen wird, errechnet Dynamic das Alter, und speichert es dann auch in das Computed Feld, von wo es dann mit Views
ausgelesen werden kann.
Hier der Code für das CCK Dynamic Feld:
$output ="";
$gebdat = $node->field_geburtsdatum[0]['value'];
$gebjahr = date(Y,$gebdat);
$gebmon = date(n,$gebdat);
$gebtag = date(j,$gebdat);
$year_diff = date("Y") - $gebjahr;
$month_diff = date("m") - $gebmon;
$day_diff = date("d") - $gebtag;
if ($month_diff < 0)
$year_diff--;
elseif ($month_diff == 0 && $day_diff < 0)
$year_diff--;
if ($gebdat == "")
{
$year_diff = 0;
}
$uid_temp = arg(1);
$nid = db_result(db_query("SELECT nid FROM node WHERE (node.type in ('uprofile')) AND (uid = '$uid_temp')"));
db_query("UPDATE content_type_uprofile SET field_alter_value='$year_diff' WHERE nid = '$nid'");
$output.=$year_diff." Jahre ";
return $output;
Und im Computed Field:
$node_field[0]['value'] = "";
$output ="";
$gebdat = $node->field_geburtsdatum[0]['value'];
$gebjahr = date(Y,$gebdat);
$gebmon = date(n,$gebdat);
$gebtag = date(j,$gebdat);
$year_diff = date("Y") - $gebjahr;
$month_diff = date("m") - $gebmon;
$day_diff = date("d") - $gebtag;
if ($month_diff < 0)
$year_diff--;
elseif ($month_diff == 0 && $day_diff < 0)
$year_diff--;
if ($gebdat == "")
{
$year_diff = 0;
}
$node_field[0]['value'] = $year_diff;
Damit bleibt es dann auch nach dem Geburtstag immer aktuell.
Noch keine Funktion. Hi,
am 13.01.2011 - 12:27 Uhr
Noch keine Funktion.
Hi, Danke erstmal für den guten Ansatz, leider funktioniert das bei mir nicht. Das Alter wird nur beim Speichern des Nodes eingetragen.
Ich versuche mich noch weiter um eine Lösung zu finden.
Sobald das klappt gebe ich hier Bescheid.
Ciao
Stefan
Stefan
http://media36.de
Hast Du den Code auch für
am 13.01.2011 - 12:50 Uhr
Hast Du den Code auch für Deine Felder angepasst, die heissen ja wahrscheinlich nicht genauso wie bei mir?
Auch der Nodetype ist wichtig, bei mir ist das 'uprofile'.
Möglicherweise liegt es auch an dem Argument, kommt auf die URL deiner Seite an, also den Teil nach www.Deineseite.de/
Klar doch ;-) Ich hoffe ich
am 13.01.2011 - 12:49 Uhr
Klar doch ;-)
Ich hoffe ich bin dem auf der Spur. Mit Devel und phpMyAdmin kämpfe ich gerade um eine Lösung.
Stefan
http://media36.de
So, nun wird es
am 13.01.2011 - 14:01 Uhr
So, nun wird es interessant.
Bei mir stellt sich das folgendermaßen dar, alter2 wird richtig angezeigt. alter bleibt leer, auch wenn ich mehrmals reload klicke und die Views-Ansicht anzeigen lasse.
Erst wenn ich die Einstellungen zu feld "alter" erneut speichere werden die Nodes, die ich angeschaut habe aktualisiert.
Mein - etwas modifizierter Code, da ich andere Datumsfelder verwendet habe.
Feld "alter", berechnetes Feld
$gebdat = $node->field_geburtstag[0][value];
$datumtmp2 = explode('T', $gebdat);
$datum = $datumtmp2[0];
$gebdat = explode('-', $datum);
$gebjahr = $gebdat[0];
$gebmon = $gebdat[1];
$gebtag = $gebdat[2];
$TSgebdatum = mktime(0, 0, 0, $gebmon, $gebtag, $gebjahr);
$TSjetzt = time();
$TSdifferenz = $TSjetzt-$TSgebdatum;
$TSalter = $TSdifferenz/31536000;
$TSalter = intval($TSalter);
$node_field[0]['value'] = $TSalter;
Feld "alter2"
$gebdat = $node->field_geburtstag[0][value];
$datumtmp2 = explode('T', $gebdat);
$datum = $datumtmp2[0];
$gebdat = explode('-', $datum);
$gebjahr = $gebdat[0];
$gebmon = $gebdat[1];
$gebtag = $gebdat[2];
$TSgebdatum = mktime(0, 0, 0, $gebmon, $gebtag, $gebjahr);
$TSjetzt = time();
$TSdifferenz = $TSjetzt-$TSgebdatum;
$TSalter = $TSdifferenz/31536000;
$TSalter = intval($TSalter);
$uid_temp = arg(1);
//$nid = db_result(db_query("SELECT nid FROM node WHERE (node.type in('model')) AND (uid = '$uid_temp')"));
db_query("UPDATE content_type_model SET field_alter_value='$TSalter' WHERE nid = '$uid_temp'");
return $TSalter." ".$uid_temp;
Das ." ".$uid_temp habe ich zum testen angehängt.
EDIT:::::::::
Auch wenn ich den node speichere werden dei richtigen Alterswerte eingetragen.
Stefan
http://media36.de
[Gelöst] Alter in Jahren für Berechnung und Anzeige
am 13.01.2011 - 15:29 Uhr
Hallo,
hier meine Lösung zum Thema "DRUPAL - Alter in Jahren für Suche / Filterung in Views"
Abweichend zu den oben genannten Lösungen verwende ichhier keinen UNIX-Timestamp, sonder das Datumsfeld mit Datumseingabe.
Die Feldnamen und Nodebezeichnungen müssen selbstverständlich angepasst werden. Für Schäden oder sonstige Probleme mit dem Code übernehme ich keine Haftung!
Folgende Felder werden benötigt:
Im Node (in meinem Fall "model") 2 cck Felder
alter = Berechnet (Computed Field)
alter2 = Dynamisch (Dynamic Field)
alter
$gebdat = $node->field_geburtstag[0][value];
$datumtmp2 = explode('T', $gebdat);
$datum = $datumtmp2[0];
$gebdat = explode('-', $datum);
$gebjahr = $gebdat[0];
$gebmon = $gebdat[1];
$gebtag = $gebdat[2];
$TSgebdatum = mktime(0, 0, 0, $gebmon, $gebtag, $gebjahr);
$TSjetzt = time();
$TSdifferenz = $TSjetzt-$TSgebdatum;
$TSalter = $TSdifferenz/31536000;
$TSalter = intval($TSalter);
$node_field[0]['value'] = $TSalter;
Anzeigeformat bleibt wie es eingetragen ist.
Datentyp = int
alter2
$gebdat = $node->field_geburtstag[0][value];
$datumtmp2 = explode('T', $gebdat);
$datum = $datumtmp2[0];
$gebdat = explode('-', $datum);
$gebjahr = $gebdat[0];
$gebmon = $gebdat[1];
$gebtag = $gebdat[2];
$TSgebdatum = mktime(0, 0, 0, $gebmon, $gebtag, $gebjahr);
$TSjetzt = time();
$TSdifferenz = $TSjetzt-$TSgebdatum;
$TSalter = $TSdifferenz/31536000;
$TSalter = intval($TSalter);
$uid_temp = arg(1);
db_query("UPDATE content_type_model SET field_alter_value='$TSalter' WHERE nid = '$uid_temp'");
return $TSalter;
In Views legt ihr eine Seite an die alle Nodes auflistet.
Dazu ein Feld "Costumfield" mit folgendem Code: (ich habe mal die Hilfsausgabe nur auskommentiert, die zeigen euch die Arrays an, in denen die Werte stehen! Immer nur eines auskommentieren, sonst wird es knifflig.
<?php
/* print "<pre>".var_export($data, TRUE)."</pre>"; */
/*
print "<pre>";
print_r($data);
print "</pre>";
*/
if (isset($data->node_data_field_vorname_field_geburtstag_value)) {
$bday_array = unserialize($data->node_data_field_vorname_field_geburtstag_value);
$datumtmp = $data->node_data_field_vorname_field_geburtstag_value;
} elseif (isset($data->node_data_field_model_lfdnr_field_geburtstag_value)) {
$bday_array = unserialize($data->node_data_field_model_lfdnr_field_geburtstag_value);
$datumtmp = $data->node_data_field_model_lfdnr_field_geburtstag_value;
} elseif (isset($data->node_data_field_nachname_field_geburtstag_value)) {
$bday_array = unserialize($data->node_data_field_nachname_field_geburtstag_value);
$datumtmp = $data->node_data_field_nachname_field_geburtstag_value;
} elseif (isset($data->node_data_field_alter_field_geburtstag_value)) {
$bday_array = unserialize($data->node_data_field_alter_field_geburtstag_value);
$datumtmp = $data->node_data_field_alter_field_geburtstag_value;
}
$datumtmp2 = explode('T', $datumtmp);
$datum = $datumtmp2[0];
$akt_jahr = date('Y');
$akt_monat = date('m');
$akt_tag = date('d');
$gebdat = explode('-', $datum);
$geb_jahr = $gebdat[0];
$geb_monat = $gebdat[1];
$geb_tag = $gebdat[2];
$jahr = $gebdat[0];
$monat = $gebdat[1];
$tag = $gebdat[2];
$time = mktime(0,0,0,date("m"),date("d"),date("Y"));
$birthday = mktime(0,0,0,$monat,$tag,$jahr);
$alter = intval(($time - $birthday) / (3600 * 24 * 365));
if ($alter == 1) {
$bez = "Jahr";
} else {
$bez = "Jahre";
}
$uid_temp = $data->nid;
db_query("UPDATE content_type_model SET field_alter_value='$alter' WHERE nid = '$uid_temp'");
print $alter." ".$bez;
?>
Diesen Code könnt ihr auch zum Anzeigen der Werte in eurer Views Abfrag verwenden. Ich habe der Views Seite einen Pfad gegeben und rufe diesen mittels eines Cron-Jobs und Lynx auf dem Server auf.
Nun nur noch zwei Filter einbauen, wenn ihr das Alter zwischen zwei Werten wollt. Einmal gleich und größer und einmal gleich und kleiner. Daher muss das Feld in "alter" int sein, sonst geht das natürlich nicht numerisch.
Soweit klappt das bei mir sehr gut.
Die if-Abfragen benötigt man, wenn man mehrere Exposed Filter verwendet, warum das so ist erschließt sich mir nicht, macht mal so keinen Sinn. Evtl. kann man die Werte auch anders auslesen, mit Alias klappt das nicht, leider.
Danke an Sammelzwerg! an den Rest viel Erfolg beim Basteln!
Sers Stefan
Stefan
http://media36.de