Hallo cherry,
dein Vorhaben lässt sich realisieren, zwar nicht ganz einfach, aber es geht. Die Seiten mit den Angeboten hast du ja schon angelegt. Achte dabei bitte darauf, dass alle Angebotsseiten unterhalb einer Seite sind und nicht irgendwo im Baum verteilt.
Da wir später die UID der Seite brauchen, deren Unterseiten die Angebote sind, kannst du sie jetzt schon mal herausfinden. Das machst du am Besten, indem du mit dem Mauszeiger über das Symbol links neben dem Seitentitel im Seitenbaum fährst und kurz wartest.
Wenn du die UID hast, geht es weiter. Nun öffnest du dein Setup-Feld im Root-Template (im Menü links auf "Template", dann auf deine erste Seite unter der Weltkugel und dann auf den Bleistift neben "Setup" klicken).
Hier fügst du anschließend folgende Zeilen TypoScript ein:
## Create marker for HTML template
page.10.marks {
LINK_TO_FORM = TEXT
LINK_TO_FORM.value =
}
## Create additional GET parameters
temp.additional = TEXT
temp.additional {
field = uid
wrap = &offer=|
}
## If current page is a offer show link to form
[PIDinRootline = 8]
page.10.marks {
LINK_TO_FORM {
value = Hier geht es zur Anmeldung
typolink {
parameter = 9
additionalParams < temp.additional
wrap = <p class="link_to_form">|</p>
}
}
}
[global]
Dadurch kannst du einen Marker namens "###LINK_TO_FORM###" in dein HMTL-Template einfügen. Dieser wird anschließend automatisch durch einen Link auf dein Formular ersetzt. Diesem Link wird die UID der aktuellen Seite mitgegeben. Somit können wir später herausfinden, von welchem Angebot der Besucher auf das Formular gekommen ist.
Der Link wird über die TypoScript-Funktion "typolink" erstellt. Man übergibt dieser Funktion die UID der Seite, für die man einen Link haben möchte und der Rest erhält einen kompletten Link.
Damit der Marker in deinem HTML-Template aber nicht immer mit einem Link ersetzt wird, sondern nur wenn wir uns auf einem Angebot befinden, habe ich eine "Condition" ([PIDinRootline = 8]) eingebaut. Diese erzeugt den Link nur dann, wenn wir uns auf einer Angebotsseite befinden. Das findet die "Condition" durch unsere, vorhin gemerkte Seiten UID heraus. Du musst also anstatt der "8" hier die UID der Seite eingeben, unter der alle Angebotsseiten angelegt wurden.
Statt der "9" gibst du hier die UID der Seite an, auf der das Formular von "mailformplus" platziert ist.
Das war der erste Teil. Bis jetzt wird auf deiner Seite im Frontend der Link zum Formular angezeigt. Das kannst du probieren, indem du den Marker "###LINK_TO_FORM###" auf in dein HTML-Template einfügst, deinen Cache leerst und die Seite im Frontend aufrufst.
Wenn alles geklappt hat, geht es weiter. Jetzt erstellst du im Verzeichnis "fileadmin" eine Datei namens "user_pageSelector.php" mit folgendem Inhalt:
<?php
class user_pageSelector {
function main ($content, $conf) {
// Get uid of current offer or zero if no get param was given
$offerUid = t3lib_div::_GP('offer') ? (int) t3lib_div::_GP('offer') : 0;
// Check if parameter is ok
if (!$conf || !isset($conf['pid']) || !$offerUid) {
return '';
}
// Set some variables
$parentUid = (int) $conf['pid'];
$pages = array();
// Get all subpages of the parent offer page from db
$result = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
'uid, title',
'pages',
'pid='.$parentUid,
'',
'title',
''
);
// Stop here if no result was given
if (!$result) {
return '';
}
// Get all options of the select field
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($result)) {
if ($row['uid'] == $offerUid) {
$pages[] = '<option selected="selected">'.$row['title'].'</option>';
} else {
$pages[] = '<option>'.$row['title'].'</option>';
}
}
// Create the select field with all options
if (count($pages) > 0) {
$content .= implode(PHP_EOL, $pages);
}
// Return the new content to TypoScript
return $content;
}
}
?>
Diese Datei sorgt später dafür, dass du deine Angebotsseiten für die Select-Box auf dem Formular erhältst. Hierbei handelt es sich um eine sogenannte "User-Funktion", die wir später einsetzen werden. Zuerst hole ich auf den GET-Parametern der URL (die URL, des Links, der auf die Formular-Seite führt), die UID der Angebotsseite, von der der Besucher kommt.
Wenn der Besucher also z.B. auf der Seite mit einem Angebot über ein Doppelbett-Zimmer auf den Link klickt (###LINK_TO_FORM###), gelangt er auf die Seite, auf der das Formular platziert ist. Dabei wird der URL die UID der Angebotsseite mitgegeben. Auf der Formular-Seite holt die "User-Function" die UID wieder raus und verarbeitet sie weiter.
Über eine TYPO3-eigene Methode hole ich die Titel der Angebotsseiten aus der Tabelle "pages" aus der Datenbank. Diese werden noch bei der Abfrage alphabetisch sortiert. Wenn die übergebene UID in der Liste der Abfrage-Resultate gefunden wird, markiert die Funktion diesen Eintrag automatisch als vorausgewählt. Zum Schluss übergebe ich die komplette Liste der Titel (in Form von Select-Box-Optionen) an TypoScript zurück. Dort wird dann die Select-Box erzeugt, über die du auf deinem Formular zwischen den Angebotsseiten wählen kannst.
Wenn du den Code in die Datei eingefügt hast, geht es zum dritten Schritt. Füge diese Zeilen TypoScript in das Setup-Feld deines Root-Templates ein:
## Include required user function
includeLibs.user_pageSelector = fileadmin/user_pageSelector.php
plugin.tx_thmailformplus_pi1.markers {
PAGE_SELECTOR_OPTIONS = USER
PAGE_SELECTOR_OPTIONS {
userFunc = user_pageSelector->main
pid = 10
}
}
Damit bewirkst du, dass für dein HTML-Template von mailformplus ein weiterer Marker zur Verfügung steht, der durch die Optionen für das Select-Feld (die Auswahlbox) ersetzt wird. Zuerst bindest du eine neue Library (bzw. PHP-Klasse) ein. Anschließend wird der Marker "###PAGE_SELECTOR_OPTIONS###" durch unsere "User-Funktion" wie Oben beschrieben mit den Titeln der Angebotsseiten gefüllt.
Damit das funktioniert, musst du der Funktion die UID der Seite ("pid") übergeben, die du dir zu Anfang gemerkt hast (Seite, unter der alle Angebotsseiten liegen).
Im vierten Schritt fügst du nun den somit entstandenen neuen Marker in dein HTML-Template von mailformplus ein:
<select name="page_selector" class="page_selector" size="5">###PAGE_SELECTOR_OPTIONS###</select>
An dieser Stelle musst du aufpassen, wenn du das HTML-Template direkt am Datensatz (also über Flexform) zuweist, wird davon eine Sicherheitskopie erstellt und diese statt dem Original verwendet. Daher musst du hier das geänderte HTML-Template neu zuweisen.
Wenn du nun alles speicherst, den Cache leerst und im Frontend nochmal auf den Link zum Formular klickst, wirst du feststellen, dass in deinem Formular inzwischen die Titel der Angebotsseiten in einer Select-Box (Auswahlbox) angezeigt werden. Und wenn alles funktioniert, ist die Seite, von der du gekommen bist, vorausgewählt.
----
So, jetzt hast du "Conditions" (https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/Conditions/Index.html), "User-Functions" (http://www.typo3wizard.com/de/snippets/allgemeine-probleme-und-loesungen/einfache-userfunc.html) und TYPO3-eigene Datenbank-Abfragen in PHP (https://docs.typo3.org/m/typo3/reference-typoscript/main/en-us/Functions/Select.html) kennen gelernt. Ich hoffe, das war für den Anfang nicht zu viel.
Viel Erfolg bei der Umsetzung...