[efg] + [sessionform] für Event-Eingabe im Frontend?

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • Fryd
    Contao-Nutzer
    • 22.06.2009
    • 249

    #1

    [efg] + [sessionform] für Event-Eingabe im Frontend?

    Hallo zusammen,

    ich suche eine Möglichkeit, mit der ich als php-Dilettant Frontend-Usern die Eingabe von Events zu ermöglichen kann.
    Eine Idee wurde vor kurzem hier vorgestellt, aber das übersteigt meine Fähigkeiten.

    Folgende Idee:
    1) Eingabe der Daten über efg. Eingabe beenden durch "Überprüfen"-Button.
    2) Ausgabe der Daten auf der zweiten Seite (sessionform) und dabei über die Berechnen-Funktionen Konvertierung des Datumformates. Vorgang abschließen durch "Abschicken"-Button.
    3) Speichern der Werte in der Event-Datenbank.

    Kann das funktionieren?
    Welche Formel/Formeln brauche ich für die Konvertierung? In php?

    Herzliche Grüße
    Fryd
  • Gausi
    Contao-Nutzer
    • 04.09.2009
    • 149

    #2
    Hallo,
    ich bin selber PHP-Dilettant, hab dass aber soweit hinbekommen - ich bin nur noch nicht sicher, ob das "sicher" ist.

    Auf dem Formular habe ich Textfelder für Titel (heißt bei mir title_copy), startDate, endDate, startTime, endTime (jeweils mit Eingabeprüfung auf Datum bzw. Zeit), zwei Textareas für teaser und details, ein SelectMenu (ort) für die css-Klasse und eine CheckBox für published mit dem Wert 1. Zusätzlich ein verstecktes Feld pid (für die ID des Kalenders, in das der Termin eingetragen werden soll) und ein Feld "alias_copy".
    In den Formular-Optionen habe ich "Daten im Modul "Formular-Daten" speichern" aktiviert (aber nicht direkt in die tl_calender_events)

    Das läuft bei mir dann alles über den efg, mit einem Hook auf processEfgFormData. Dazu in der Datei system/config/dcaconfig.php so eine Zeile ergänzen

    PHP-Code:
    $GLOBALS['TL_HOOKS']['processEfgFormData']['TerminForm'] = array('eventEfgFuncs', 'processSBData'); 
    
    Den Wert 'TerminForm' kannst du frei wählen, ebenso das auf der rechten Seite. Das muss dann aber auch im Code unten entsprechend verändert werden (und afaik auch der Dateiname).

    unter modules/efg habe ich dann eine Datei eventEfgFuncs.php angelegt, die dann die Werte aus dem Formular konvertiert und in den Kalender schreibt.

    Damit später über das Modul "Formulardaten auflisten" auch eine Änderung im Kalender möglich ist, verpasse ich dem Event ein eigenes alias (titel säubern und timestamp dranhängen), was ich auch in den Formulardaten im Feld alias_copy speichere. Beim Bearbeiten kann ich über alias_copy das passende Event im Kalender (hat bei mir die pid 7) finden und updaten.

    Kein Garantie, dass das alles richtig ist, aber bisher waren meine Tests mit der Version recht erfolgreich.

    PHP-Code:
    <?php
        class eventEfgFuncs extends Backend
        {
    
            public function processSBData($arrToSave, $arrFiles, $intOldId, &$arrForm)
            {
            if ($arrForm['id'] == '21')
            {
    
                    $startDate = strtotime($arrToSave['startDate']);
    
                    if ($intOldId == 0)
                    {
                            // create new alias
                         $alias = str_replace(' ','-',($arrToSave['title_copy'])).time();
                         $alias = preg_replace('/[^(\x20-\x7F)]*/','', $alias);
                        $arrToSave['alias_copy'] = $alias;
                    }
                    else
                    {
                            // use existing alias
                               $alias = $arrToSave['alias_copy'];
                    }
    
                    $arrEvent = array
                            (
                             'pid' => $arrToSave['pid'],
                             'alias' => $alias,
                             'author' => 1,
                             'tstamp' => $startDate,
                             'title' => $arrToSave['title_copy'],
                             'teaser' => $arrToSave['teaser'],
                             'details' => $arrToSave['details'],
                             'startDate' => $startDate,
                             'cssClass' => $arrToSave['ort'],
                             'published' => $arrToSave['published']
                            );
    
                    $trimmed = trim($arrToSave['endDate']);
                    if ($trimmed != '')
                    {
                             $endDate = strtotime($arrToSave['endDate']);
                             $arrEvent['endDate'] = $endDate;
    
                             $endDateStr = $arrToSave['endDate'];
                    }
                    else
                    {
                             $arrEvent['endDate'] = NULL;
                             // needed later
                             $endDateStr = $arrToSave['startDate'];
                //$endDate = strtotime($arrToSave['endDate']);
                    }
    
                    $trimmed = trim($arrToSave['startTime']);
                    if ($trimmed == '')
                    {
                            $useTime = '';
                             $arrEvent['addTime'] = '';
                             $arrEvent['startTime'] = $startDate;
                    } else
                    {
                             $useTime = '1';
                             $startTime = strtotime($arrToSave['startDate'].' '.$arrToSave['startTime']);
                             $arrEvent['addTime'] = '1';
                             $arrEvent['startTime'] = $startTime;
                    }
    
                    $trimmed = trim($arrToSave['endTime']);
                    if ($trimmed == '')
                    {
                            $endTime = strtotime($endDateStr.' '.$arrToSave['startTime']);
                             if ($useTime == '1')
                             {
                                 $arrEvent['endTime'] = $endTime;
                             } else
                             {
                                 $arrEvent['endTime'] = $endTime; //NULL;
                             }
                    }
                    else
                    {
                            if ($useTime == '1')
                             {
                                 $endTime = strtotime($endDateStr.' '.$arrToSave['endTime']);
                                $arrEvent['endTime'] = $endTime;
                             }
                    }
    
                    if ($intOldId == 0)
                    {
                             // create new entry
                             $objInsert = $this->Database->prepare('INSERT INTO tl_calendar_events %s')->set($arrEvent)->execute();
                    }
                    else
                    {
                // update existing entry
                                 $objUpdate = $this->Database->prepare("UPDATE tl_calendar_events %s WHERE pid='7' AND alias='".$alias."'")->set($arrEvent)->execute();
                    }
             }
    
             return $arrToSave;
    
            }
        }
    ?>
    All of this has happened before - but the question remains: Does all of this have to happen again?

    Kommentar

    • folkfreund
      Contao-Urgestein
      • 09.04.2010
      • 1928

      #3
      Hallo Gausi,

      Ich habe deinen Tipp aus dem anderen Thread befolgt und geprüft.

      Das Ganze wird updatesicher, wenn du anstatt /system/config/dcaconfig.php anzupassen, die betreffende Zeile in die Datei system/modules/x_MeinModul/config/config.php einfügst, also z.B.
      PHP-Code:
      <?php if (!defined('TL_ROOT')) die('You can not access this file directly!');
      $GLOBALS['TL_HOOKS']['processEfgFormData']['TerminForm'] = array('eventEfgFuncs', 'processSBData');
      ?>
      Und deinen PHP-Code in system/modules/x_MeinModul/eventEfgFuncs.php ablegst.

      Wichtig: das Modul x_MeinModul muss einen Namen haben, der alphabetisch hinter dem EFG liegt, da Contao die Module in dieser Reihenfolge liest. Falls du sowieso schon ein eigenes Modul auf deiner Seite hast, dann kannst du die Datei und die Anpassung der config.php natürlich auch darin machen - aber vielleicht ist die Funktionalität ja auch generell interessant (jedenfalls nach der Zahl der Threads zu diesem Thema zu urteilen).

      Gruß,
      folkfreund

      Kommentar

      Lädt...