[3.2][3.3][CDB] Userreminder

In diesem Forum können Extension-Autoren ihre Extensions vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: [3.2] User reminder

Beitrag von Dr.Death »

Die Sprache berücksichtigst du doch bereits, oder nicht?

$mail_template_path = $phpbb_root_path . 'ext/mot/userreminder/language/' . $row['user_lang'] . '/email/';

Das gleiche mache ich auch:

Code: Alles auswählen

// Send the messages
$used_lang = $row['user_lang'];
$mail_template_path = $ext_path . 'language/' . $used_lang . '/email/';

Zwischen Zuweisung des Mail Template und dem Zuweisen der Template Variablen, muss halt eine Zeitberechung rein anstelle von 'LAST_VISIT' => $this->user->format_date($row['mot_last_login']),
Benutzeravatar
Mike-on-Tour
Supporter
Supporter
Beiträge: 1076
Registriert: 13.01.2020 21:09
Kontaktdaten:

Re: [3.2] User reminder

Beitrag von Mike-on-Tour »

Die Sprache wird nur bei der Auswahl des Mail-Templates berücksichtigt, nicht bei der Ausgabe der Datums-/Zeitangabe, selbst wenn es schon im Text der Mail eingebunden ist.
Für alle Beispiele gilt: Board-Sprache ist de
Beispiel 1: Datum/Zeitformat ist 'D M d, Y g:i a', Sprache des angeschriebenen Users ist en, dann erscheint korrekt 'Thu Oct 10, 2019 1:10 am'

Beispiel 2: gleiches Datum/Zeitformat, Sprache de, dann erscheint immer noch 'Thu Oct 10, 2019 1:10 am', weil der Name des Wochentages und des Monats nicht über den Eintrag in der deutschen Sprachdatei übersetzt werden.

Beispiel 3: Datum/Zeitformat ist 'j. M Y, H:i', Sprache de, es erscheint im Text die Angabe '10. Oct 2019, 01:10', es wird also auch hier der Monatsname nicht übersetzt.

Dieses Verhalten ärgert mich noch, und ich würde es gerne abstellen. Einzige Möglichkeit, die ich noch sehe, ist eine Suche nach Buchstaben im Datum/Zeit-String, um die Wochentags- und Monatsnamen in geschweifte Klammern zu setzen, damit sie bei der Übersetzung mit berücksichtigt werden.

Edit:
Fällt mir natürlich erst auf, wenn ich auf den "Absenden"-Button geklickt habe: Ist eine blöde Idee, weil das Mail-Template ja gar nicht mehr durch das Language-File geht. :oops:
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: [3.2] User reminder

Beitrag von Dr.Death »

Ja, das ist mir allerdings auch aufgefallen.... daher hab ich bei mir das "->format_date()" rausgeworfen und nur mit dem "format()" gearbeitet.

Die Auslieferung über ->format_date() bringt zwar die korrekte Zeitzone, aber die Ausgabe beinhaltet immer englische Wochentage.

Ich habe momentan noch nicht die Stelle gefunden, indem das Datum "eingedeutscht" wird...bin noch auf der Suche.


EDIT:
Ich für meinen Teil verzichte beim Mailversand nun auf den Wochentag und bin erstmal froh das ich mich jetzt nicht mehr auf die Board Zeitzone, sondern auf die User Zeitzone verlassen kann.


EDIT2:

Code: Alles auswählen

$this->user->format_date()
ist definitiv der falsche Ansatz, da hier wirklich nur der initiierte $user genommen wird. Hab mich da wohl etwas verrannt :-? :ugeek:
Benutzeravatar
Mike-on-Tour
Supporter
Supporter
Beiträge: 1076
Registriert: 13.01.2020 21:09
Kontaktdaten:

Re: [3.2][3.3][RC] Userreminder

Beitrag von Mike-on-Tour »

Ich habe es geschafft, der Datums-/Zeitstring wird jetzt in der vom User ausgewählten Zeitzone, Format und Sprache in der eMail ausgegeben!! :grin:

Im Skript, das sich um die Formatierung kümmert, müssen die beiden Klassen language und language_file_loader aufgenommen werden:

Code: Alles auswählen

use \phpbb\language\language;
use \phpbb\language\language_file_loader;
und dann kann man mit folgender Funktion den String so formatieren, dass er die drei Einstellungen Sprache, Zeitzone und Datumsformat des adressierten Nutzers berücksichtigt:

