Extbase/Fluid/Flow FormConfiguration ViewHelper for __trustedProperties

Veröffentlicht von Sascha am

Hin und wieder kommt es vor das kein Weg daran vorbei führt, innerhalb eines Fluid Formulars ein normales HTML Form Element einzufügen, welches nicht von einem Fluid Form Helper generiert wird. Die Gründe hierfür sind vielfältig, oft aber in Verbindung mit jQuery und dynamisch erstellten Feldern.

Eigentlich ist dies kein Problem, da man die nun auftretende Fehlermeldung mit Hilfe des PropertyMappers bzw. der PropertyMappingConfiguration in der initialize*Action im Controller beseitigen könnte. Allerdings kann hierbei relativ viel Configuration Code entstehen, welcher nichts mit der Business Logik ansich zu tun hat, sowie viel schlimmer noch, bei entsprechenden Änderungen im Template (der View) Anpassungen im Controller erfordern.

Um die notwendige Arbeit vom Controller in das Template (also in die View Logik) zu verschieben, ermöglicht folgender Custom ViewHelper dieses Artikels:

PS: Natürlich sollte das auch in TYPO3 Flow funktionieren!

Die auftretende Fehlermeldung nach dem dynamischen Hinzufügen bzw. der Verwendung von nicht Fluid-Form-Fields ist folgende:
Hier Beispielhaft für die Verwendung eines

#1297759968: Exception while property mapping at property path "":It is not allowed to map property "meineDynamischeProperty". You need to use $propertyMappingConfiguration->allowProperties('meineDynamischeProperty') to enable mapping of this property. (More information)

TYPO3\CMS\Extbase\Property\Exception thrown in file
/html/typo3/typo3_src-6.2.9/typo3/sysext/extbase/Classes/Property/PropertyMapper.php in line 106.

Die Lösung mit Hilfe des hier vorgestellten ViewHelpers sähe wie folgt aus:


Sollte es sich bei der Property „meineDynamischeProperty“ um eine ComboBox bzw. einem Select handelt, welches multiple ist, sollten eckige Klammern hinzugefügt werden „meineDynamischeProperty[]“ sowie das count=“xx“ Attribut des ViewHelpers verwendet werden. Count muss dabei die Anzahl der möglichen Elemente enthalten – bei einem Select also die Anzahl der Option Tags.

Der entsprechende ViewHelper wurde bereits vor einigen Jahren in der TYPO3 Community diskutiert, hat es aber offenbar nie in einen Release geschafft.
Die Diskussion sowie der Quellcode lassen sich in Redmine ( https://forge.typo3.org/issues/43346 ) bzw. in Gerrit ( https://review.typo3.org/#/c/16797/ ) verfolgen.

Um den ViewHelper mit der aktuellen Version von Extbase (6.2) kompatibel zu machen, bzw. ihn so Anzupassen dass er wie oben beschrieben funktioniert, sind ein paar Code Änderungen notwendig.
Folgend meine Version des ViewHelpers:

class FormConfigurationViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormViewHelper {

    /**
     * Keep the parent from preparing the TagBuilder.
     *
     * @return void
     */
    public function initialize() {}

    /**
     * Initialize the arguments.
     *
     * @return void
     * @api
     */
    public function initializeArguments() {
        $this->registerArgument('property', 'string', 'Name of property (of the object bound to the form) to configure', TRUE);
        $this->registerArgument('allowProperties', 'string', 'List property names (comma separated) to map onto the property given in forProperty', TRUE);
        $this->registerArgument('count', 'int', '', FALSE, 1);
    }

    /**
     * Does not render anything, just tweaks configuration.
     *
     * @return string
     * @api
     */
    public function render() {
        $name = $this->arguments['property']; //$this->getName();
        $allowedPropertyNames = \TYPO3\CMS\Extbase\Utility\ArrayUtility::trimExplode(',', $this->arguments['allowProperties']);

        foreach ($allowedPropertyNames as $allowedPropertyName) {

            for($i=0; $i<=$this->arguments['count']; $i++) {
                $this->registerFieldNameForFormTokenGeneration($name . '[' . $allowedPropertyName . ']');
            }


        }

        return '';
    }

}

Und hier einmal die Variante für TYPO3.Flow

use TYPO3\Flow\Utility\Arrays;
use TYPO3\Fluid\Core\ViewHelper;
use TYPO3\Fluid\ViewHelpers\Form\AbstractFormViewHelper;


class FormConfigurationViewHelper extends AbstractFormViewHelper {

    /**
     * Keep the parent from preparing the TagBuilder.
     *
     * @return void
     */
    public function initialize() {
    }

    /**
     * Initialize the arguments.
     *
     * @return void
     * @api
     */
    public function initializeArguments() {
        $this->registerArgument('property', 'string', 'Name of property (of the object bound to the form) to configure', TRUE);
        $this->registerArgument('allowProperties', 'string', 'List property names (comma separated) to map onto the property given in forProperty', TRUE);
        $this->registerArgument('count', 'int', '', FALSE, 1);
    }

    /**
     * Does not render anything, just tweaks configuration.
     *
     * @return string
     * @api
     */
    public function render() {
        $name = $this->arguments['property'];
        $allowedPropertyNames = Arrays::trimExplode(',', $this->arguments['allowProperties']);

        foreach ($allowedPropertyNames as $allowedPropertyName) {
            for ($i = 0; $i <= $this->arguments['count']; $i++) {
                $this->registerFieldNameForFormTokenGeneration($name . '[' . $allowedPropertyName . ']');
            }
        }

        return '';
    }

}
%d Bloggern gefällt das:

Durch das Fortsetzen der Benutzung dieser Seite, stimmst du der Benutzung von Cookies zu. Weitere Informationen

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Außerdem geben wir Informationen zu Ihrer Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter.

Schließen