WBCE CMS Forum

WBCE CMS – Way Better Content Editing.

Du bist nicht angemeldet.

#1 03.11.2020 18:03:38

wb_user82
Mitglied

Kleiner Tipp: mpForm für Veranstaltungsanmeldungen

Hallo allerseits,

folgender Sachverhalt: die Betreiber einer Internetseite führen regelmäßige Veranstaltungen durch, bei denen aufgrund der Corona-Situation eine Voranmeldung mit Kontaktdaten (z.B. Telefonnummer, Adresse) von Nöten ist. Die Anmeldung erfolgt über ein mpForm-Formular, bei dem die Kontaktdaten aufgenommen werden sowie die Veranstaltungen, für die sich die Person anmeldet. In einem gesperrten Bereich (nur für Mitarbeiter) gibt es dann eine Seite, auf der die Anmeldungen für eine Veranstaltung eingesehen und ausgedruckt werden können (für gesetzlich vorgeschriebene Aufbewahrung der Kontakte).

Das habe ich in den letzten Wochen realisiert und möchte den Code mal zur Verfügung stellen in der Hoffnung, dass es dem einen oder anderen für vergleichbare Zwecke nützlich sein mag (natürlich ohne Gewähr).

Was ihr tun müsst:

  1. Erstellt eine mpForm-Seite mit beliebig vielen Feldern (Name, Telefonnummer etc.) aber min. ein Feld für die Veranstaltung als Checkbox. Fügt dort die benötigten Veranstaltungen ein.

  2. Notiert euch die IDs (im Backend auf der entsprechenden Seite zu finden).

  3. Findet die zugehörige Datentabelle im Adminer (meistens in der Form wbce_mod_mpform_results_???)

  4. Erstellt euch eine neue Seite mit einem Code2-Block. Wichtig: Setzt die Zugangsrechte dieser Seite so, dass nur authorisierte Nutzer darauf Zugriff erlangen können.

Alle Stellen, wo ein ToDo auftauchen, müssen angepasst werden, genau so wie die Darstellung der Tabelle.

Dort fügt nach Anpassung folgenden Code ein:

[== PHP ==]
global $database, $wb, $wb_inst;

// Funktion formatiert Namen in der Form 'Zuname, Vorname' - optional
function parseName($name) {
  
  $name = trim($name);
  if (strpos($name, ",") != FALSE) return $name;
  //Für den Fall, dass nur ein Name angegeben wird, wird impliziert, dass dieser Vorname darstellt.
  if (str_word_count($name) == 1) return $name;
  $teile = explode(" ", $name);
  $teileCount = count($teile);
  $nameNeu = $teile[$teileCount-1] . ", ";
  for ($i = 0; $i<$teileCount-1; $i++) {
    $nameNeu = $nameNeu . " " . $teile[$i];
  }
  return ucwords($nameNeu);
}

function databaseQuery() {
  global $database, $wb, $wb_inst;
  	// ToDo: Felder und Tabelle müssen angepasst werden
  	$registrationListQuery = <<<SQL
	SELECT field73 as Name, field75 as Mail, field77 as Event, field78 as Telefon, field79 as Adresse
	From wbce_mod_mpform_results_215
	Order by submission_id;
	SQL;
	return $database->query($registrationListQuery);
}

function printEvent($queryResult, $event) {
	//ToDo: Die Tabelle ggf. an die Felder und die Abfrage anpassen!
	print("<h1>Teilnehmerliste</h1>");
  print('Name: '.$event); 
	print('<p><table border="2" cellpadding="1" cellspacing="1" style="width: 100%;">');
	print('<thead>');
	print('<tr height=40><th>Nr</th><th>Name</th><th>E-Mail</th><th>Telefonnummer</th><th>Adresse</th><th>TN</th></tr>');
	print('</thead>');
	print('<tbody>');
  $nr = 1;
	while ($row = $queryResult->fetchRow()) {
      if (strpos($row[2],$event) !== False) {
  		print('<tr height=40><td>'.$nr.'</td><td>'.parseName($row[0]).'</td>'.'<td>'.str_replace('@', '@&#8203;',$row[1]).'</td>'.'<td>'.$row[3].'</td>'.'<td>'.$row[4].'</td><td></td>');
      $nr++;
      }
	}
    }
	print('</tbody>');
	print('</table></p>');
}

function optionQuery() {
  global $database;
  	$listQuery = <<<SQL
	SELECT value as Options
	From wbce_mod_mpform_fields
	Where field_id = 77; // ToDo: Hier die ID des CheckBox-Feld eintragen, welche die Veranstaltungen enthält, für die man sich anmelden kann.
	SQL;
	return $database->query($listQuery);
}

