Zum Inhalt springen

Front End User Registration Stop: setzen

Erstellt am 12. September 2005 · 28 Antworten · letzte Antwort am 28. September 2005 · Seite 1 von 2

Tags: Frage

dfluess ·

Hallo,

ich "Missbrauche" die Extension "Front End User Registration" für die Anmeldung eines Benutzers zu einem Service. Dieser Service soll genau ein Jahr laufen. Nach einem Jahr soll sich der FE_User also nicht mehr anmelden können.

Eine einfache Lösung ist für den FE-User eine entsprechende Stopzeit in den Allgemeine Optionen zu setzen. Nun möchte ich aber, dass diese Zeit bei der Registrierung automatisch eingesetzt wird. Also Registrierdatum plus 365 Tage.

Gibts da eine Lösung?
Wäre eine echte Erleichterung, weil man nach einer Registrierung dann nicht jeden Eintrag extra editieren müsste..

typotree ·

Hallo dfluess,

ich sitze gerade vor ähnlichen Problemen und soll nach Anmeldung des User ihm bestimmte Gruppen zuweisen und nicht nur die Standard-Gruppe. Wenn Du den User nur für den Service brauchst, dann ist Dein Ansatz richtig, dass Du für die Stop-Funktion den Timestamp+365 Tage setzt. Es gibt gewisse 'Hooks' in Typo3 mit denen man Aktionen starten kann. Habe mir das Konzept aber noch nicht genau durchgelesen. Da aber bei der Anmeldung die Daten doch alle in die Tabelle "fe_users" geschrieben werden, müsstest Du dir die php-Datei angucken und dort nur den den timestamp zusätzlich setzen.
"endtime" bekommt dann so etwas wie "time()+(3600*24*365)", Abfrage nach Schaltjahr noch mit einbauen. Vielleicht gibt es auch eine Funktion mit "+ 1 Year", kenne mich mit PHP noch nicht so gut aus.

Gruß
Martin

dfluess ·

Das ist ja schon mal was.. Danke für den Tipp!

Leider bin ich in Sachen php auch kein Profie. Vielleicht ist hier ja noch jemand, der mit diesem Ansatz weiterhelfen kann?

Vielleicht ein verstecktes Feld im Form-Template durch Timestamp+ 1 Year setzen und automatisch in die Tabelle eingetragen lassen? Aber wie, welche *.php umbauen?

hmm... bin dankbar für jeden Tipp

D.

typotree ·

Hallo dfluess,

in der Datei 'sr_feuser_register/pi1/class.tx_srfeuserregister_pi1.php' musst Du die Änderungen vornehmen.

