Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Views ›

Suche nach Alter in Jahren

Eingetragen von artwoerx (62)
am 11.01.2011 - 15:58 Uhr in
  • Views
  • Drupal 6.x

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

‹ View als Argument für einen zweiten View verwenden Views 3 PHP für variablen Header für Taxonomy Term. ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Computed Field

Eingetragen von Sammelzwerg (377)
am 11.01.2011 - 22: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hi, danke für die info, komme

Eingetragen von artwoerx (62)
am 12.01.2011 - 10: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Da hast Du allerdings Recht,

Eingetragen von Sammelzwerg (377)
am 12.01.2011 - 13: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Habe eben das Modul

Eingetragen von artwoerx (62)
am 12.01.2011 - 14: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Stefan, falls Du damit

Eingetragen von Ionit (1802)
am 12.01.2011 - 14: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Matthias und

Eingetragen von artwoerx (62)
am 12.01.2011 - 15: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];

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hallo Stefan, hmmm - hast Du

Eingetragen von Ionit (1802)
am 12.01.2011 - 15: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

$static höre ich leider zum

Eingetragen von artwoerx (62)
am 12.01.2011 - 15: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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

Anstatt $data->node_data_fiel

Eingetragen von Ionit (1802)
am 12.01.2011 - 16: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ne - scheint leider doch

Eingetragen von Ionit (1802)
am 12.01.2011 - 16:10 Uhr

Ne - scheint leider doch nicht zu klappen - wenn ich bei mir die static-variable ausgebe, erhalte ich NULL.

Grübel.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Das klappt leider so

Eingetragen von artwoerx (62)
am 12.01.2011 - 17: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ein Aktualisiernen fällt weg,

Eingetragen von artwoerx (62)
am 12.01.2011 - 17: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 ...

  • Anmelden oder Registrieren um Kommentare zu schreiben

Mit Dynamic Field kann das

Eingetragen von Sammelzwerg (377)
am 12.01.2011 - 19: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

So, jetzt doch nochmal ganz

Eingetragen von Sammelzwerg (377)
am 12.01.2011 - 23: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Noch keine Funktion. Hi,

Eingetragen von artwoerx (62)
am 13.01.2011 - 13: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hast Du den Code auch für

Eingetragen von Sammelzwerg (377)
am 13.01.2011 - 13: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/

  • Anmelden oder Registrieren um Kommentare zu schreiben

Klar doch ;-) Ich hoffe ich

Eingetragen von artwoerx (62)
am 13.01.2011 - 13:49 Uhr

Klar doch ;-)
Ich hoffe ich bin dem auf der Spur. Mit Devel und phpMyAdmin kämpfe ich gerade um eine Lösung.

  • Anmelden oder Registrieren um Kommentare zu schreiben

So, nun wird es

Eingetragen von artwoerx (62)
am 13.01.2011 - 15: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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

[Gelöst] Alter in Jahren für Berechnung und Anzeige

Eingetragen von artwoerx (62)
am 13.01.2011 - 16: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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Dynamische Ansicht von Seiteninhalt (als Tabelle?)
  • Vergabe von Berechtigungen für bestimmte Rollen; mir fehlt der Haken bzw. das „Veröffentlicht“
  • Ich brauche dringen Hilfe zu Updates oder ggf. wwie geht Composer?
  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • Rolle erstellen nicht zu finden
  • 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
Weiter

Neue Kommentare

  • Arrrrg. Nix Tabelle :-D /*
    vor 2 Wochen 6 Tagen
  • Textboxen mit Tabelle
    vor 2 Wochen 6 Tagen
  • Du sollst ja auch keine
    vor 2 Wochen 6 Tagen
  • Theme
    vor 2 Wochen 6 Tagen
  • Welches Theme benutzt du
    vor 2 Wochen 6 Tagen
  • Mit Responsive Raster hatte
    vor 3 Wochen 10 Stunden
  • Hallo Alex,um das Häkchen
    vor 3 Wochen 19 Stunden
  • Modul view_unpublished
    vor 3 Wochen 1 Tag
  • Modul "override node options"
    vor 3 Wochen 2 Tagen
  • Im Grunde ist dass ein
    vor 3 Wochen 4 Tagen

Statistik

Beiträge im Forum: 250270
Registrierte User: 20479

Neue User:

  • Stevebok
  • Robertnobia
  • AltonRaf

» Alle User anzeigen

User nach Punkten sortiert:
wla9463
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 39 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