Zum Inhalt springen

Select-Box füllen mit Mailformplus

Erstellt am 20. März 2009 · 4 Antworten · letzte Antwort am 27. März 2009

Tags: Frage

cherry ·

Hallo,
ich habe einen Hauptmenüpunkt in dem unterschiedlich viele Unterpunkte vorhanden sein können. Wenn ich nun einen Untermenüpunkt auswähle und die Seite öffnet sich, gibt es unter anderem einen Link. Diesem Link soll das Feld "header" als Variable hinzugefügt werden. Nach Klick auf den Link soll sich ein Formular öffnen mit einer Auswahlbox. In dieser Box soll der gewählte "header" als erstes erscheinen und alle Untermenüpunkte (Feld Header) die "nicht versteckt sind" darunter.

Es müsste als die Variable in Mailformplus integriert werden und eine Abfrage (Schleife?) nach den restlichen Möglichkeiten.

Ist so was machbar? Und wenn ja, natürlich noch das WIE?

Danke für Eure Unterstützung!

speedprogs ·

Hallo cherry,

tut mir Leid, ich habe deine Frage jetzt 6 Mal durchgelesen, aber ich verstehe nicht genau, was dein Ziel ist.

Ich versuche es mal zu entschlüsseln:

1. Du möchtest ein Menü auf deiner Seite darstellen.

2. Dieses Menü soll eine zweite Ebene (Unterpunkte) anzeigen.

3. Klickt man in der zweiten Ebene auf einen Menüpunkt, soll sich eine Seite öffnen, auf der die Überschrift (header) eines Datensatzes als Link dargestellt werden soll (oder meinst du den Titel der aktuellen Seite?).

4. Klickt man dann auf den "Header"-Link, soll sich wiederum eine neue Seite öffnen, die ein Formular (mailformplus) enthält.

5. Das Formular soll eine Select-Box enthalten, das alle Überschriften von anderen Datensätzen (oder abhängig von Punkt 3: Titel der Seiten auf der aktuellen Ebene) anzeigt.

Stimmt das so?

cherry ·

Hallo,
ich probiere es mal einfacher zu erklären. Es geht um unser kleines Hotel bei dem es verschiedene "Urlaubspakete" gibt. Diese werden in einem Menüpunkt (Angebote) dargestellt. Jedes dieser Angebote hat eine eigene Seite, mit Bild, Text usw..
Was ich gerne machen möchte:
Am Ende der "Detailseite" des jeweiligen Angebotes soll ein Link stehen, der auf ein Formular verlinkt. Diesem Link möchte ich den den Namen des Angebotes als Variable mitgeben, und auf der Formularseite soll dieser Name in einer Select-Box an 1. Stelle stehen, die verfügbaren anderen Angebote (also HIDDEN = 0) als Auswahl darunter.

speedprogs ·

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...