Code: Alles auswählen

	/*
	* @param string	$user_lang			addressed user's language
	* @param string	$user_timezone		addressed user's time zone
	* @param string	$user_dateformat		addressed user's date/time format
	* @param int	$user_timestamp		addressed user's php timestamp (registration date, last login, reminder mails as UNIX timestamp from users table)
	*
	* @return string	the timestamp in user's choosen date/time format and time zone as DateTime string
	*/
	private function format_date_time($user_lang, $user_timezone, $user_dateformat, $user_timestamp)
	{
		$default_tz = date_default_timezone_get();
		$date = new \DateTime('now', new \DateTimeZone($default_tz));
		$date->setTimestamp($user_timestamp);
		$date->setTimezone(new \DateTimeZone($user_timezone));
		$time = $date->format($user_dateformat);

		// Instantiate a new language class (with its own loader), set the user's chosen language and translate the date/time string
		$lang = new language(new language_file_loader($this->root_path, $this->phpEx));
		$lang->set_user_language($user_lang);

		// Find all words in date/time string and replace them with the translations from user's language
		preg_match_all("/[a-zA-Z]+/", $time, $matches, PREG_PATTERN_ORDER);
		if (sizeof ($matches[0]) > 0)
		{
			foreach ($matches[0] as $value)
			{
				$time = preg_replace("/".$value."/", $lang->lang(array('datetime', $value)), $time);
			}
		}

		// return the formatted and translated time in users timezone
		return $time;
	}
Die Funktion lässt sich dann beispielsweise über

Code: Alles auswählen

'LAST_VISIT'	=> $this->format_date_time($row['user_lang'], $row['user_timezone'], $row['user_dateformat'], $row['mot_last_login']),
in die Variablenübergabe an den Messenger einbauen.

Morgen werde ich dann mal ein zip-File mit der neuesten Version einstellen und das Repository aktualisieren.
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: [3.2][3.3][RC] Userreminder

Beitrag von Dr.Death »

Top!

Wenn ich darf, würde ich das für meine Extension gerne ausleihen....
Benutzeravatar
Mike-on-Tour
Supporter
Supporter
Beiträge: 1076
Registriert: 13.01.2020 21:09
Kontaktdaten:

Re: [3.2][3.3][RC] Userreminder

Beitrag von Mike-on-Tour »

Gerne, dafür habe ich es hier gepostet :grin:
(und außerdem habe ich Teile des Codes ja von dir)
Zuletzt geändert von Mike-on-Tour am 23.02.2020 12:25, insgesamt 1-mal geändert.
Benutzeravatar
Mike-on-Tour
Supporter
Supporter
Beiträge: 1076
Registriert: 13.01.2020 21:09
Kontaktdaten:

Re: [3.2][3.3][RC] Userreminder

Beitrag von Mike-on-Tour »

