Zum Inhalt springen

Powermail 2 Textfield maxlength

Erstellt am 1. März 2016 · 9 Antworten · letzte Antwort am 4. März 2016

Tags: Powermail, Frage

mwirth ·

Hallo,

Ich nutze Powermail 2.12.1 und möchte da bei den Text-Feldern gerne eine maximale Eingabelänge angeben. Ich möchte aber, dass das beim Eingeben schon begrenzt wird und nicht erst beim Absenden validiert wird. Ich hab zwar die Möglichkeit gefunden, dass ich da selbst an den Sourcen vom Powermail schraube, aber das will ich eigentlich nicht.

Kann ich nicht irgendwie für ein Text-Feld ein "maxLength" angeben?

Vielen Dank schon mal für die Antwort!

Gruß
Matthias

Tom-iX ·

Hallo,

soll dann eine Fehlermeldung ausgegeben werden direkt wenn man was eingibt?
Ich denke das musst du zusätzlich einbauen, am besten über nen eigenes JS-Snippet.

einpraegsam.​net ·

Das Parsley.js Framework ist eigentlich ziemlich gut, das in powermail Verwendung findet.

Wenn der Redakteur für eine Textarea eine Länge bis zu 10 Zeichen einstellt, wird das Feld so oder so ähnlich gerendert:

<textarea data-parsley-id="24" data-parsley-length="[1, 10]" data-parsley-error-message="Zu viele Zeichen!" rows="5" cols="20" class="powermail_field powermail_textarea parsley-error" id="powermail_field_limit10textarea" name="tx_powermail_pi1[field][limit10textarea]">allInformation</textarea>

Wenn du noch ein data-parsley-trigger="change" einfügst, müsste bereits beim Verlassen des Feldes validiert werden. Das entsprechende Partial kannst du ja bequem überschreiben.

Hier die Beispiele von parsley.js http://parsleyjs.org/doc/examples/simple.html
Wie du Partials überschreibst, steht hier https://docs.typo3.org/typo3cms/extensions/powermail/ForAdministrators/GoodToKnow/Templates/Index.html

BTW1: Ungetestet
BTW2: Du könntest mal etwas aktualisieren - da die Version 2.12.1 auch schon etwas staub angesetzt hat

mwirth ·

Hallo,

Danke für die Antworten! Ich versuche schon den ganzen Vormittag das mit dem data-parsley-trigger hin zu bekommen. Aber ich schaffe es nicht im TypoScript dieses Attribut in den HTML-Code rein zu bekommen.

Wie mache ich das? Wie spreche ich das im TypoScript an?

DANKE!

einpraegsam.​net ·

Wie ich bereits geschrieben habe, werden die normalen Input-Felder (die anderen natürlich auch) in Partials zusammengebaut.
Original-Partial für das Input-Feld findest du also hier:
EXT: powermail/Resources/Private/Partials/Form/Input.html

Dort musst du dein Attribut einbauen.

Wie du dein Attribut mit einpflegen kannst, steht hier: https://docs.typo3.org/typo3cms/extensions/powermail/Faq/Index.html#additionalattributesinfieldpartials
Wie du Partials überschreibst (denn eine Änderung direkt im oben beschriebenen Partial, wäre beim nächsten Update ja wieder weg), steht hier https://docs.typo3.org/typo3cms/extensions/powermail/ForAdministrators/GoodToKnow/Templates/Index.html

mwirth ·

So. Das mit dem data-parsley-trigger="change" habe ich jetzt dann relativ schnell hinbekommen gehabt. Nach einiger Zeit Quellcode-Lesen und Testen habe ich jetzt auch hinbekommen, dass ich ein maxLength in meinen Input-Elementen drin stehen habe, indem ich den ValidationDataAttributeViewHelper unter typo3conf/ext/powermail/Classes/ViewHelpers/Validation überschrieben habe. Aber an dieser Stelle ist es ja nicht sinnvoll, das einzubauen. Die ganzen Tests waren bisher alle am DEV-System. Wenn ich das aber im Produktiv-System so umsetzen würde hätte ich ja das Problem, dass diese Änderung ja auch die Powermail-Formulare der anderen Abteilungen, die auch an dieser Homepage arbeiten betreffen würde und dass außerdem bei einem Update des Powermails die Änderung wieder weg wäre.

