{gelöst} PHP-Frage: View_Customfield -> Alter aus Geburtstag berechnen!

am 01.10.2010 - 19:28 Uhr in
Hallo Freunde,
ich komme im Moment nicht alleine weiter daher möchte ich um Hilfe bitten. Meine PHP-Kentnisse reichen nicht aus.
Ausgangslage:
Ein Date-CCK-Feld wird mit dem Geburtstag gefüllt. Mit Views-Customfield soll aus diesem Geburtstag das Alter berechnet werden.
Das Date-Feld im View heißt "node_data_field_1_augenfarbe_field_1_geburtstag_value". Gebe ich dieses Feld über <?php dsm($data->node_data_field_1_augenfarbe_field_1_geburtstag_value); ?>
aus -
erhalte ich ....
1978-01-18T00:00:00
Folgenden Code - zum Berechnen des Alters - von http://drupal.org/node/149237#comment-3328412 - nutze ich nun im View-Customfield.
<?php
// get the profile dob value into an array
$bday_array = unserialize($data->node_data_field_1_augenfarbe_field_1_geburtstag_value);
//compute age
$bdayunix = mktime(0, 0, 0, $bday_array['month'], $bday_array['day'], $bday_array['year']);
$nowunix = time();
$unixage = $nowunix - $bdayunix;
$age = floor($unixage/ (365 * 24 * 60 * 60));
print $age;
?>
Ich bekomme aber leider nur als Ausgabe "10" (zehn) - da muss also irgendwo ein Fehler drin sein - ich weiß aber überhaupt nicht wo ich ansetzen bzw. was anpassen muss.
Ich dachte es liegt an der Unixtime (nutze XAMPP auf einem Windows-Rechner) aber auch das Testen auf einem richtigen Server brachte nur "10" hervor.
Ich habe keinen Plan was ich falsch mache, wäre von Euch jemand so nett und könnte mir auf die Sprünge helfen?
Danke schonmal im Voraus
Gruß Matthias
- Anmelden oder Registrieren um Kommentare zu schreiben
Probier mal das: <?php$output
am 01.10.2010 - 20:02 Uhr
Probier mal das:
<?php
$output ="";
$gebdat = $data->node_data_field_1_augenfarbe_field_1_geburtstag_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--;
$output.=$year_diff." Jahre ";
print $output;
?>
Hallo Sammelzwerg, danke für
am 01.10.2010 - 20:07 Uhr
Hallo Sammelzwerg,
danke für den Code aber der gibt mir "40 Jahre" zurück - korrekt wären 32 Jahre!
Ich habe noch folgenden Code gefunden.
<?php
$year_diff = date("Y") - ($data->node_data_field_1_geburtstag_field_1_geburtstag_value);
$month_diff = date("m") - ($data->node_data_field_1_geburtstag_field_1_geburtstag_value);
$day_diff = date("d") - ($data->node_data_field_1_geburtstag_field_1_geburtstag_value);
if ($month_diff < 0)
$year_diff--;
elseif ($month_diff == 0 && $day_diff < 0)
$year_diff--;
print 'Age: ' . $year_diff;
?>
Damit werden mir aber 31 Jahre ausgegeben - wenn ich das Datum des Geburtstages ändere - fehlt immer ein Jahr - 20 Jahre anstatt 21 Jahre - 45 Jahre anstatt 46 usw ...
Grübel!
Das gibt bei mir dann
am 01.10.2010 - 20:18 Uhr
Das gibt bei mir dann -77495191 Jahre :-)
Aber Du kannst ja bei Deinem Code einfach immer 1 dazuzählen.
PS. Ist es eigentlich Absicht, daß das Feld in der zweiten Variante anders heißt?
Hmmm ... nutzt Du Computed
am 01.10.2010 - 20:25 Uhr
Hmmm ... nutzt Du Computed Field oder Views_Customfield? Zwischen 31 Jahren und -77495191 Jahren ist ja ein recht großer Unterschied ;-)
Sehr eigenartig. Verstehe ich ehrlich gesagt nicht.
Tja - man könnte natürlich "1" dazuzählen aber leider weiß ich nicht wie man das im Code einfügen müsste und vor Allem weiß ich auch nicht ob diese Schreibweise auch für die nächsten Jahre korrekte Ausgaben macht.
Da fehlt ja ein Jahr (warum auch immer) - da ist also eine Fehlerquelle vorhanden - wenn ich das Alter mit dem Code berechne, könnte es in einigen Jahren vorkommen (warum auch immer), dass noch mehr Jahre "verschluckt" werden - da fehlen dann 2 Jahre usw.
Ich hab im Moment keinen Plan!
PS. Ist es eigentlich Absicht, daß das Feld in der zweiten Variante anders heißt?
Ich habe mein Drupal einmal unter XAMPP laufen und eine "frische" Installation zum Testen auf dem "richtigen" Webserver (da heißen die Felder etwas anders) - ich hatte jetzt den Code vom Webserver kopiert.
Ich verstehe es auch nicht,
am 01.10.2010 - 20:37 Uhr
Ich verstehe es auch nicht, es ist views_Customfield, da sollte das ja eigentlich gehen. Das ist aber nur ein Experiment.
Eigentlich habe ich für die Altersanzeige ein cck Dynamic Field für das Profil, das wird immer beim Nodeaufruf neu berechnet, und für die Benutzerliste dann CCK Computed Field, weil Views ein Datenbankfeld braucht.
Ich suche aber noch nach einer Möglichkeit, das Computed Field automatisch zu aktualisieren, das wird sonst nur bei Nodeerstellung oder Änderung neu berechnet.
Bei Deinem ersten Code, ist das Geburtstagfeld in der View vor dem Customfield oder danach?
Zitat: Bei Deinem ersten
am 01.10.2010 - 20:42 Uhr
Bei Deinem ersten Code, ist das Geburtstagfeld in der View vor dem Customfield oder danach?
Vorm Customfield ....
Da ich immer noch keine
am 01.10.2010 - 21:43 Uhr
Da ich immer noch keine funktionierende Lösung gefunden habe, wollte ich nochmal den ersten Code ansprechen.
<?php
// get the profile dob value into an array
$bday_array = unserialize($data->node_data_field_1_augenfarbe_field_1_geburtstag_value);
//compute age
$bdayunix = mktime(0, 0, 0, $bday_array['month'], $bday_array['day'], $bday_array['year']);
$nowunix = time();
$unixage = $nowunix - $bdayunix;
$age = floor($unixage/ (365 * 24 * 60 * 60));
print $age;
?>
gibt mir "10" aus - ich vermute mal, dass hier erst beim Jahr 2000 angefangen wird zu zählen und somit 10 (bis 2010) ausgegeben wird. Beim Beispiel-Geburtsjahr 18.01.1978 - werden die Jahre von 1978 bis 2000 irgendwie "verschluckt" und nicht dazu gezählt.
Vielleicht ist auch das angegebene Format falsch. Die Datumsausgabe erfolgt nach folgendem Muster 1978-01-18T00:00:00 -> Jahr - Monat - Tag -> verarbeitet wird es über
$bdayunix = mktime(0, 0, 0, $bday_array['month'], $bday_array['day'], $bday_array['year']);
- vielleicht steckt dort der Fehler. ich sehe ihn leider nicht.Falls jemand wüsste warum das hier der Fall ist, würde ich mich über einen Tip freuen.
Danke und Gruß
Matthias
Neue Idee: <?php $bday =
am 01.10.2010 - 22:12 Uhr
Neue Idee:
<?php
$bday = $data->FELDNAME;
$alter = floor((date("Ymd") - date("Ymd", $bday)) / 10000);
print $alter;
?>
Oder:
<?php
$bday = $data->FELDNAME;
$nowunix = time();
$unixage = $nowunix - $bday;
$alter = floor($unixage/ (365 * 24 * 60 * 60));
print $alter;
?>
FELDNAME musst Du natürlich jeweils anpassen. In der Datenbank ist das Geburtsdatum höchstwahrscheinlich schon als Unix-Timestamp gespeichert, das muss glaub ich nicht umgewandelt werden.
Hoffentlich klappts jetzt, ich drück die Daumen.
Hallo Sammelzwerg, danke,
am 01.10.2010 - 22:40 Uhr
Hallo Sammelzwerg,
danke, dass Du Dir solche Mühe machst aber leider ergeben beide Code-Schnipsel immer nur "40"!!
Dann muss aber mit dem
am 01.10.2010 - 22:46 Uhr
Dann muss aber mit dem Feldnamen etwas nicht stimmen, ich kann die alle beide verwenden, und es wird korrekt angezeigt.
Mach doch mal einen neuen View, nur mit Geburtstagsfeld und ViewsCustomfield, ohne alle anderen felder.
40 kommt immer raus, wenn der Geburtstagstimestamp 0 ist
Daran habe ich auch schon
am 01.10.2010 - 23:01 Uhr
Daran habe ich auch schon gedacht aber die Feldangabe ist richtig.
Der Code (die zweite Variante von mir von oben)
<?php
$year_diff = date("Y") - ($data->node_data_field_1_geburtstag_field_1_geburtstag_value);
$month_diff = date("m") - ($data->node_data_field_1_geburtstag_field_1_geburtstag_value);
$day_diff = date("d") - ($data->node_data_field_1_geburtstag_field_1_geburtstag_value);
if ($month_diff < 0)
$year_diff--;
elseif ($month_diff == 0 && $day_diff < 0)
$year_diff--;
print 'Age: ' . $year_diff;
?>
gibt ja fast das richtige Alter aus (minus ein Jahr) - wenn ich jetzt das Datum im Node ändere (1977 statt 1978) ändert sich auch der Wert der Berechnung um ein Jahr - sprich - der Feldname liefert Werte aus die anschließend berechnet werden.
Es kann jetzt nur daran liegen, dass das Date-CCK-Feld das Datum falsch speichert und somit auch falsch ausliefert sodass der Code von Dir mit dem Format nicht klar kommt und der obige Code kann das Format zwar halbwegs "lesen" - rechnet daraus aber auch Blödsinn (minus ein Jahr)!
Ich habe eben schonmal in der SQL-Datenbank nachgeschaut aber ich finde die Tabelle nicht in die der Wert gespeichert wird - ich wollte mal schauen wie das Datum dort gespeichert ist.
Nachtrag:
Wie ich oben schonmal schrieb - gebe ich das Feld direkt aus, erhalte ich 1978-01-18T00:00:00 stört dort vielleicht die Zeitangabe T00:00:00 ?? Da ist ja die "0" mehrmals vorhanden?
Hab nun das Feld in der
am 01.10.2010 - 23:12 Uhr
Hab nun das Feld in der Datenbank gefunden.
field_1_geburtstag_value = 1978-01-18T00:00:00 - in Unixtime scheint der Wert nicht umgerechnet zu sein.
Müsste man jetzt nicht das Geburtstags-Datum erstmal in Unixtime umrechnen bevor man $nowunix minus $bday rechnet?
Grübel
In der Datenbank müsste die
am 01.10.2010 - 23:09 Uhr
In der Datenbank müsste die Tabelle `content_type_Name des Inhaltstyps` heissen.
Dann ist es bei Dir anders
am 01.10.2010 - 23:15 Uhr
Dann ist es bei Dir anders als bei mir, ich habe Unixtimestamps in der Datenbank. Aber warum? Wie hast Du das cck feld angelegt? was steht als Typ in dem Inhaltstyp unter Felder verwalten?
Ich habe "Datum" verwendet
am 01.10.2010 - 23:18 Uhr
Ich habe "Datum" verwendet und dann auch nochmal "Datetime"!
Sag jetzt nicht - es muss "Datestamp" sein? OMG - ich probiere es mal aus.
Naja, bei mir ist es
am 01.10.2010 - 23:19 Uhr
Naja, bei mir ist es jedenfalls Datestamp...
Shit - es muss tatsächlich
am 01.10.2010 - 23:26 Uhr
Shit - es muss tatsächlich "Datestamp" sein.
Es hat jetzt gleich beim ersten Versuch geklappt.
Sorry Sammelzwerg - ich hab Dir jetzt sehr viel Zeit geraubt aber ich wusste nicht, dass man als Typ "Datestamp" nehmen muss - ich konnte das nirgends lesen/erkennen.
Da hätte ich sicherlich nächstes Jahr noch gesessen und rumprobiert.
Da steh ich jetzt ganz schön bedeppert da - ich hoffe ich habe nicht zu viel Umstände gemacht?
Hey, kein Problem! Mir macht
am 01.10.2010 - 23:30 Uhr
Hey, kein Problem! Mir macht das Fehlersuchen auch Spaß, und ich lerne auch etwas dabei. Außerdem kenne ich das, wenn man einfach nicht drauf kommt, das kann ziemlich nervtötend sein.
So, ich verabshiede mich dann für heute, Gute Nacht
Ich bedanke mich nochmals für
am 01.10.2010 - 23:35 Uhr
Ich bedanke mich nochmals für die Hilfe - ohne Dich hätte ich nächste Woche noch im Nebel rumgestochert ;-)
Gute Nacht und angenehme Träume!