Ergebnis 1 bis 5 von 5

Thema: Formular verstecken wenn es schon einmal abgesendet wurde.

  1. #1
    Gesperrt
    Registriert seit
    23.10.2014.
    Ort
    Erfurt
    Beiträge
    14

    Standard Formular verstecken wenn es schon einmal abgesendet wurde.

    Hallo Community,

    ich sitze immer noch an dem kleinen Projekt mit der Essensbestellseite. Mein Problem ist diesmal, das die Bestellung des Mittagsmenü nur einmal abgesendet/sichtbar werden soll. (Bestellen können nur angemeldete benutzer)
    Hier mal mein ablauf:
    • Benutzer meldet sich auf der Seite an
    • Wählt die Kalenderwoche für die er Bestellen möchte
    • bekommt eine Seite mit dem Speiseplan zu sehen, unter dem Plan ist ein einfaches (efg) Formular zum Bestellen
    • Benutzer sendet die Bestellung ab
    • Benutzer wird auf seine Seite mit der Übersicht seiner Bestellungen weitergeleitet
    • Benutzer möchte für noch eine Woche bestellen und geht auf die Seite mit der Liste der Speisepläne
    • wenn der Benutzer jetzt noch einmal die selbe Kalenderwoche auswählt, sieht er nur noch den Speiseplan, aber nicht mehr das Bestellformular. Statt dessen ein Hinweis, dass er schon einmal bestellt hat.


    Wer das ganze mal im Versuchsaufbau sehen möchte, kann auf http://www.wunschbuffet-erfurt.de das ganze mal testen. Da ich keine möglichkeit eines Spoliers gefunden habe, der nur für angemeldete Benutzer sichtbar ist, müssen die Test-Benutzerzugansdaten per PN erfragt werden.

    Grüße aus Erfurt
    Thilo

  2. #2
    Contao-Nutzer Avatar von Traumkunst
    Registriert seit
    22.01.2011.
    Ort
    In der Nähe von Dortmund
    Beiträge
    229

    Standard

    Das ist aus der Ferne relativ schwer zu sagen, aber im Grunde gäbe es ja zwei Möglichkeiten, diese Information abzulegen:
    - DB-seitige Speicherung einer User-Info (z.B. "2014-45" = User hat für KW 45 schon bestellt o.ä.)
    - Cookie-seitige Speicherung, dann hält das natürlich nur für die aktuelle Sitzung bzw. bis der User das Cookie löscht

    Man könnte das Formular dann erweitern um ein unsichtbares Feld (z.B. "woche = 2014-45"), und dieses Feld auf der entgegennehmenden Seite (also wo die Werte hin-gepostet werden) dazu verwenden, die User-Info in die DB zu schreiben oder das Cookie zu setzen. Hierzu könnte die Erweiterung inputvar genutzt werden.

    Anschließend muss auf der Seite mit dem Speiseplan ausgewertet werden, ob schon in dieser KW bestellt wurde. Das ließe sich auf verschiedene Weise machen, z.B. durch den Einbau eines eigenen HTML-Moduls oder einer eigenen PHP-Datei, die die entsprechende Abfrage durchführt, und dann dafür sorgt, dass das Formular nicht angezeigt wird. Im einfachsten Fall z.B. durch das Vergeben einer Klasse. So könnte ich z.B. dem BODY die Klasse o2014-45 vergeben, und dann per CSS das Formular aus- und den Hinweis einblenden. Oder einen eigenen Wrapper um das Formular legen (händisch oder mit dieser Erweiterung), darin als erstes mein HTML-Modul mit der Abfrage einsetzen, von dort aus wird dann entschieden, ob das folgende Formular angezeigt wird oder nicht (z.B. per Setzen eines eigenen DIVs mit display=none bzw. block).

    Wie gesagt, so aus der Ferne etwas schwer, und müsste sicherlich ein bisschen herumprobiert werden. Aber das wären so meine ersten gedanklichen Ansätze dazu. Vielleicht scheint ja was nützliches dabei zu sein (muss aber nicht )

    Eine "einfache" Möglichkeit, mit der man das "mal eben so" macht, wüsste ich leider nicht; mit Contao-Bordmitteln geht sowas m.W. definitiv nicht, man kommt hier um die Indiviual-Programmierung nicht herum.

    Viele Grüße,
    Frank

  3. #3
    Gesperrt
    Registriert seit
    23.10.2014.
    Ort
    Erfurt
    Beiträge
    14

    HTML

    @Traumkunst: danke für deinen Post. So ähnlich hatte ich auch schon angefangen. Doch du hast mir noch einen Fehler aufgezeigt der mir Unterlaufen ist. Das unsichbare Feld habe ich schon eingebaut, doch ich wolte nur die Wochennummer an sich Speichern. Das führt aber zu Dopplungen der Kalenderwoche, wenn die Datensätze der Bestellungen nicht regelmäßig gelöcht werden. Daher habe ich die Jahreszahl, wie in deinem Post hinzugefügt.

    Hier mal meine "quick and Durty" umsetzung:
    • Anpassen des Templates "event_full.html5", um die Informationen in den versteckten Felder des Formulares nutzen zu können
      PHP-Code:
      <?php 
        
      // setzten der Variablen für das Formular
        
        // Bestimmung der Kalenderwoche aus dem Alias-Feld des Events
        
      $arrString =  str_split($GLOBALS[_GET][auto_item],2);
        
      $GLOBALS[_GET][KW] = $this->parseDate("Y"$this->begin)."-".$arrString[0];
       
        
      // Setzten der Zeitangabe bis wann die Bestellung unter 
        //"Meine Bestellungen" angezeigt werden soll
        
      $GLOBALS[_GET][ShowUntil] = $this->parseDate("YmdHis"$this->stop);
        
      ?>
    • Anpassen des Templates "form.html5", um das Formular ausblenden zu können. Bzw. einblenden eines Hinweises
      PHP-Code:
      <?php
          
      //Informationen suchen und aufbereiten
          
      $objMember FrontendUser::getInstance();
          
      $mpMemberData $objMember->getData();
          
          
      $objDatabase = \Database::getInstance();
          
          
      $resMemberGroups $objDatabase->prepare("
              SELECT  id
              FROM    tl_member_group
              WHERE   name = ?
          "
      )->execute('.Mehrfachbestellen');

          
      $resFormData $objDatabase->prepare("
              SELECT  ff_name,
                      value 
              FROM    tl_formdata,
                      tl_formdata_details 
              WHERE   tl_formdata.id = tl_formdata_details.pid 
              AND     fd_member = ?
              AND     ff_name = ?
              AND     value = ?
          "
      )->execute($mpMemberData[id], 'KW'$GLOBALS[_GET][KW]);
          
          if ( (
      $this->formId <> 'f3' AND $this->formId <> 'f4') OR 
               (
      in_array($resMemberGroups->id$objMember->groups) OR $resFormData->numRows <= 0)
             ) :
      ?>

      <div class="<?php echo $this->class?> <?php echo $this->tableless 'tableless' 'tableform'?> block"<?php echo $this->cssID?><?php if ($this->style): ?> style="<?php echo $this->style?>"<?php endif; ?>>

        <?php if ($this->headline): ?>
          <<?php echo $this->hl?>><?php echo $this->headline?></<?php echo $this->hl?>>
        <?php endif; ?>

        <form<?php if ($this->action): ?> action="<?php echo $this->action?>"<?php endif; ?> id="<?php echo $this->formId?>" method="<?php echo $this->method?>" enctype="<?php echo $this->enctype?>"<?php echo $this->attributes?><?php echo $this->novalidate?>>
          <div class="formbody">
            <?php if ($this->method != 'get'): ?>
              <input type="hidden" name="FORM_SUBMIT" value="<?php echo $this->formSubmit?>">
              <input type="hidden" name="REQUEST_TOKEN" value="{{request_token}}">
              <?php if ($this->maxFileSize): ?>
                <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $this->maxFileSize?>">
              <?php endif; ?>
            <?php endif; ?>
            <?php echo $this->hidden?>
            <?php if (!$this->tableless): ?>
              <table>
                <?php echo $this->fields?>
              </table>
            <?php else: ?>
              <?php echo $this->fields?>
            <?php endif; ?>
          </div>
        </form>

      </div>

      <?php else: ?>

      <div class="<?php echo $this->class?> block"<?php echo $this->cssID?><?php if ($this->style): ?> style="<?php echo $this->style?>"<?php endif; ?>>

        <?php if ($this->headline): ?>
          <<?php echo $this->hl?>><?php echo $this->headline?></<?php echo $this->hl?>>
        <?php endif; ?>

          Sie haben bereits bestellt.

      </div>

      <?php endif; ?>
      <!-- indexer::continue -->


    Diese Lösung gefällt mir aber nicht wirklich. Zum einen müssen Templates extra dafür angepasst werden, auch wenn diese ganz normal an andere Stelle genutzt werden. Beispiel darf die Bedingung zum ausblenden nur greifen, wenn das eines der beiden Bestellformulare ist. Auch denke ich, dass ich nicht den optimale Progrmmierung getroffen habe, Auswahl der Funktionen um an die Informationen zu gelangen/ Speicherung der Werte unter $GLOBALS[_GET]. (bin für Verbesserungen offen).
    Im weiteren funktioniert die Backand-Vorschau nicht mehr, siehe Bild.
    fehler_backend_vorschau.png
    Und dann ist das ganze eine absolute Speziallösung, obwohl es gerade nach einer umsetzung als Extention "schreit". Wenn ich mal die Zeit finde, versuche ich mich mal an der Extention-Programmierung. Ein paar Ideen wie es aussehen könnte hab ich schon. (Mitstreiter sind gern Willkommen)
    Geändert von Thilo-LH-Erfurt (10.11.2014 um 12:37 Uhr)

  4. #4
    Contao-Nutzer Avatar von Traumkunst
    Registriert seit
    22.01.2011.
    Ort
    In der Nähe von Dortmund
    Beiträge
    229

    Standard

    Hallo Thilo,

    Du verfolgst da natürlich direkt einen relativ "intrusiven" Ansatz, indem Du diese Programmierung in die Templates reinknallerst . Ich weiß nicht, ob das in diesem Zusammenhang unbedingt nötig ist.

    Ich kann jetzt nicht genau sagen, wozu Du an das Event-Template rangehst, aber um den Wert des versteckten Feldes auszulesen, kannst Du relativ gemütlich die Erweiterung input var (s. mein Post oben) verwenden. Das kann dann auch in einem Modul stattfinden, das nicht Teil des Event-Templates ist.

    Auch beim Formular würde ich versuchen, die Abfrage, ob schon bestellt wurde oder nicht, vom eigentlichen Formular zu trennen und am besten *vorher* entscheiden, ob der Formular-Block überhaupt angezeigt werden soll oder nicht.

    Was aber die allgemeine Verwendbarkeit der Templates in anderen Bereichen der Website angeht, so kannst Du natürlich Dein eigenes Template machen (z.B. "form_bestellung.html5") und dieses Template dann entsprechend zuweisen. So bleibt das normale form-Template für alle anderen Formulare der Website weiterhin verfügbar. Aber ich nehme an, das war wohl bereits bekannt und Du meintest mit "[...] darf die Bedingung zum ausblenden nur greifen, wenn das eines der beiden Bestellformulare ist [...]" ggf. noch was anderes?

    Tut mir leid, dass ich da jetzt nicht zu konkret werden kann; vom Prinzip her hatte ich ja meinen Ansatz, den ich selbst als erstes ausprobieren würde, schon erklärt. Das würde ich nach wie vor so machen. Aber ich bin auch schon Fehlwege gegangen (Ja, ich kenne das Buch "Der Weg war umsonst" sehr gut.)

    Nur würde ich bei meinem Ansatz eben (vorr.) ohne Änderung der Templates hinkommen. Auch wenn das jetzt kein so großes Drama ist, mal abgesehen von der hier vorhandenen Vermischung von Code, Template und Text-Ausgabe; Du sagst ja selbst, dass das erst noch die quick-and-dirty-Variante ist. Nur die genaue Programmierung für meinen gedankl. Ansatz kann ich leider nicht liefern, dafür fehlt mir u.a. die Zeit

    Was das Programmieren einer eigenen Erweiterung angeht: Ob das direkt danach "schreit" weiß ich nicht ;-) Aber wenn der Ansatz allgemeiner formuliert wird, dann könnte es gut sein, dass sich da "Mitstreiter" für interessieren. (Beispiel für eine allg. Formulierung: Nach Absenden eines Formulars soll ein User (registrierter Frontend-User (DB/dauerhaft) oder unregistrierter FE-User (Cookie/Session) Zugriff oder keinen Zugriff auf bestimmte Elemente haben.) Ich hatte erst letztens hier im Forum noch gelesen, dass jemand sowas wie "Download gegen E-Mail-Adresse" haben wollte. Auch wenn die Anwendungsbereiche zwei verschiedene sind, so ließe sich hier doch ein gemeinsamer Ansatz finden: Jemand füllt ein Formular aus, und hat anschließend Zugriff (bzw. *keinen* Zugriff) auf bestimmte Elemente bzw. bestimmte Elemente werden ein- oder ausgeblendet in Abhängigkeit davon ob ein bestimmtes Formular ausgefüllt oder darin ein bestimmter Wert angegeben wurde.

    Ich glaube allerdings tatsächlich, dass hier mittelfristig eher eine individuelle Lösung her muss. Früher oder später wird man vielleicht mal einbauen wollen, dass der User eine bereits getätigte Bestellung nochmal ändert. Bekommt der User eine Bestätigung seiner Bestellung? Per E-Mail oder am Bildschirm? Soweit ich aus Deinem Code sehen kann, gibt es für den User sowas wie eine Bestell-Übersicht. Was, wenn er feststellt, dass er einen Fehler gemacht hat und nochmal neu ausfüllen bzw. korrigieren möchte? Dann erhält er ja nur die Meldung, dass er für den Tag bereits bestellt hat und daher das Formular nicht mehr verwenden darf. Ich denke, das könnte eine Entwicklung sein ("Komfort-Features"), die man dabei im Auge behalten müsste. Kann natürlich auch sein, dass diese Überlegungen für Dein Vorhaben überhaupt keine Rolle spielen.

    VG Frank

  5. #5
    Gesperrt
    Registriert seit
    23.10.2014.
    Ort
    Erfurt
    Beiträge
    14

    Lächelndes Gesicht Teil 1 - "Lastenheft"

    Hallo Traumkunst,

    erst mal danke für deine Ausführliche Rückmeldung. Um deine Fragen zu beantworten ohne neue aufzuwerfen ist es, aus meiner Sicht sinnvoll die ein oder anderen Dinge mal zu erläutern. (Wird also etwas länger heute Abend :-))

    Also erst mal die Eck-Daten des Lastenheftes, wenn man das mal so Beschreiben darf:
    Mein Arbeitgeber, die Lebenshilfe Erfurt (LHE) möchte die Mittagsversorgung eines (vielleicht auch zukünftig weitere) externen als Dienstleister übernehmen. Damit werden Jobs für geistig Behinderte auf dem Ersten-Arbeitsmarkt geschaffen, das mal am Rande bemerkt.
    Die notwendigen Be-/ Abbestellungen der Mahlzeiten sollen dazu über eine Webseite (mit HTTPS) im Internet getätigt werden. Diese wird von uns, der LHE erstellt und betrieben.
    Der Benutzer soll dabei die Möglichkeit haben seine Bestellungen, für jeweils eine gesamte Woche im vor raus abzugeben. Bis zu einem gewissen Zeitpunkt, darf er diese auch bearbeiten. Dieser Zeitpunkt ist mit 7 Uhr des selbigen Tages festgelegt. Ab Sieben Uhr des Freitags soll die ganze Woche nicht mehr Bearbeiter sein. Bis zur Abrechnung der Essensgeld sollen die Bestellungen in einer Übersicht sichtbar sein.
    Zu jeder Bestellung oder Änderung soll der Benutzer eine E-Mail als Bestätigung erhalten.
    Auch ist es zukünftig denkbar, dass jeder Externe ein veränderten Speiseplan zur Auswahl bekommt.
    Auch soll die Auswertung, wie viel Menüs an welchen Tag gekocht werden, über einen gesonderten Benutzer möglich sein.
    [EDIT]
    Hab vergessen zu Erwähnen, das die LHE natürlich aus selbst gleich über die Seite bestellen möchte. Um damit den Zettelkram abzuschafen wie er jetzt ist.
    [/EDIT]

    So nun zur meiner Umsetzung:
    Als Grundlage nutze ich folgende Module:
    - Membermodul zur Verwaltung der Externen-Benutzer und Zuordnung zu den Gruppen (eine Gruppe pro Firma/Speiseplan
    - Kalender zur Organisation der Speisepläne (ein Kalender für jeden Plan)
    - "inserttags" und "moretags" dienen zur Informationsgewinnung und Speicherung (Bsp.: Get und Post Variablen
    - Rocksolid-Columns/Rocksolid-custom-elements/Rocksolid-Icon-Picker/Rocksolid-Slider/Rocksolid-Theme-Assistant wegen des eingesetzten Theme "Open Sauce"
    - efg für die E-Mails zur Bestätigung, Speicherung, Auflistung und Bearbeitung der Formulardaten

    Die Seitenstrucktur sieht bis jetzt so aus:
    Home
    Benutzer-Anmeldung
    Passwort vergessen
    Anforderung neues Passwort versendet
    neues Passwort wurde gespeichert
    Übersicht Speisepläne
    Speiseplan Bestellung
    Meine Bestellungen
    Meine Daten ändern
    Impressum
    404
    403

    Diese Seiten sind egal für welchen Benutzer oder Benutzergruppe gleich. Die Seiten für die Auswertung fehlen noch. Auf der Home-Seite ist das Login Modul. Die Seiten "Home", "Benutzer-Anmeldung", "Passwort Vergessen", "Anforderung neues Passwort versendet" und "neues Passwort wurde gespeichert" sind nicht durch das Benutzermodel geschützt. Die Seiten "Übersicht Speisepläne", "Speiseplan Bestellung", "Meine Bestellungen" und "Meine Daten ändern" sind nur für angemeldete Benutzer sichbar. Folgt man einem Link zu einer geschützten Seite und ist nicht als Mitglied angemeldet, so wird man automatisch auf die Seite "Benutzer-Anmeldung" umgeleitet.

    Ist man angemeldet, sieht man auf der Seite "Übersicht Speisepläne" eine Liste mit den aktuellen und nächsten Speiseplänen, der einrichtung, der man zugeordnet ist. Dazu dient das Modul "Eventliste", welches die Termine aller kalender darstellen soll. Da aber die Kalender nur für bestimmte Gruppen sichtbar ist, wird immer nur ein Kalender angezeigt.
    Wählt der Benutzer nun eine Woche aus, so sieht er den eigendlichen Speiseplan und das Bestellformular direkt darunter.
    Das Bestellformular ist für jeden Einrichtung, die die selbe Anzahl an Menüs zur Auswahl hat das selbe. Bsp.: die LHE selber hat drei Essen zur Auswahl. Der Externe Kunde nur zwei.
    Da das Bestellformular "Universal" für die Besteller ist, gibt es mehrer Verstecktefelder. Mit einem wird die Kalenderwoche erfasst. Mit einem weiteren wird der Zeitpunkt gespeichert bis wann eine Bestellung in der Bestellüberischt des benutzers Sichtbar ist. Die MemberID wird durch efg bereits gespeichert. Da ich keinen anderen Weg gefunden habe an die Informationen zur Kalenderwoche und den Datumsinformationen zu kommen, scheichere ich mir diese, über den Weg des "event_full.html5" Templates in die $GLOBALS[_GET] Variable.
    Auf der Seite "Meine Bestellungen" findet der Benutzer eine Liste mit seinen Bestellungen die durch EFG erstellt wird und auch bearbeitet werden kann.

    Das soweit zu meiner Umsetzung. Ich hoffe das dadurch einige Zusammenhänge besser verständlich wurden. Bin natürlich für jeden Hinweis offen.
    Geändert von Thilo-LH-Erfurt (11.11.2014 um 10:30 Uhr)

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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