function getEventList() {
  $queryRequest = optionQuery();
  $eventString = $queryRequest->fetchRow()[0];
  $events = explode(",",$eventString);
  return $events;
}
function getEventNameByNumber($number) {
  $events = getEventList();
  return $events[$number];
}

function printStartPage() {
  print('<h1>Anmeldeverzeichnis</h1>');
  print("<p>Bitte hier die Veranstaltung auswählen, für welche die Teilnehmerliste generiert werden soll. Im Anschluss kann die Liste ausgedruckt werden.:</p>");
  $events = getEventList();
  $eventCount = count($events);
  print('<p><ul>');
  for ($i = 0; $i <= $eventCount-1; $i++) {
    print('<li><a href="?event='.$i.'">'.$events[$i].'</a></li>');
  }
  print('</ul></p>');
}

if (!isset($_GET["event"])) {
  printStartPage();
} else {
  printEvent(databaseQuery(), getEventNameByNumber($_GET["event"]));
}

Danach habt ihr ein simples Tool, womit ihr Anmeldungen unkompliziert verwalten könnt - meiner Meinung nach viel besser als bei manch kommerziellen Anbietern. Ich war selbst überrascht, wie einfach es geht, die Daten von mpForm dafür auszuwerten. Aber mpForm eignet sich sehr gut für solche Zwecke (und ist zudem sicherer als manch selbst zusammengebautes Formular).

Ich hoffe, ich kann damit vielleicht ein wenig behilflich sein. Bei Fragen, fragt gerne.

Offline

Liked by:

ice, berny, jean, hpzaun, mrbaseman, awuest, cyberdyne

#2 19.11.2020 23:31:58

hpzaun
Mitglied

Re: Kleiner Tipp: mpForm für Veranstaltungsanmeldungen

Hallo wb_user82,
Die Idee und Umsetzung finde ich sehr gut. thumb_up
Ich habe zwei kleine Fragen:
1. Wenn ich nur eine Veranstaltung habe, kann ich die Checkbox-Teile aus dem Formular und Code2-Teil weglassen?
2. Warum hat du mpForm genommen? miniform ist bei WBCE CMS vorinstalliert. Würde es auch damit gehen?

Und eine Anmerkung: Ist aber wahrscheinlich zuviel für eine einfache Umsetzung.
Könnte eine maximale Personenanzahl vorgegeben werden und bei jedem Absenden diese um 1 hochgezählt werden?
Bei Erreichen der Maximal-Anzahl sollte das Formular gesperrt werden(oder Link auf andere Seite)  mit  Sorry voll belegt.
Bin dann ja fast bei einem Buchungs-Tool.

Schöne Grüße
hpzaun

Offline

#3 19.01.2021 19:57:46

wb_user82
Mitglied

Re: Kleiner Tipp: mpForm für Veranstaltungsanmeldungen

Hallo hpzaun,

ich bitte, die späte Antwort zu entschuldigen. Ich habe deine zwei Fragen gerade nur per Zufall entdeckt – anscheinend hatte ich vergessen, das Thema zu abonnieren, oder die Mail ist im Spam-Ordner gelandet.

Ich hoffe, dass die Fragen noch aktuell sind...

hpzaun schrieb:

1. Wenn ich nur eine Veranstaltung habe, kann ich die Checkbox-Teile aus dem Formular und Code2-Teil weglassen?

Am Einfachsten ist es hier, einfach die Checkboxen mit einer Auswahlmöglichkeit (der Veranstaltung) beizubehalten, diese standardmäßig ausgewählt zu lassen und als Pflichtfeld zu definieren. Oder aber man ändert entsprechend den Code, das geht natürlich auch. Da ist es aber wichtig, quasi alle Filter und If-Abfragen zu erwischen, wo es um die Veranstaltungen geht.

hpzaun schrieb:

2. Warum hat du mpForm genommen? miniform ist bei WBCE CMS vorinstalliert. Würde es auch damit gehen?

Soweit ich weiß, speichert Miniform nicht die einzelnen Felder in eine Datenbank, sondern nur einen aus dem Formular generierten HTML-Code (der dann die Felde und Werte enthält). Das macht das Parsen jedoch deutlich schwieriger. mpForm kann man auch responsiv machen und ist für sowas wahrscheinlich die bessere Wahl.

hpzaun schrieb:

