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
Liste der Anhänge anzeigen (Anzahl: 1)
@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.
Anhang 14716
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)