if (count($dataArr)) {
	// added next 7 lines, sets an endtime for the user, now + 1 year)
	$days = 365;
	// leap year?
	if(date('L')	{
		$days++;
	}
	$dataArr['endtime'] = time()+(86400*$days);
	$extraList .= ',endtime';
	$query = $this->cObj->DBgetUpdate($this->theTable, $newId, $dataArr, $extraList);
	// added next line, implement the marker '###DEBUG###' in your template-file
	//$this->markerArray['###DEBUG###'] = $query.'|'.date('d.m.y H:i:s', $dataArr['endtime']); 
	if ($this->conf['debug']) debug('Own-self query: '.$query, 1);
		mysql(TYPO3_db, $query);
	echo mysql_error();
}

Die Zeilennummern 1,10,13-16 entsprechen in der Original-Datei 861-867 (eine Leerzeile).
Ich prüfe noch noch auf Schaltjahr ab. Die Funktion setzt hier noch das Feld 'fe_cruser_id'. Weiss nicht genau warum? Ich setze hier das Feld 'endtime' dazu. Bei meinen Tests funktionierte es.
Keine Garantie für Nebenwirkungen 😃
Um den Output zu überprüfen kannst Du die Zeile mit dem MarkerArray entkommentieren und im Template zwischen die Marker '###TEMPLATE_CREATE_SAVED###' oder '###TEMPLATE_SETFIXED_CREATE###' setzen. Ersterer wenn Du ohne Konfirmation arbeitest sonst den Zweiten. Ich habe es bei mir zum Testen direkt neben '###LABEL_USERNAME###' gesetzt.
Falls Du eine andere Version der Extension hast, die Zeilen befinden sich innerhalb der Funktion 'save()'. Viel Erfolg!

Gruß
Martin

dfluess ·

dass ist mal eine prompt kompetente Antwort, Dankeschön! 🙂

Bin gespannt, wie ich dass umsetzen kann.

Viele Grüße

dfluess ·

Dachte ich es mir doch, das ich als Leihe mal wieder keinen direkten Erfolg habe.

Habe den Code eingebaut. Danach ist der Registrierungslink verschwunden. Kommentiere ich den Codeschnipsel wieder aus, dann ist er wieder da.

habe es so eingebaut:

						if (count($dataArr)) {

// added next 7 lines, sets an endtime for the user, now + 1 year)
        $days = 365;
        // leap year?
        if(date('L')    {
                $days++;
        }
        $dataArr['endtime'] = time()+(86400*$days);
        $extraList .= ',endtime';
							$query = $this->cObj->DBgetUpdate($this->theTable, $newId, $dataArr, $extraList);
// added next line, implement the marker '###DEBUG###' in your template-file
//        $this->markerArray['###DEBUG###'] = $query.'|'.date('d.m.y H:i:s', $dataArr['endtime']);

							if ($this->conf['debug']) debug('Own-self query: '.$query, 1);
								mysql(TYPO3_db, $query);
							echo mysql_error();
						}

					}

Hab ich was übersehen??

dfluess ·

Nachtrag:
Wenn ich die If-Abfrage..

        // leap year?
        if(date('L')    {
                $days++;
        }

..auskommentiere, dann wird der User mit dem eingetragenen Enddatum erstellt.

Das ist wohl für das Schaltjahr.. Ist da ein Fehler drin?

und wenn ich schon dabei bin :-), kann man da auch noch eine Benachrichtigung an den Admin einbauen, wenn der User-Accout deaktiviert worden ist?

typotree ·

Hallo dfluess,

habe heute morgen gemerkt, dass die Schaltjahrabfrage so nicht funktioniert. Die Jahrestage müssen nur dann erhöht werden wenn der User sich zwischen dem 1.1 und 29.2 eines Schaltjahres registriert. Ansonsten macht es keinen Sinn. Naja, kleiner Schnellschuss. Warum er aber bei Dir wegen dieser Abfrage keinen Eintrag macht kann ich nicht nachvollziehen. Je nach Schaltjahr wird ja nur die Anzahl der Tage erhöht. Du kannst hier auch mit der Funktion mktime() arbeiten.
Wird auf http://de2.php.net/manual/de/function.mktime.php erklärt wie auch andere Datums- und Zeitfunktionen. Wenn Du unabhängig von der Uhrzeit möchtest, dass der User im nächsten Jahr nur bis Mitternacht des Vortages der Registrierung sich einloggen darf, probiere es mal hiermit.

$thisDay = date('j'); // Tag ohne führende Nullen
$thisMonth = date('n'); Monat ohne führende Nullen
$thisYear = date('Y'); // Jahr vierstellig
// Abfrage wegem 29.2 eines Schaltjahres
if($thisDay == 29 && $thisMonth == 2)    {
    $thisDay -= 1; // einfach auf einen Tag davor setzen
}
// Endzeit basteln mit mktime(), die ersten drei Nullen entsprechen Std, Min, Sek
$dataArr['endtime'] = mktime(0,0,0,$thisMonth,$thisday,$thisYear+1);

Auf Unix-Maschinen ist die Reihenfolge der Argumente unterschiedlich! Steht unter dem oben genannten Link.
Wegen der E-Mail-Frage. Du müsstest ja die Datenbank im Auge behalten und andauernd abfragen ob eine 'endtime' abgelaufen ist. Ich weiss nicht ob Du direkt an dieser Kode-Stelle auch die E-Mail-Funktion von Typo3 aufrufen kannst und es so einstellst, dass er die Nachricht erst ein Jahr später verschickt? Keine Ahnung ob so etwas möglich ist.

Gruß
Martin

P.S
Habe gerade entdeckt was an der Schaltjahr-Abfrage nicht funktioniert!

if(date('L')    {

Dieser Zeile fehlt eine schliessende Klammer. So ist es richtig.

if(date('L'))    {

Sorry!

dfluess ·

Prima DANKE! :-)
Ich habe den Code übernommen und es funktioniert auf Anhieb.. hab allerdings das Schaltjahr noch nicht getestet. Gehe aber davon aus dass es auch gehen wird..

Viele Grüße,

Detlef

typotree ·

Hallo dfluess,

Als Workaround kannst Du Dir eine Seite erstellen auf die nur Du als Admin Zugriff hast und dort ein PHP-Skript als Content-Element einfügen.

<?php            
	// Verbindung zur mysql-Datenbank
	$link = mysql_connect("localhost", "###Dein Datenbank-User###", "###Dein Datenbank-Passwort###");
	if (!$link)	{
		die('Keine Verbindung möglich');
	}
	
	// Datenbank
	$db ="###Dein Datenbankname###";
	// Tabellen
	$table = "fe_users";
        
	// Abfrage
	$result = mysql_db_query($db, 'SELECT * FROM '.$table.' WHERE endtime < '.time().' AND endtime > 0 ORDER BY endtime DESC');
	// Gültiges Ergebnis?
	if($result)	{
		echo '<table><tr><th>User</th><th>Abgelaufen</th></tr>';
		while($row = mysql_fetch_assoc($result))	{
			echo '<tr><td>'.$row['name'].'</td><td>'.date('d.m.y' ,$row['endtime']).'</td></tr>';
		}
		echo '</table>';
	} else	{
		echo 'Kein Ergebnis für die Abfrage';
	}
	mysql_close();
?>

Diesen Kode ins Skript-Element einfügen. So siehst Du zumindest die User, die abgelaufen sind. Das jüngste Datum zuerst. Ich habe noch im SQL-Befehl die AND-Klausel 'AND endtime > 0' falls es User gibt, die kein Enddatum haben, weil 0 automatisch gesetzt ist. Wenn es das bei Dir nicht gibt, kannst du es rausnehmen.

Gruß
Martin

P.S.
Du brauchst die extension 'page_php_content'. Dann ein Text-Element erstellen und im Auswahlfeld von 'Text' auf 'PHP Script' ändern.

dfluess ·

Super! Das nenne ich Hilfe! 😃
Das mit der Endzeit klappt ja jetzt schon, werde aber mir Deine letzte Idee später noch einmal ansehen.

Mich plagt seit Tagen nämlich noch ein ganz anderes Problem.

Ich möchte für diese Extension einen eigenen Marker einbauen, der mir auf der Website den Bild-Dateinamen des eingelogten Users anzeigt. Dies hat er ja selbst hochgeladen.

Der Name wird schon im Formular ausgegeben, nur eben nicht in einem für mich verwendbaren Format .
Hier mal die betreffende Funktion

		function buildFileUploader($fName, $config, $filenames = array(), $prefix, $markerArray) {
			$HTMLContent = '';
			$size = $config['maxitems'];
			$cmdParts = split('\[|\]', $this->conf[$this->cmdKey.'.']['evalValues.'][$fName]);

			if(!empty($cmdParts[1])) $size = min($size, intval($cmdParts[1]));
			$size = $size ? $size : 1;
			$number = $size - sizeof($filenames);
			$dir = $config['uploadfolder'];
			 
			if ($this->previewLabel ) {
				for($i = 0; $i < sizeof($filenames); $i++) {
					$HTMLContent .= $filenames[$i] . '  <small><a href="' . $dir.'/' . $filenames[$i] . '" target="_blank">' . $this->pi_getLL('file_view') . '</a></small><br />';
				}
			} else {

				for($i = 0; $i < sizeof($filenames); $i++) {


// hier wird der Name eingebaut .. hatte zunächst für meine Zwecke geändert aber dann kann der Benutzer das Bild nicht mehr bearbeiten..				
  					$HTMLContent .= $filenames[$i] . '  <input type="image" src="' . $GLOBALS['TSFE']-" />tmpl->getFileName($this->conf['icon_delete']) . '" name="'.$prefix.'['.$fName.']['.$i.'][submit_delete]" value="1" title="'.$this->pi_getLL('icon_delete').'" alt="' . $this->pi_getLL('icon_delete'). '"' . $this->pi_classParam('icon') . ' onclick=\'if(confirm("' . $this->pi_getLL('confirm_file_delete') . '")) return true; else return false;\' />  <small><a href="' . $dir.'/' . $filenames[$i] . '" target="_blank">' . $this->pi_getLL('file_view') . '</a></small><br />';
					$HTMLContent .= '<input type="hidden" name="' . $prefix . '[' . $fName . '][' . $i . '][name]' . '" value="' . $filenames[$i] . '" />';
				}
				for($i = sizeof($filenames); $i < $number + sizeof($filenames); $i++) {


					$HTMLContent .= '<input name="'.$prefix.'['.$fName.']['.$i.']'.'" type="file" this-="" />pi_classParam('uploader').' /><br />';
				}
			}
			 

			return $HTMLContent;
		}

Ich brauche einfach nur und ohne das ganze drumherum eine nackte Ausgabe des Dateinames der Bilddatei. Ich möchte diesen dann über einen Marker ins Template setzen und zwar so:

<img src="http://meineadresse.de/uploads/tx_srfeuserregister/###USERBILD###" alt="" />

Ich finde einfach keinen Weg :-(
Du hast bestimmt sofort eine Antwort, nach der ich nun schon seit Tagen vergeblich suche...

typotree ·

Hallo Detlef,

ich habe mal folgendes gemacht und es klappte auf Anhieb.
In der Funktion 'buildFileUploader'

if ($this->previewLabel ) {
				for($i = 0; $i < sizeof($filenames); $i++) {
					$HTMLContent .= $filenames[$i] . '  <small><a href="' . $dir.'/' . $filenames[$i] . '" target="_blank">' . $this->pi_getLL('file_view') . '</a></small>><br />';
				}

habe ich in Zeile 3 folgendes eingebaut.

<img src="' . $dir.'/' . $filenames[$i] . '" alt="" height="80" width="80" />

Sieht nun so aus:

if="" this-="" />previewLabel ) {
				for($i = 0; $i < sizeof($filenames); $i++) {
					$HTMLContent .= $filenames[$i] . '  <small><a href="' . $dir.'/' . $filenames[$i] . '" target="_blank">' . $this->pi_getLL('file_view') . '</a></small><img src="' . $dir.'/' . $filenames[$i] . '" alt="" height="80" width="80" /><br />';
				}

Nun wird bei jeder Vorschau, dass Bild angezeigt. ich habe es mal verkleinert (80x80). Willst Du die Vorschau 'View' nicht mehr haben musst Du den <a>-Tag entfernen. Er unterscheidet in der 'Preview' nicht zwischen 'Create', 'Edit' und 'Invite'. Das kannst Du mit den Variablen '$this->cmd' und '$this->cmdKey' abfragen. Die Werte sind 'create', 'edit' und 'invite'.
Ich hoffe das hilft Dir weiter, sonst nochmal posten.

Gruß
Martin

dfluess ·

Das gibts ja garnicht! :o
Ich zerbreche mir Tage lang den Kopf und Du hast die Antwort in ein Paar minuten 😢

Ach wenn ich doch mehr Zeit hätte, dann wäre PHP schon sehr interessant!

Kann ich das denn auch für einen eigenen Marker (###USERBILD###) verwenden?

typotree ·

Hallo Detlef,

ich denke das mit dem Marker geht auch.

$this->markerArray['###Mein_Marker###'] = '<img src="..." alt="" />';

Die Frage ist nur an welcher Stelle Du dies setzt. Probiere es mal innerhalb dieser Funktion aus und schaue ob er Dir diesen Marker im Template ersetzt. Ich habe mal kurz rüber geschaut, die Marker-Ersetzung findet eigentlich nach diesem Funktionsaufruf statt. Sonst noch mal posten.

Gruß
Martin

dfluess ·

Naja, die Marker-Ersetzung findet eigentlich nicht in diesem Funktionsaufruf statt. Ich hatte dies zum Test da rein gesetzt.

heisst original so

function buildFileUploader($fName, $config, $filenames = array(), $prefix) {

Trotzem hab ichs eben mal mit dem Eintrag versucht. Der Marker wird aber leider nicht ersetzt.

typotree ·

Hallo Detlef,

die Funktionen-Reihenfolge ist 'displayEditScreen'->'displayEditForm'->'addFileUploadMarkers'->'buildFileUploader'. Der Marker für alles ist ###UPLOAD_image### oder ###UPLOAD_PREVIEW_image###. In der Funktion 'displayEditForm' wird

$markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $currentArr);

noch vor

$markerArray = $this->addFileUploadMarkers('image', $markerArray, $currentArr);

aufgerufen. deshalb wird Dein Marker wohl nich erkannt. Schau mal was passiert wenn Du die erste Zeile nochmal nach der zweiten einbaust? Dann müsste er erneut die globalen Marker '$this->markerArray' einbauen, vielleicht macht er es aber auch doppelt (oder andere Nebenwirkungen :o )? Ich habe gerade nicht so viel Zeit zum Testen. Musst Du mal ausprobieren. An anderen Stellen in dieser Datei habe ich mit '$this->markerArray' meine Marker gesetzt und eine Ausgabe im Template an verschiedenen Stellen erreicht.

Gruß
Martin

dfluess ·

Das ist erstmal genug Futter, obwohl ich zugeben muss beim ersten Lesen, nicht viel verstanden zu haben.. o.O

Ich werde versuchen mich da rein zu lesen und probieren....

Hab vielen Dank für Deine breitwillige Hilfe!

Viele Grüße, Detlef

dfluess ·

Bin schon wieder da..
hoffentlich fange ich nicht an zu nerven 😉

Ich hab das nach dem zweiten lesen geschnallt und die Zeile kopiert.
Das Ergebnis ist: Siehe Da, der Marker wird richtig ersetzt ABER alle anderen Marker werden nun nicht mehr erkannt.

Vielleicht hast Du ja später noch einmal Zeit.
DANKE

dfluess ·

HALT..

Habe es ander herum gemacht und

	$markerArray = $this->addFileUploadMarkers('image', $markerArray, $currentArr);

ganz nach oben gesetzt.

Jetzt funktioniert es 😃 .. Nebenwirkungen habe ich NOCH nicht gefunden..

typotree ·

Hallo Detlef,

zum Testen, setze Deinen Marker mal direkt vor der ersten Zeile, also mit absoluter src="...". Ungefähr so

$this->markerArray['###USERBILD##'] = '<img src="..." alt="" />;
$markerArray = $this->cObj->fillInMarkerArray($this->markerArray, $currentArr);

Schaue mal ob dann alle wieder angezeigt werden. Die kopierte Zeile natürlich wieder entfernen.

Gruß
Martin