Seite 1 von 1

Mitgliederliste nach Alter sortieren

Verfasst: 25.07.2008 18:12
von Thyron
Hallo!

Bin grade am rumbasteln und auch fast am Ziel. Leider nur fast - wäre schön, wenn ihr weiterhelfen könntet :)

Ich hab es jetzt schon hinbekommen durch Anpassen der memberlist_body.html und memberlist.php, dass das Alter in der Mitgliederliste angezeigt wird. Nur mit der Sortierung nach dem Alter klappt es noch nicht ganz!

Ich kann nach dem Geburtsdatum sortieren lassen, dazu habe ich in der memberlist.php bei $sort_key_sql das hier angegeben: 'n' => 'u.user_birthday'

Das funktioniert zwar soweit, aber macht keinen Sinn. Da das Geburtsdatum in der Datenbanktabelle im Format TT-MM-JJJJ gespeichert ist, sortiert er nämlich nach dem Tag. D.h. wer am 31. Geb hat, erscheint als erstes, toll :grin:

Dabei findet sich in der memberlist.php unter dem Kommentar "Prepare profile data" folgende Passage:

Code: Alles auswählen

	$age = '';

	if ($config['allow_birthdays'] && $data['user_birthday'])
	{
		list($bday_day, $bday_month, $bday_year) = array_map('intval', explode('-', $data['user_birthday']));

		if ($bday_year)
		{
			$now = getdate(time() + $user->timezone + $user->dst - date('Z'));

			$diff = $now['mon'] - $bday_month;
			if ($diff == 0)
			{
				$diff = ($now['mday'] - $bday_day < 0) ? 1 : 0;
			}
			else
			{
				$diff = ($diff < 0) ? 1 : 0;
			}

			$age = (int) ($now['year'] - $bday_year - $diff);
		}
	}
Da wird also das Gebdatum aus der Datenbanktabelle in das Alter umgerechnet. Wie kann ich jetzt diesen Wert nutzen für die Sortierung?

Vorgesehen ist die Sortierung scheinbar nur anhand von Daten aus der Datenbank und dort ist das Alter ja nicht drin und das Gebdatum eben in dem unbrauchbaren Format. Da muss es doch irgendeinen Kniff geben :)

Das Registrierungsdatum ist in der Datenbanktabelle übrigens als reine Zahl gespeichert, z.B. "1210205590". Das kann dann natürlich richtig sortiert werden... :roll:

Verfasst: 25.07.2008 23:39
von Thyron
Hab jetzt nochmal genauer recherchiert...

Dieser Befehl gibt in der ucp_profile.php an wie sich das Geburtsdatum aus Tag, Monat und Jahr zusammensetzt:

Code: Alles auswählen

$data['user_birthday'] = sprintf('%2d-%2d-%4d', $data['bday_day'], $data['bday_month'], $data['bday_year']);
In der memberlist.php hab ich als Sortierung momentan das angegeben:

Code: Alles auswählen

$sort_key_sql = array('n' => 'u.user_birthday');
Ich müsste dem jetzt nur noch beibringen, dass er nicht das ganze user_birthday, sondern nur die letzten 4 Zahlen auslesen bzw. zur Sortierung heranziehen soll.

Evt. dazu ähnlich wie oben definieren, wie sich der Wert zusammensetzt und dann sagen was er verwenden soll?

Leider kann ich selbst kein PHP, reime mir das nur mit logischem Denken zusammen :( Wäre schön, wenn mir jemand anhand den Infos einen Befehl schreiben könnte, mit dem ich es hinbekommen kann!

Verfasst: 28.07.2008 14:23
von Thyron
*schieb*

Verfasst: 01.08.2008 12:00
von Thyron
keiner? :(

Verfasst: 06.08.2008 02:01
von Thyron
Ich habs mal versucht, indem ich das Format von user_birthday von varchar auf date geändert hab. Danach waren aber alle Geburtsdaten weg! Hab dann schnell wieder mein Backup eingespielt :-?

Verfasst: 08.08.2008 16:29
von Thyron
HURRA, es geht jetzt :D

Ein Freund von mir, der Winfo studiert hats mir reinprogrammiert. Hat etwas gedauert bis es geklappt hat und is vielleicht nicht die eleganteste Lösung, aber funktioniert einwandfrei! Die Liste wird dabei bis auf den Tag genau nach dem Alter (also anhand des Geburtsdatums) sortiert. Ich versuche mal alle meine Änderungen zusammenzufassen:

Öffne: memberlist.php (für Sortierung nach Geburtsdatum)

Suche:

Code: Alles auswählen

$sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_LOCATION'], 'c' => $user->lang['SORT_JOINED'], 'd' => $user->lang['SORT_POST_COUNT'], 'f' => $user->lang['WEBSITE'], 'g' => $user->lang['ICQ'], 'h' => $user->lang['AIM'], 'i' => $user->lang['MSNM'], 'j' => $user->lang['YIM'], 'k' => $user->lang['JABBER']);
$sort_key_sql = array('a' => 'u.username_clean', 'b' => 'u.user_from', 'c' => 'u.user_regdate', 'd' => 'u.user_posts', 'f' => 'u.user_website', 'g' => 'u.user_icq', 'h' => 'u.user_aim', 'i' => 'u.user_msnm', 'j' => 'u.user_yim', 'k' => 'u.user_jabber');
Ersetze mit:

Code: Alles auswählen

$sort_key_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_LOCATION'], 'c' => $user->lang['SORT_JOINED'], 'd' => $user->lang['SORT_POST_COUNT'], 'f' => $user->lang['WEBSITE'], 'g' => $user->lang['ICQ'], 'h' => $user->lang['AIM'], 'i' => $user->lang['MSNM'], 'j' => $user->lang['YIM'], 'k' => $user->lang['JABBER'], 'n' => $user->lang['SORT_AGE']);
$sort_key_sql = array('a' => 'u.username_clean', 'b' => 'u.user_from', 'c' => 'u.user_regdate', 'd' => 'u.user_posts', 'f' => 'u.user_website', 'g' => 'u.user_icq', 'h' => 'u.user_aim', 'i' => 'u.user_msnm', 'j' => 'u.user_yim', 'k' => 'u.user_jabber',

'n' => ' CONCAT(RIGHT(u.user_birthday, 4), REPLACE(SUBSTR(u.user_birthday, 4, 2), \' \', \'0\'), REPLACE(SUBSTR(u.user_birthday, 1, 2), \' \', \'0\'))  ');
Suche:

Code: Alles auswählen

'U_LIST_CHAR'			=> $sort_url . '&sk=a&sd=' . (($sort_key == 'l' && $sort_dir == 'a') ? 'd' : 'a'),
Danach in neuer Zeile einfügen:

Code: Alles auswählen

'U_SORT_AGE'			=> $sort_url . '&sk=n&sd=' . (($sort_key == 'n' && $sort_dir == 'd') ? 'a' : 'd'),

Öffne: memberlist_view.html (für neue Spalte Alter)

Suche:

Code: Alles auswählen

<!-- IF LOCATION --><dt>{L_LOCATION}:</dt> <dd>{LOCATION}</dd><!-- ENDIF -->
Danach in neuer Zeile einfügen:

Code: Alles auswählen

<!-- IF AGE --><dt>{L_AGE}:</dt> <dd>{AGE}</dd><!-- ENDIF -->

PS: Ggf. nur nach einem Teil der Zeile suchen, wenn man die Stellen sonst nicht findet.