Kann ich so ähnlich wie bei den Templates den Pfad für diese ViewHelper auch in meinem Template angeben?

Bin jetzt schon drauf gekommen, dass ich das als Namespace ja in der Input.html-Partial angeben kann. Allerdings funktioniert das so aktuell nicht:

{namespace vh=In2code\Powermail\ViewHelpers}
{namespace vh2=fileadmin\Classes\ViewHelpers}

<div id="powermail_fieldwrap_{field.uid}" class="powermail_fieldwrap powermail_fieldwrap_input powermail_fieldwrap_{field.uid} {field.css}">
	<label for="powermail_field_{field.marker}" class="powermail_label" title="{field.description}">
		<vh:string.RawAndRemoveXss>{field.title}</vh:string.RawAndRemoveXss><f:if condition="{field.mandatory}"><span class="mandatory">*</span></f:if>
	</label>
	<f:form.textfield
		type="{vh:Validation.FieldTypeFromValidation(field:field)}"
		property="{field.marker}"
		placeholder="{field.placeholder}"
		value="{vh:Misc.PrefillField(field:field, mail:mail)}"
		class="powermail_field powermail_input {vh:Validation.ErrorClass(field:field, class:'powermail_field_error')}"
		additionalAttributes="{vh2:Validation.ValidationDataAttribute(field:field)}"
        data-parsley-trigger="change"
		id="powermail_field_{field.marker}" />
</div>

Ohne dem 2. Namespace funktioniert es. Dann sind meine überarbeiteten Dateien aber halt leider bei der Original-Powermail-Extension und das will ich ja nicht.

P.S.: Ich weiß, dass fileadmin nicht der richtige Ort ist. Da hab ich die ViewHelper jetzt nur mal zum Testen abgelegt.

einpraegsam.​net ·

Du hast den Viewhelper durch deinen eigenen ersetzt. Das ist gar nicht so schlimm und die Extension ist dennoch Update-Fähig.
Aber warum? Was genau hast du nicht hinbekommen? Oder anders: Wie sieht dein ViewHelper aus?

mwirth ·

Ich wollte dann im Viewhelper beim Validation-Attribut "Length" noch hinzugefügt, dass er auch noch ein maxLength dazu macht. Das sieht jetzt so aus:

            case 9:
                $values = GeneralUtility::trimExplode(',', $field->getValidationConfiguration(), true);
                if ((int) $values[0] <= 0) {
                    break;
                }
                if (!isset($values[1])) {
                    $values[1] = (int) $values[0];
                    $values[0] = 1;
                }
                if ($this->isClientValidationEnabled()) {
                    $additionalAttributes['maxLength'] = $values[1];
                    $additionalAttributes['data-parsley-length'] = '[' . implode(', ', $values) . ']';
                }
                break;

Nur zum Vergleich, davor war er so:

case 9:
                $values = GeneralUtility::trimExplode(',', $field->getValidationConfiguration(), true);
                if ((int) $values[0] <= 0) {
                    break;
                }
                if (!isset($values[1])) {
                    $values[1] = (int) $values[0];
                    $values[0] = 1;
                }
                if ($this->isClientValidationEnabled()) {
                    $additionalAttributes['data-parsley-length'] = '[' . implode(', ', $values) . ']';
                }
                break;

Das Attribut maxLength hab ich leider in der Input.html nicht dazu bekommen. Aber ich habe mich jetzt durch das Thema Extension-Entwicklung durchgebissen und hab dafür eine eigene Extension entwickelt, die ich durch eine Template-Extension nur für das Formular für das ich zuständig bin aktiviere. In meiner Extension habe ich jetzt nur die Partials und den Viewhelper für die Validation angepasst.

Und das funktioniert jetzt auch alles so wie ich es möchte. 🙂

Danke nochmal für die kompetente Hilfe!