Es gibt eine überarbeitete und berichtigte Version dieser Extension, folgende Änderungen wurden eingearbeitet:
  • In allen Sprachdateien <br /> durch <br> ersetzt
  • Rechtschreibfehler (Zeile 48) und eine vergessene Übersetzung (Zeile 56) in der en Sprachdatei berichtigt
  • SQL Abfragen in common.php optimiert
  • SQL Abfrgen (es wird nur noch nach 'normal users' und 'founders' geprüft; bots, guests, deactivated oder inactive users werden ignoriert) in den Dateien:
    registrated_only_module.php, reminder_module.php, zeroposter_info.php, main_listener.php
    optimiert
  • Die festen Datum/Zeit-Formatierungen (date('d.m.Y', "date")) durch $user->format_date("date') ersetzt, um die Einstellungen des aktuellen Nutzers zu berücksichtigen, betroffene Dateien:
    registrated_only_module.php, reminder_module.php, settings_module.php, zeroposter_info.php
  • Zwei fehlerhafte Datum/Zeit-Formatierungen in der eMail-Vorschau in settings_module.php korrigiert
  • Erstellung einer neuen Migrations-Datei 'ur_v_0_5_0.php' mit einer nutzerspezifischen Funktion, um den Eintrag der Spalte 'mot_last_login' aus der Spalte 'user_lastvisit' der Tabelle 'users' zu übernehmen. Dies ersetzt die Funktion 'init_ur' in der Datei 'main_listener.php', damit wird die Notwendigkeit eines Aus- und Einloggens vermieden, um die Tabellen im ACP zu befüllen
  • Eine fr Sprachdatei wurde hinzugefügt (Danke an stone23 (www.phpbb.com) für diesen Beitrag)
  • Einfügen einer neuen Funktion in common.php zum korrekten Formatieren der Datum/Zeit-Einträge in den eMails entsprechend der Einstellungen des adressierten Nutzers zu Sprache, Zeitzone und Datum/Zeit-Format
Die Links zum GitHub Repository und zum Downlaod im ersten Beitrag sind entsprechend berichtigt. Im GitHub Repository gibt es jetzt auch eine README.md.

WICHTIG: Beim Löschen eines Users aus dieser Extension heraus werden die Beiträge dieses Nutzers NICHT mitgelöscht, um Lücken in den Threads zu vermeiden.

Und zum Schluss noch ein Danke schön an LukeWCS, dessen Tool mir bei der Erkennung von Fehlern oder unsauberen Programmierungen eine große Hilfe war (es läuft jetzt mit allen grünen Haken durch).
Benutzeravatar
Dr.Death
Moderator
Moderator
Beiträge: 17401
Registriert: 23.04.2003 08:22
Wohnort: Xanten
Kontaktdaten:

Re: [3.2][3.3][RC] Userreminder

Beitrag von Dr.Death »

Damit der CodeSniffer nicht anspringt:

Code: Alles auswählen

use phpbb\language\language;
use phpbb\language\language_file_loader;
Benutzeravatar
Mike-on-Tour
Supporter
Supporter
Beiträge: 1076
Registriert: 13.01.2020 21:09
Kontaktdaten:

Re: [3.2][3.3][RC] Userreminder

Beitrag von Mike-on-Tour »

Dr.Death hat geschrieben: 23.02.2020 13:11 Damit der CodeSniffer nicht anspringt:

Code: Alles auswählen

use phpbb\language\language;
use phpbb\language\language_file_loader;
CodeSniffer hat sich damit nicht gemeldet, habe es aber trotzdem korrigiert.

An Alle:
In der Datei 'reminder_module.php' fehlt ein Leerzeichen in der SQL Abfrage (habe wohl zu viel optimiert :oops: ), was zu einer Fehlermeldung führt, wenn keine geschützten Mitglieder angegeben wurden. Die Zip-Datei für den Download und das GitHub Repository enthalten jetzt eine berichtigte Datei.
Nachtrag vom 24.02.2020:
Auch in der Datei 'settings_module.php' hat sich beim Optimieren ein Fehler eingeschlichen, der zu einer Warnung bei der Vorschau der eMail-Texte führt (die man wegen des automatischen Scrollens zum Seitenende auch nicht gleich sieht). Auch dieser Fehler ist in den aktuellen Zip-Dateien und Repository berichtigt.
Steve Wuppertal
Mitglied
Beiträge: 200
Registriert: 09.05.2011 17:10
Wohnort: Wuppertal
Kontaktdaten:

Re: [3.2][3.3][RC] Userreminder

Beitrag von Steve Wuppertal »

Danke für die tolle Extension.
Hatte so etwas damals im phpBB 3.0 auch schon mal als MOD installiert (war sogar der gleiche Name :wink: ).

Habe sie bei mir im Forum gleich mal getestet (phpBB 3.2.9).
Beim versenden der "ersten" Erinnerungsmail (wird wohl durch die BOTs ausgelöst) ist mir aufgefallen, das sie (laut Admin-Log) zweimal an die jeweils gleichen User versendet wurde (es wurden zwei Einträge im Administrator Log generiert, welche die jeweils gleichen Usernamen beinhalten).
Es waren zu diesem Zeitpunkt wohl gleichzeitig zwei Bots (Bing [Bot] und AhrefsBot [Bot]) unterwegs und wie es scheint, haben diese zeitgleich den Mail Versandt ausgelöst.

Ob jetzt auch wirklich zwei gleiche Mails an die User raus gegangen sind, kann ich derzeit nicht sagen...
Sollte es so sein, würde ich anregen da eine Sperre einzubauen (entweder eine Zeitverzögerung oder eine andere Maßnahme um Doppelmails zu verhindern).

Ansonsten, super Extension und nochmals Danke dafür :)
Antworten

Zurück zu „Extensions in Entwicklung“