Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Allgemeines zu Drupal ›

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

Eingetragen von Ionit (1802)
am 01.10.2010 - 19:28 Uhr in
  • Allgemeines zu Drupal
  • Drupal 6.x

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

‹ Eigene htaccess Datei? Gelöst- Drupal verträgt sich nicht mit open cart Shopsystem? ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Probier mal das: <?php$output

Eingetragen von Sammelzwerg (377)
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;
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Sammelzwerg, danke für

Eingetragen von Ionit (1802)
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!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Das gibt bei mir dann

Eingetragen von Sammelzwerg (377)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hmmm ... nutzt Du Computed

Eingetragen von Ionit (1802)
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!

Zitat:

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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich verstehe es auch nicht,

Eingetragen von Sammelzwerg (377)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat: Bei Deinem ersten

Eingetragen von Ionit (1802)
am 01.10.2010 - 20:42 Uhr
Zitat:

Bei Deinem ersten Code, ist das Geburtstagfeld in der View vor dem Customfield oder danach?

Vorm Customfield ....

  • Anmelden oder Registrieren um Kommentare zu schreiben

Da ich immer noch keine

Eingetragen von Ionit (1802)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Neue Idee: <?php $bday =

Eingetragen von Sammelzwerg (377)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Sammelzwerg, danke,

Eingetragen von Ionit (1802)
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"!!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Dann muss aber mit dem

Eingetragen von Sammelzwerg (377)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Daran habe ich auch schon

Eingetragen von Ionit (1802)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hab nun das Feld in der

Eingetragen von Ionit (1802)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

In der Datenbank müsste die

Eingetragen von Sammelzwerg (377)
am 01.10.2010 - 23:09 Uhr

In der Datenbank müsste die Tabelle `content_type_Name des Inhaltstyps` heissen.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Dann ist es bei Dir anders

Eingetragen von Sammelzwerg (377)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich habe "Datum" verwendet

Eingetragen von Ionit (1802)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Naja, bei mir ist es

Eingetragen von Sammelzwerg (377)
am 01.10.2010 - 23:19 Uhr

Naja, bei mir ist es jedenfalls Datestamp...

  • Anmelden oder Registrieren um Kommentare zu schreiben

Shit - es muss tatsächlich

Eingetragen von Ionit (1802)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hey, kein Problem! Mir macht

Eingetragen von Sammelzwerg (377)
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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich bedanke mich nochmals für

Eingetragen von Ionit (1802)
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!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 4 Tagen 13 Stunden
  • Hey danke
    vor 5 Tagen 8 Stunden
  • Update: jetzt gibt's ein
    vor 6 Tagen 2 Stunden
  • Hallo, im Prinzip habe ich
    vor 1 Woche 3 Tagen
  • Da scheint die Terminologie
    vor 1 Woche 3 Tagen
  • Kannst doch auch alles direkt
    vor 2 Wochen 21 Stunden
  • In der entsprechenden View
    vor 2 Wochen 21 Stunden
  • Dazu müsstest Du vermutlich
    vor 2 Wochen 21 Stunden
  • gelöst
    vor 4 Wochen 4 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 4 Wochen 5 Tagen

Statistik

Beiträge im Forum: 250233
Registrierte User: 20449

Neue User:

  • Mroppoofpaync
  • 4aficiona2
  • AppBuilder

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 6 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association