Und eine Anmerkung: Ist aber wahrscheinlich zuviel für eine einfache Umsetzung.
Könnte eine maximale Personenanzahl vorgegeben werden und bei jedem Absenden diese um 1 hochgezählt werden?
Bei Erreichen der Maximal-Anzahl sollte das Formular gesperrt werden(oder Link auf andere Seite)  mit  Sorry voll belegt.
Bin dann ja fast bei einem Buchungs-Tool.

Das sollte eigentlich nicht so schwer umzusetzen sein. Meine spontane Idee wäre folgende: Die Zahl der Anmeldungen lässt sich ja recht einfach ermitteln (bzw. wird das im Code streng genommen schon gemacht). Dann könnte man eine Seite mit dem Formular anlegen, diese jedoch privat oder versteckt machen, und an dem Ort, wo es hin soll, einen weitere Code2-Block anlegen, der die Bedingung überprüft und dann den Block mit dem Formular einbindet oder eben nicht. Die Einbindung erfolgt mit dem Droplet 

[[SectionPicker?sid=BlockID]]

Dabei ist BlockID natürlich durch die ID des jeweiligen Blocks zu ersetzen.

Ich hoffe, ich konnte dir erst mal weiterhelfen (oder dem einen oder anderen stillen Mitleser smile )

Beitrag geändert von wb_user82 (19.01.2021 19:58:15)

Offline

Liked by:

hpzaun

#4 21.02.2022 11:06:50

cyberdyne
Mitglied

Re: Kleiner Tipp: mpForm für Veranstaltungsanmeldungen

Hallo,
hab das mal nach 'ToDo' Anleitung ausprobiert, erhalte aber bei der Code2 nur eine weiße Seite angezeigt. Errorlog sagt

There was an unknown exception: syntax error, unexpected '==' (T_IS_EQUAL), expecting ']' in line (4) 

Das letzte Update des Moduls ist 1 Jahr jünger, wie dieser kleine Tipp. Kann es sein, dass dies dergestalt wie aufgeführt nicht mehr funktioniert?

Viele Grüße,
Klaus


Macht's gut und danke für den Fisch!

Online

#5 21.02.2022 11:09:32

wb_user82
Mitglied

Re: Kleiner Tipp: mpForm für Veranstaltungsanmeldungen

Hallo cyberdyne,

die erste Zeile [== PHP ==] ist nur für das Syntaxhighligting gedacht und sollte nicht im Code enthalten sein. Also diese Zeile bitte rauslöschen.

Viele Grüße!

Offline

Liked by:

cyberdyne

#6 21.02.2022 13:03:24

cyberdyne
Mitglied

Re: Kleiner Tipp: mpForm für Veranstaltungsanmeldungen

wb_user82 schrieb:

die erste Zeile [== PHP ==] ist nur für das Syntaxhighligting gedacht und sollte nicht im Code enthalten sein. Also diese Zeile bitte rauslöschen.

Hallo,
vielen Dank für die schnelle Hilfe. Nun hängt es an anderer Stelle ...

[== PHP ==]
function optionQuery() {
  global $database;
  	$listQuery = <<<SQL
	SELECT value as Options
	From cbs_mod_mpform_fields
	Where field_id = 21;
	SQL;
	return $database->query($listQuery);
}
syntax error, unexpected '}', expecting end of file in line (49)

Line (49) wäre "global $database;" wobei ich meine dass immer 3 Zeilennummern hinzu gezählt werden müssen im Editor.

Viele Grüße,
Klaus

PS: habe mal das gesamte File angehängt.


Macht's gut und danke für den Fisch!

Online

#7 21.02.2022 14:30:01

webbird
Administrator

Re: Kleiner Tipp: mpForm für Veranstaltungsanmeldungen

Die Zeile
SQL;
darf nicht eingerückt werden.

Eine Konvention besteht darin, das der beendende Ausdruck alleine in einer neuen Zeile stehen, und von einem Semikolon abgeschlossen sein muss, sowie dass er nicht mit einem Leerzeichen beginnen darf.

https://www.php-space.info/php/space/heredoc-syntax.php

Das ist mit ein Grund, warum ich die heredoc-Syntax nicht mag. Ich mag es, Code sauber einzurücken, und die Zeile fällt mir dann ständig ins Auge.

Beitrag geändert von webbird (21.02.2022 14:33:58)


Ich habe eine Amazon-Wishlist. wink Oder spende an das Projekt.
Ich kann, wenn ich will, aber wer will, dass ich muss, kann mich mal

Offline

Fußzeile des Forums

up