Ergebnis 1 bis 14 von 14

Thema: [calendar] Events von Frontend-Usern?

  1. #1
    Contao-Nutzer
    Registriert seit
    06.07.2009.
    Beiträge
    114

    Standard [calendar] Events von Frontend-Usern?

    Hallo zusammen.

    Es scheint, als könnten nur Backend-User Events für das Standard-Module 'calendar' verwalten. Frontend-User können Events in dem Kalender nur ansehen und sich höchstens mit der Erweiterung 'simple_event_registration' bei einem Event anmelden. Selber einen Event eintragen können Frontend-User aber nicht.

    Liege ich damit richtig?

    Danke und Gruß
    TypolightNewbie

  2. #2
    Contao-Fan Avatar von Nikolas
    Registriert seit
    22.08.2009.
    Ort
    Lehe
    Beiträge
    493
    User beschenken
    Wunschliste

    Standard

    Du könntest das mit dem EFG Modul versuchen. Also ein Frontendformular erstellen mit dem du die tl_events Tabelle füllen kannst.

    Hab ich zwar selbst noch nicht probiert, sollte aber gehen.

    Gruß
    Nikolas

  3. #3
    Contao-Nutzer
    Registriert seit
    06.07.2009.
    Beiträge
    114

    Standard

    Zitat Zitat von Rundinhio Beitrag anzeigen
    Du könntest das mit dem EFG Modul versuchen. Also ein Frontendformular erstellen mit dem du die tl_events Tabelle füllen kannst.

    Hab ich zwar selbst noch nicht probiert, sollte aber gehen.

    Gruß
    Nikolas
    Ah. Okay. Dann mache ich das so. Guter Tipp.

  4. #4
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Ort
    Deutschland
    Beiträge
    96

    Standard

    Hallo TypoLightNewbie,
    hat das funktioniert??? Bei mir kommen "Datum" und "ZEIT" - Daten, die im Formular eingegeben werden nicht richtig in der Datenbank an!? Hast du (oder sonst jamand) das Problem gelöst?

    Danke, Grüße

  5. #5
    Contao-Nutzer
    Registriert seit
    06.07.2009.
    Beiträge
    114

    Standard

    Zitat Zitat von Wolfi Beitrag anzeigen
    Hallo TypoLightNewbie,
    hat das funktioniert??? Bei mir kommen "Datum" und "ZEIT" - Daten, die im Formular eingegeben werden nicht richtig in der Datenbank an!? Hast du (oder sonst jamand) das Problem gelöst?

    Danke, Grüße
    Hallo Wolfi.

    Leider nein. Tatsächlich bist Du viel weiter als ich!

    Ich habe mir den Backend-Formular-Code zum Erstellen eines Termins angesehen und angefangen, dessen einzelne INPUT-Felder mittels Formulargenerator nacheinander nachzubauen. Ich habe dann zwar ein solches neues Formular fürs Frontend erstellt, aber viele Metadaten erstmal nicht referenzieren können. Metadaten wie Autor oder autorisierte Gruppen soll ein Frontend-User nicht unbedingt sehen und einstellen können. Der "Author" ist er zum Beispiel selber. Ein Eintragen nach dem Insert-Muster {{author}} klappt bei mir nicht. Ich hab das ganze dann erstmal wieder zur Seite gelegt.

    Daß Datum/Uhzeit nicht richtig ankommen, liegt sicher an einem falschen Format, das Du im Formular angibst. Das Backend-Formular unterstützt einen ja mit einem "Date/Time-Chooser". Hast Du den übernommen?

    Gruß
    André

  6. #6
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Ort
    Deutschland
    Beiträge
    96

    Standard

    Ich verwende die ganz normalen Datenfelder, die per Formulargenerator angeboten werden (wie es Rundinhio empfohlen hat); Beim Datum habe ich das "Kalenderfeld" benutzt, welches über die Erweiterung calendarfield möglich ist; Bei der Uhrzeit verwende ich ein Textfeld mit der Eingabeprüfung "Uhrzeit". Der "Date/Time-Chooser" sagt mir bislang nichts - hab ich somit auch noch nicht verwendet.

    Beim Autor habe ich einen "Frontendbenutzer" angelegt und lade diesen über die ID mit einem versteckten Feld. Das funktioniert problemlos.

    Gruß
    Wolfgang

  7. #7
    Contao-Nutzer
    Registriert seit
    06.07.2009.
    Beiträge
    114

    Standard

    Zitat Zitat von Wolfi Beitrag anzeigen
    Der "Date/Time-Chooser" sagt mir bislang nichts - hab ich somit auch noch nicht verwendet.
    Ähm, der Begriff war auch etwas hoch gegriffen. Folgender bekannte Knopf im Backend ermöglicht eine Datumsangabe, die danach PHP-seitig in ein Timestamp-Format umgewandelt wird. Das geschieht bei uns eben (noch) nicht.
    Angehängte Grafiken Angehängte Grafiken

  8. #8
    Contao-Nutzer
    Registriert seit
    22.06.2009.
    Ort
    Bremen
    Beiträge
    229

    Standard

    Nur ein Hinweis auf einen schon etwas älteren Beitrag.

    Allerdings wurde das dort beschriebene Problem (weiße Seite) in der damaligen Contao-Version nicht gelöst. Vielleicht gibt es dort aber einen Hinweis zur Lösung.

    Grüße
    Fryd

  9. #9
    Contao-Nutzer
    Registriert seit
    06.07.2009.
    Beiträge
    114

    Standard Meine Lösung

    Hallo zusammen.

    Ich habe eine Lösung für mich gefunden, die allerdings etwas häßlich ist. Eigentlich braucht es wohl ein ganz eigenes Modul. Aber ich kenne Contao nicht unter der Haube und konnte deswegen nur die bestehenden Module aufbohren. Ich fasse zusammen.

    Das Problem:

    Ich möchte einer Gruppe von Frontend-Usern die Möglichkeit geben, in dem bekannten Standard-Kalender selber eine Veranstaltung (Event) eintragen zu können. Derzeit können das nur autorisierte Backend-User. Des Weiteren sollen Frontend-User zu eingetragenen Veranstaltungen (Events) ihre Teilnahme eintragen können.

    Bemerkung:

    (1) Eigentlich braucht das ein eigenes, neues Modul. Wer sich irgendwann da mal dransetzen möchte, immer her damit. Leider habe ich bislang zu wenig Zeit und Muße, mich so tief in Contao reinzufriemeln.

    (2) Ich habe noch folgende Erweiterung installiert, die natürlich nicht nötig ist: simple_event_registration. Im folgenden verwende ich einige Tabellenfelder mit Prefix "ser_". Diese könnt ihr einfach ignorieren, wenn ihr das nicht nutzen wollt.

    Meine Lösung:

    (a) Event-Formular

    Als erstes Dank an Nikolas (Rundinhio) für den Hinweis auf den Formular-Generator. Tatsächlich läßt sich mit der Möglichkeit, eine Tabelle direkt ansprechen zu können, viel erreichen. Ein Bild sagt mehr als tausend Worte. Also:


    Als Auswahl-Modul für Datum und Uhrzeit habe ich xdependentcalendarfields bzw. formtimeselection (findet ihr unter der Rubrik "Uhrzeit") benutzt. Danke an Wolfgang (Wolfi) für den Tipp! Achtet bei der Konfiguration des Datums (xdependentcalendarfields) darauf, auf keinen Fall "Heutiges Datum" mit Haken zu aktivieren! Sonst greift ein Bug im Frontend.

    Das sind jetzt die sichtbaren Felder, die für meinen Fall schon ausreichen. Es braucht jetzt noch unsichtbare Felder, die ich aus Platzgründen textuell anhänge:

    Versteckte Felder und Werte:
    pid: 1
    published: 1
    ser_register: 1
    author: 1
    ser_email: {{user::email}}
    endDate: [kein Wert]
    startTime: [kein Wert]
    endTime: [kein Wert]

    Sachen wie pid oder author brauche ich für meinen simplen Anwendungsfall nicht. Deshalb erlaube ich mir, damit Schindluder zu treiben und setze sie einfach auf "1". Für andere von euch kann das anders sein. Ich habe auch nirgendwo lesen können, was pid genau macht. Also ignorier ich das einfach. Warum ich endDate, startTime und endTime noch brauche, erfahrt ihr unten.

    Unter den Eigenschaften des Formulars setze ich als Aktion die Tabelle 'tl_calendar_events':



    (b) Datumsformat konvertieren

    Jetzt kommt das von Wolfgang beschriebene Riesenproblem mit dem Datumsformat. Im Formular ist das Datum per bequemen Datumswähler einfach ein Text mit folgendem Format: TT-MM-JJJJ (oder Englisch: DD-MM-YYYY). Das versteht die Contao-DB nicht, die fast überall mit Unix-Timestamps arbeitet. Also muß das vor dem Speichern konvertiert werden. Da ich in der Backend-Programmierung so fast Null drinsteck, konvertiere ich das im Frontend mit dem Schmerz, der da Javascript heißt. In Themes/Seitenlayout zu der Seite kommt im Bereich "Zusätzliche <head>-Tags" folgender Code.

    Code:
    <script language="javascript" type="text/javascript">
      function convertTimestamp()
      {
        var startDateElem = document.getElementsByName("startDate");
        var endDateElem = document.getElementsByName("endDate");
        var startTimeHElem = document.getElementsByName("time[H]");
        var startTimeMElem = document.getElementsByName("time[i]");
        var startTimeElem = document.getElementsByName("startTime");
        var endTimeElem = document.getElementsByName("endTime");
    
        if (startTimeHElem.length > 0 && startTimeMElem.length > 0 &&
            startDateElem.length > 0 && endDateElem.length > 0 &&
            startTimeElem.length > 0 && endTimeElem.length > 0)
        {
          var timeCode = startTimeHElem[0].value + ":" + startTimeMElem[0].value;
          var timeStamp = dateToUnixTimestamp(startDateElem[0].value, timeCode);
    
          startDateElem[0].value = timeStamp;
          endDateElem[0].value = timeStamp;
          startTimeElem[0].value = timeStamp;
          endTimeElem[0].value = timeStamp;
        }
      }
    
      function dateToUnixTimestamp(aDateString, aTimeString)
      {
        var day = aDateString.substr(0, 2);
        var month = aDateString.substr(3, 2) - 1;
        var year = aDateString.substr(6, 4);
        var hour = aTimeString.substr(0, 2);
        var minutes = aTimeString.substr(3, 2);
        var dateObject = new Date(Date.UTC(year, month, day, hour, minutes, 0));
        var unixTimestamp = (dateObject.getTime() / 1000.0);
        return unixTimestamp;
      }
    </script>
    (Vielleicht könnt ihr das auch unter "Eigener JavaScript-Code" ablegen. Ich hatte damit mal Probleme, also hab ich es in <head> gepackt.)

    Diese Funktion konvertiert ziemlich billo das Format von den Datums- und Zeit-Feldern in das nötige UNIX-Timestamp-Format und legt es in die Felder startDate, endDate, startTime und endTime ab. Wenn ihr eine ausgefuchstere Verwaltung braucht, zum Beispiel für eine Veranstaltung, die über mehrere Tage gehen kann, muß man diesen Code entsprechend verbessern.

    Um dieses ECMA-Script bei einem Submit abzufeuern, mußte ich jetzt leider ganz häßlich in die Code-Erzeugung des Formulars eingreifen. Das geschieht in ./system/modules/frontend/FormSubmit.php.

    Code:
    	public function generate()
    	{
    		if ($this->imageSubmit && is_file(TL_ROOT . '/' . $this->singleSRC))
    		{
    			return sprintf('<input type="image" src="%s" id="ctrl_%s" onClick="convertTimestamp();submit()" class="submit%s" alt="%s" value="%s"%s />',
    							$this->singleSRC,
    							$this->strId,
    							(strlen($this->strClass) ? ' ' . $this->strClass : ''),
    							specialchars($this->slabel),
    							specialchars($this->slabel),
    							$this->getAttributes());
    		}
    
    		return sprintf('<input type="button" id="ctrl_%s" onClick="convertTimestamp();submit()" class="submit%s" value="%s"%s />',
    						$this->strId,
    						(strlen($this->strClass) ? ' ' . $this->strClass : ''),
    						specialchars($this->slabel),
    						$this->getAttributes());
    	}
    }
    Entscheidend sind die Zeilen 95
    return sprintf('<input type="image" src="%s" id="ctrl_%s" onClick="convertTimestamp();submit()" class="submit%s" alt="%s" value="%s"%s />',
    bzw. 104
    return sprintf('<input type="button" id="ctrl_%s" onClick="convertTimestamp();submit()" class="submit%s" value="%s"%s />',

    Ob diese Veränderung einer Contao-Aktualisierung standhält, weiß ich nicht. Außerdem wird jetzt leider bei jedem erzeugten Formular immer die Javascript-Funktion convertTimestamp() aufgerufen. Unschön, aber zumindest wird kein Schaden angerichtet.

    Als letztes kommt eine weitere Unschönheit. Der Formulargenerator schreibt alle vorgefundenen Werte stoisch in die angegebene Tabelle 'tl_calendar_events'. Eine Möglichkeit, hier zu filtern, gibt es nicht. Die Konvertierungsfunktion holt sich die Uhrzeit-Daten aus zwei Feldern für Stunde und Minute (time[H] und time[i]), um diese anschließend zu manipulieren und in das für die Tabelle nötige Feld startTime, etc. zu übertragen. Leider versucht der Formulargenerator auch die Daten des Feldes "time" zu speichern. (Einen Haken, um das zu deaktivieren, gibt es leider nicht.) Um mich nicht groß aufzuhalten, habe ich dieses Problem (genervt) mit einem kurzen
    Code:
    ALTER TABLE `tl_calendar_events` ADD `time` VARCHAR( 20 );
    gelöst.

    Schöne Feiertage

  10. #10
    Contao-Nutzer
    Registriert seit
    25.05.2010.
    Beiträge
    75

    Standard

    hallo TypoLightNewbie

    vielen dank für dein tolles tutorial. jedoch ne frage:

    gibt es bis heute keine "schönere" möglichkeit, dan unix-timestamp "einfacher" herzustellen?

    oder ist dein weg, mit den codes einfügen "100%" sicher und funktionsfähig?

    werden mit deinem code noch anderso oder so daten umgerechnet?

    gruss

  11. #11
    Contao-Nutzer
    Registriert seit
    06.07.2009.
    Beiträge
    114

    Standard

    Zitat Zitat von fbo_bern Beitrag anzeigen
    hallo TypoLightNewbie

    vielen dank für dein tolles tutorial. jedoch ne frage:

    gibt es bis heute keine "schönere" möglichkeit, dan unix-timestamp "einfacher" herzustellen?

    oder ist dein weg, mit den codes einfügen "100%" sicher und funktionsfähig?

    werden mit deinem code noch anderso oder so daten umgerechnet?

    gruss
    Hallo fbo

    Wenn es dir nur um einen UNIX-Timestamp geht, kannst Du den Clientseitig sicher mit einer Javascript-Lib erzeugen. Vielleicht jQuery? Und Serverseitig gibt es sicher in PHP auch einen Einzeiler dazu. Kurz: Ja, sollte es geben. Hab ich aber nicht gefunden.

    Den Kram oben, den ich für das spezielle Problem geschrieben hatte, liest die Werte aus den Felden und wandelt dann in einer eigenen Funktion um. War zu der Stunde das beste, das ich zusammenzimmern konnte und es funktioniert. Kenne aber Javascript nicht gut und bin sicherlich auch kein Fan von PHP. Sorry.

  12. #12
    Contao-Nutzer
    Registriert seit
    11.02.2010.
    Ort
    Zürich
    Beiträge
    37

    Standard

    Also eigentlich kann man mit strtotime das lösen...
    Ich habe für eine Frontend-Event-Eingabe ein processFormData Hook gemacht, dann kann man alle Daten selber weiterverarbeiten und in die DB speichern...

  13. #13
    Contao-Nutzer
    Registriert seit
    19.06.2009.
    Ort
    Deutschland
    Beiträge
    96

    Standard

    Hallo bensolution,
    danke für den Tipp mit strtotime!
    Würdest du uns für diesen konkreten Fall (Datum / Uhrzeit) noch den ganzen Code verraten?
    Schon mal vielen Dank!

  14. #14
    Contao-Nutzer
    Registriert seit
    11.02.2010.
    Ort
    Zürich
    Beiträge
    37

    Standard

    Also wenn Du zum Beispiel über den Hook gehst solltest Du noch überprüfen welches Formular es betrifft:
    PHP-Code:
    if ($arrForm['id'] == 'Deine FormularID'
        { ...} 
    Nun musst Du aber alles selber in die DB speichern, das ist der Nachteil dieses Hooks. Eventuell wäre diesen hier besser. Auf jedenfall kannst Du nun Zeit und Datum so in das richtige Format bringen:
    PHP-Code:
    $startDate $this->Input->post('startDate');
    $startTime $this->Input->post('startTime');
    $startTime strtotime($startDate.$startTime);
    $endDate $this->Input->post('endDate');
    $endTime $this->Input->post('endTime');
    $endTime strtotime($endDate.$endTime); 
    Ich hoffe, ich konnte weiter helfen.

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. [calendar_editor] Kalender-Events im Frontend bearbeiten
    Von Gausi im Forum Sonstige Erweiterungen
    Antworten: 296
    Letzter Beitrag: 15.01.2024, 14:07
  2. Events per Frontend eintragen (immernoch kein Modul in Sicht?)
    Von fbo_bern im Forum Nachrichten/Events/FAQ
    Antworten: 16
    Letzter Beitrag: 05.04.2011, 10:19
  3. Events - Calendar Modul
    Von schneeheinz im Forum Nachrichten/Events/FAQ
    Antworten: 3
    Letzter Beitrag: 07.12.2010, 09:09
  4. Events im Frontend eintragen und automatisch nach Datum sortieren
    Von Sonnenstrahl im Forum Was kann Contao?
    Antworten: 3
    Letzter Beitrag: 03.12.2010, 19:08
  5. Events vom Frontend aus eintragen
    Von alphasix im Forum Nachrichten/Events/FAQ
    Antworten: 2
    Letzter Beitrag: 22.12.2009, 23:04

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •