Mitgliederliste nach Alter sortieren

Du suchst einen bestimmten Mod, weißt aber nicht genau wo bzw. ob er überhaupt existiert? Wenn dir dieser Artikel nicht weiterhilft, kannst du hier den von dir gewünschten/gesuchten Mod beschreiben ...
Falls ein Mod-Autor eine der Anfragen hier aufnimmt, um einen neuen Mod zu entwickeln, geht's in [3.0.x] Mods in Entwicklung weiter.
Forumsregeln
phpBB 3.0 hat das Ende seiner Lebenszeit überschritten
phpBB 3.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 3.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf die neuste phpBB-Version, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Antworten
Thyron
Mitglied
Beiträge: 302
Registriert: 09.05.2008 11:59

Mitgliederliste nach Alter sortieren

Beitrag 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:
Thyron
Mitglied
Beiträge: 302
Registriert: 09.05.2008 11:59

Beitrag 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!
Thyron
Mitglied
Beiträge: 302
Registriert: 09.05.2008 11:59

Beitrag von Thyron »

*schieb*
Thyron
Mitglied
Beiträge: 302
Registriert: 09.05.2008 11:59

Beitrag von Thyron »

keiner? :(
Thyron
Mitglied
Beiträge: 302
Registriert: 09.05.2008 11:59

Beitrag 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 :-?
Thyron
Mitglied
Beiträge: 302
Registriert: 09.05.2008 11:59

Beitrag 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.
Antworten

Zurück zu „[3.0.x] Mod Suche/Anfragen“