diff --git a/Classes/Domain/Model/Field.php b/Classes/Domain/Model/Field.php index b2377b7f2..d43991cf1 100644 --- a/Classes/Domain/Model/Field.php +++ b/Classes/Domain/Model/Field.php @@ -143,6 +143,26 @@ class Field extends AbstractEntity */ protected int $l10nParent = 0; + /** + * @var string + */ + protected string $autocompleteToken = ''; + + /** + * @var string + */ + protected string $autocompleteSection = ''; + + /** + * @var string + */ + protected string $autocompleteType = ''; + + /** + * @var string + */ + protected string $autocompletePurpose = ''; + /** * @var Page * This property can hold Page|int|null (depending on the context). "@var" must set to Page for property mapping. @@ -830,4 +850,78 @@ protected function getExportableTypesFromTypoScript(): array } return $types; } + + /** + * @return string + */ + public function getAutocompleteToken(): string + { + return $this->autocompleteToken; + } + + /** + * @param string $autocompleteToken + * + * @return void + */ + public function setAutocompleteToken(string $autocompleteToken): void + { + $this->autocompleteToken = $autocompleteToken; + } + + /** + * @return string + */ + public function getAutocompleteSection(): string + { + return $this->autocompleteSection; + } + + /** + * @param string $autocompleteSection + * + * @return void + */ + public function setAutocompleteSection(string $autocompleteSection): void + { + $this->autocompleteSection = $autocompleteSection; + } + + /** + * @return string + */ + public function getAutocompleteType(): string + { + return $this->autocompleteType; + } + + /** + * @param string $autocompleteType + * + * @return void + */ + public function setAutocompleteType(string $autocompleteType): void + { + $this->autocompleteType = $autocompleteType; + } + + /** + * @return string + */ + public function getAutocompletePurpose(): string + { + return $this->autocompletePurpose; + } + + /** + * @param string $autocompletePurpose + * + * @return void + */ + public function setAutocompletePurpose(string $autocompletePurpose): void + { + $this->autocompletePurpose = $autocompletePurpose; + } + + } diff --git a/Classes/Domain/Model/Form.php b/Classes/Domain/Model/Form.php index a5e82ea15..95a9a74bb 100644 --- a/Classes/Domain/Model/Form.php +++ b/Classes/Domain/Model/Form.php @@ -49,6 +49,11 @@ class Form extends AbstractEntity */ protected array $pagesByUid = []; + /** + * @var string + */ + protected string $autocompleteToken = ''; + /** * @return string */ @@ -223,4 +228,22 @@ protected function isCorrectFieldType(Field $field, string $fieldType): bool } return false; } + + /** + * @return string + */ + public function getAutocompleteToken(): string + { + return $this->autocompleteToken; + } + + /** + * @param string $autocompleteToken + * + * @return void + */ + public function setAutocompleteToken(string $autocompleteToken): void + { + $this->autocompleteToken = $autocompleteToken; + } } diff --git a/Classes/Tca/AddAutocompleteTokens.php b/Classes/Tca/AddAutocompleteTokens.php new file mode 100644 index 000000000..e954f117c --- /dev/null +++ b/Classes/Tca/AddAutocompleteTokens.php @@ -0,0 +1,96 @@ + self::$LLL . 'name', 'value' => 'name', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'honorific-prefix', 'value' => 'honorific-prefix', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'given-name', 'value' => 'given-name', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'additional-name', 'value' => 'additional-name', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'family-name', 'value' => 'family-name', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'honorific-suffix', 'value' => 'honorific-suffix', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'nickname', 'value' => 'nickname', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'sex', 'value' => 'sex', 'icon' => '', 'group' => 'name'], + ['label' => self::$LLL . 'email', 'value' => 'email', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'impp', 'value' => 'impp', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'url', 'value' => 'url', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'organization-title', 'value' => 'organization-title', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'organization', 'value' => 'organization', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'street-address', 'value' => 'street-address', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'country', 'value' => 'country', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'country-name', 'value' => 'country-name', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'postal-code', 'value' => 'postal-code', 'icon' => '', 'group' => 'contact'], + ['label' => self::$LLL . 'address-line1', 'value' => 'address-line1', 'icon' => '', 'group' => 'address'], + ['label' => self::$LLL . 'address-line2', 'value' => 'address-line2', 'icon' => '', 'group' => 'address'], + ['label' => self::$LLL . 'address-line3', 'value' => 'address-line3', 'icon' => '', 'group' => 'address'], + ['label' => self::$LLL . 'address-level1', 'value' => 'address-level1', 'icon' => '', 'group' => 'address'], + ['label' => self::$LLL . 'address-level2', 'value' => 'address-level2', 'icon' => '', 'group' => 'address'], + ['label' => self::$LLL . 'address-level3', 'value' => 'address-level3', 'icon' => '', 'group' => 'address'], + ['label' => self::$LLL . 'address-level4', 'value' => 'address-level4', 'icon' => '', 'group' => 'address'], + ['label' => self::$LLL . 'tel', 'value' => 'tel', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'tel-country-code', 'value' => 'tel-country-code', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'tel-area-code', 'value' => 'tel-area-code', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'tel-national', 'value' => 'tel-national', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'tel-local', 'value' => 'tel-local', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'tel-local-prefix', 'value' => 'tel-local-prefix', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'tel-local-suffix', 'value' => 'tel-local-suffix', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'tel-extension', 'value' => 'tel-extension', 'icon' => '', 'group' => 'tel'], + ['label' => self::$LLL . 'username', 'value' => 'username', 'icon' => '', 'group' => 'user'], + ['label' => self::$LLL . 'new-password', 'value' => 'new-password', 'icon' => '', 'group' => 'user'], + ['label' => self::$LLL . 'current-password', 'value' => 'current-password', 'icon' => '', 'group' => 'user'], + ['label' => self::$LLL . 'one-time-code', 'value' => 'one-time-code', 'icon' => '', 'group' => 'user'], + ['label' => self::$LLL . 'bday', 'value' => 'bday', 'icon' => '', 'group' => 'bday'], + ['label' => self::$LLL . 'bday-day', 'value' => 'bday-day', 'icon' => '', 'group' => 'bday'], + ['label' => self::$LLL . 'bday-month', 'value' => 'bday-month', 'icon' => '', 'group' => 'bday'], + ['label' => self::$LLL . 'bday-year', 'value' => 'bday-year', 'icon' => '', 'group' => 'bday'], + ['label' => self::$LLL . 'cc-name', 'value' => 'cc-name', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-given-name', 'value' => 'cc-given-name', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-additional-name', 'value' => 'cc-additional-name', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-family-name', 'value' => 'cc-family-name', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-number', 'value' => 'cc-number', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-exp', 'value' => 'cc-exp', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-exp-month', 'value' => 'cc-exp-month', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-exp-year', 'value' => 'cc-exp-year', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-csc', 'value' => 'cc-csc', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'cc-type', 'value' => 'cc-type', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'transaction-currency', 'value' => 'transaction-currency', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'transaction-amount', 'value' => 'transaction-amount', 'icon' => '', 'group' => 'cc'], + ['label' => self::$LLL . 'language', 'value' => 'language', 'icon' => '', 'group' => 'other'], + ['label' => self::$LLL . 'photo', 'value' => 'photo', 'icon' => '', 'group' => 'other'], + ]; + } +} \ No newline at end of file diff --git a/Classes/ViewHelpers/String/AutocompleteViewHelper.php b/Classes/ViewHelpers/String/AutocompleteViewHelper.php new file mode 100644 index 000000000..3328191a2 --- /dev/null +++ b/Classes/ViewHelpers/String/AutocompleteViewHelper.php @@ -0,0 +1,179 @@ +registerArgument('field', Field::class, 'Field', true); + } + + /** + * render the value for the autocomplete attribute + * + * @return string + */ + public function render(): string + { + $field = $this->arguments['field']; + + [$fieldType, $autocompleteTokens, $token, $section, $type, $purpose] + = [ + $field->getType(), + '', + $field->getAutocompleteToken(), + trim($field->getAutocompleteSection()), + $field->getAutocompleteType(), + $field->getAutocompletePurpose(), + ]; + + // If token is empty or 'on'/'off', other tokens are not allowed. + if (empty($token) || in_array($token, ['on', 'off'])) { + return $token; + } + + if (!$this->tokenIsAllowedForFieldType($token, $fieldType)) { + return ''; + } + + // Optional section token must begin with the string 'section-' + if (!empty($section)) { + if ($this->tokenIsAllowedForSection($token)) { + $autocompleteTokens .= 'section-' . $section . ' '; + } + } + + // Optional type token must be either 'shipping' or 'billing' + if (!empty($type)) { + if ($this->tokenIsAllowedForType($token, $type)) { + $autocompleteTokens .= $type . ' '; + } + } + + // Optional purpose token is only allowed for certain autofill-field tokens + if (!empty($purpose)) { + if ($this->tokenIsAllowedForPurpose($token, $purpose, $fieldType)) { + $autocompleteTokens .= $purpose . ' '; + } + } + + return $autocompleteTokens . $token; + } + + + /** + * Checks if the given type token is allowed for the specified autocomplete field token. + * + * Based on WHATWG HTML Spec: + * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill + * + * @param string $token + * @param string $type + * + * @return bool + */ + protected function tokenIsAllowedForType(string $token, string $type): bool + { + $allowedTypes = ['shipping', 'billing']; + $tokensNotSupportingType = [ + 'nickname', 'sex', 'impp', 'url', 'organization-title', + 'tel-country-code', 'tel-area-code', 'tel-national', 'tel-local', + 'tel-local-prefix', 'tel-local-suffix', 'tel-extension', + 'username', 'new-password', 'current-password', 'one-time-code', + 'bday', 'bday-day', 'bday-month', 'bday-year', 'language', 'photo' + ]; + return in_array($type, $allowedTypes) + && !in_array($token, $tokensNotSupportingType); + } + + /** + * Checks if the given purpose token is allowed for the specified autocomplete field token. + * + * Based on WHATWG HTML Spec: + * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill + * + * @param string $token + * @param string $purpose + * @param string $fieldType + * + * @return bool + */ + protected function tokenIsAllowedForPurpose(string $token, string $purpose, string $fieldType): bool + { + $allowedPurposes = ['home', 'work', 'mobile', 'fax', 'pager']; + $tokensSupportingPurpose = ['tel', 'email', 'impp']; + $purposeAllowedForFields = ['input', 'textarea', 'hidden']; + + return in_array($fieldType, $purposeAllowedForFields) + && in_array($purpose, $allowedPurposes, true) + && in_array($token, $tokensSupportingPurpose, true); + } + + /** + * Checks if the given autocomplete field token allows a section token prefix. + * + * Based on WHATWG HTML Spec: + * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill + * + * @param string $token + * + * @return bool + */ + protected function tokenIsAllowedForSection(string $token): bool + { + $tokensNotSupportingSection = [ + 'nickname', 'sex', 'impp', 'url', 'organization-title', + 'username', 'new-password', 'current-password', 'one-time-code', + 'bday', 'bday-day', 'bday-month', 'bday-year', 'language', 'photo' + ]; + return !in_array($token, $tokensNotSupportingSection, true); + } + + /** + * Checks if the given autocomplete field token is allowed for the current field type. + * + * Based on WHATWG HTML Spec: + * https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill + * + * @param string $token + * @param string $fieldType + * + * @return bool + */ + protected function tokenIsAllowedForFieldType(string $token, string $fieldType): bool + { + $allowedForAllTypes = ['on', 'off']; + $allowedForSelect = ['country', 'country-name', 'language', 'sex', 'bday', 'bday-day', 'bday-month', 'bday-year', 'title', 'address-level1', 'address-level2', 'cc-exp-month', 'cc-exp-year']; + $allowedForLocation = ['country', 'country-name', 'street-address', 'postal-code', 'address-line1', 'address-line2', 'address-line3', 'address-level1', 'address-level2', 'address-level3', 'address-level4']; + $allowedForCountry = ['country', 'country-name']; + $allowedForHidden = ['name', 'honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix', 'email', 'username', 'organization', 'organization-title', 'country', 'country-name', 'language']; + $allowedForPassword = ['new-password', 'current-password']; + + switch ($fieldType) { + case 'input': + case 'textarea': + //allow all + return true; + case 'location': + return in_array($token, $allowedForAllTypes, true) || in_array($token, $allowedForLocation, true); + case 'select': + return in_array($token, $allowedForAllTypes, true) || in_array($token, $allowedForSelect, true); + case 'country': + return in_array($token, $allowedForAllTypes, true) || in_array($token, $allowedForCountry, true); + case 'hidden': + return in_array($token, $allowedForAllTypes, true) || in_array($token, $allowedForHidden, true); + case 'password': + return in_array($token, $allowedForAllTypes, true) || in_array($token, $allowedForPassword, true); + } + } +} diff --git a/Configuration/TCA/tx_powermail_domain_model_field.php b/Configuration/TCA/tx_powermail_domain_model_field.php index ddacbcf90..0ed843a4b 100644 --- a/Configuration/TCA/tx_powermail_domain_model_field.php +++ b/Configuration/TCA/tx_powermail_domain_model_field.php @@ -14,15 +14,19 @@ '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.palette1;1, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation_title;2, ' . + Field::TABLE_NAME . '.validation_title;2, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.prefill_title;32, ' . + Field::TABLE_NAME . '.prefill_title;32, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.palette.autocomplete;50, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.palette.autocomplete_additional;51, ' . '--palette--;Layout;43, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - 'tabs.access, sys_language_uid, ' . + 'tabs.access, sys_language_uid, ' . 'l10n_parent, l10n_diffsource, hidden, starttime, endtime'; /** @@ -34,15 +38,15 @@ '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.palette1;1, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation_title;21, ' . + Field::TABLE_NAME . '.validation_title;21, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.prefill_title;33, ' . + Field::TABLE_NAME . '.prefill_title;33, ' . '--palette--;Layout;43, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - 'tabs.access, sys_language_uid, ' . + 'tabs.access, sys_language_uid, ' . 'l10n_parent, l10n_diffsource, hidden, starttime, endtime'; /** @@ -53,15 +57,19 @@ '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.palette1;1, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation_title;21, ' . + Field::TABLE_NAME . '.validation_title;21, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.prefill_title;33, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.palette.autocomplete;50, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.prefill_title;33, ' . + Field::TABLE_NAME . '.palette.autocomplete_additional;51, ' . '--palette--;Layout;41, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - 'tabs.access, sys_language_uid, ' . + 'tabs.access, sys_language_uid, ' . 'l10n_parent, l10n_diffsource, hidden, starttime, endtime'; /** @@ -73,7 +81,7 @@ '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;Layout;43, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; @@ -87,9 +95,13 @@ '--palette--;Layout;43, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.palette.autocomplete;50, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.palette.autocomplete_additional;51, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . - 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; + 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; /** * Fieldtypes @@ -98,9 +110,13 @@ $typeSmallPrefill = 'page, title, type, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.prefill_title;31, ' . + Field::TABLE_NAME . '.prefill_title;31, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.palette.autocomplete;50, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.palette.autocomplete_additional;51, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; @@ -111,13 +127,17 @@ $typeSmallPrefillDescription = 'page, title, type, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation_title;21, ' . + Field::TABLE_NAME . '.validation_title;21, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.prefill_title;31, ' . + Field::TABLE_NAME . '.prefill_title;31, ' . '--palette--;Layout;43, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.palette.autocomplete;50, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.palette.autocomplete_additional;51, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; @@ -128,11 +148,15 @@ $typeSmallMandatory = 'page, title, type, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation_title;21, ' . + Field::TABLE_NAME . '.validation_title;21, ' . '--palette--;Layout;43, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.palette.autocomplete;50, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.palette.autocomplete_additional;51, ' . + '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; @@ -145,7 +169,7 @@ '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;Layout;43, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; @@ -157,7 +181,7 @@ '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;Layout;43, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; @@ -168,13 +192,13 @@ $typeFile = 'page, title, type, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation_title;21, ' . + Field::TABLE_NAME . '.validation_title;21, ' . '--palette--;Layout;41, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - 'tabs.access, sys_language_uid, ' . + 'tabs.access, sys_language_uid, ' . 'l10n_parent, l10n_diffsource, hidden, starttime, endtime'; /** @@ -184,13 +208,13 @@ $typeDate = 'page, title, type, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation_title;21, ' . + Field::TABLE_NAME . '.validation_title;21, ' . '--palette--;Layout;42, ' . 'description, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - 'tabs.access, sys_language_uid, ' . + 'tabs.access, sys_language_uid, ' . 'l10n_parent, l10n_diffsource, hidden, starttime, endtime'; /** @@ -201,7 +225,7 @@ '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . '--palette--;Layout;43, ' . '--palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.marker_title;5, ' . + Field::TABLE_NAME . '.marker_title;5, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime'; @@ -275,6 +299,12 @@ 'showitem' => 'auto_marker, marker, own_marker_select', 'canNotCollapse' => 1, ], + '50' => [ + 'showitem' => 'autocomplete_token,autocomplete_purpose', + ], + '51' => [ + 'showitem' => 'autocomplete_section,autocomplete_type', + ], 'canNotCollapse' => '1', ], 'types' => [ @@ -420,107 +450,107 @@ 'items' => [ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.spacer1', + Field::TABLE_NAME . '.type.spacer1', 'value' => '--div--', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.0', + Field::TABLE_NAME . '.type.0', 'value' => 'input', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.1', + Field::TABLE_NAME . '.type.1', 'value' => 'textarea', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.2', + Field::TABLE_NAME . '.type.2', 'value' => 'select', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.3', + Field::TABLE_NAME . '.type.3', 'value' => 'check', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.4', + Field::TABLE_NAME . '.type.4', 'value' => 'radio', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.5', + Field::TABLE_NAME . '.type.5', 'value' => 'submit', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.spacer2', + Field::TABLE_NAME . '.type.spacer2', 'value' => '--div--', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.6', + Field::TABLE_NAME . '.type.6', 'value' => 'captcha', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.7', + Field::TABLE_NAME . '.type.7', 'value' => 'reset', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.8', + Field::TABLE_NAME . '.type.8', 'value' => 'text', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.9', + Field::TABLE_NAME . '.type.9', 'value' => 'content', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.10', + Field::TABLE_NAME . '.type.10', 'value' => 'html', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.11', + Field::TABLE_NAME . '.type.11', 'value' => 'password', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.12', + Field::TABLE_NAME . '.type.12', 'value' => 'file', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.13', + Field::TABLE_NAME . '.type.13', 'value' => 'hidden', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.14', + Field::TABLE_NAME . '.type.14', 'value' => 'date', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.17', + Field::TABLE_NAME . '.type.17', 'value' => 'country', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.15', + Field::TABLE_NAME . '.type.15', 'value' => 'location', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.16', + Field::TABLE_NAME . '.type.16', 'value' => 'typoscript', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.spacer3', + Field::TABLE_NAME . '.type.spacer3', 'value' => '--div--', ], ], @@ -620,8 +650,8 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.spacer1', - 'value' => '--div--', + Field::TABLE_NAME . '.type.spacer1', + 'value' => '--div--', ], /** * EMAIL (+html5) @@ -631,7 +661,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.1', + Field::TABLE_NAME . '.validation.1', 'value' => 1, ], /** @@ -642,7 +672,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.2', + Field::TABLE_NAME . '.validation.2', 'value' => 2, ], /** @@ -655,7 +685,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.3', + Field::TABLE_NAME . '.validation.3', 'value' => 3, ], /** @@ -666,7 +696,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.4', + Field::TABLE_NAME . '.validation.4', 'value' => 4, ], /** @@ -677,7 +707,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.5', + Field::TABLE_NAME . '.validation.5', 'value' => 5, ], /** @@ -685,7 +715,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.spacer2', + Field::TABLE_NAME . '.type.spacer2', 'value' => '--div--', ], /** @@ -697,7 +727,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.6', + Field::TABLE_NAME . '.validation.6', 'value' => 6, ], /** @@ -709,7 +739,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.7', + Field::TABLE_NAME . '.validation.7', 'value' => 7, ], /** @@ -722,7 +752,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.8', + Field::TABLE_NAME . '.validation.8', 'value' => 8, ], /** @@ -734,7 +764,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.9', + Field::TABLE_NAME . '.validation.9', 'value' => 9, ], /** @@ -747,7 +777,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.validation.10', + Field::TABLE_NAME . '.validation.10', 'value' => 10, ], /** @@ -755,7 +785,7 @@ */ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.type.spacer3', + Field::TABLE_NAME . '.type.spacer3', 'value' => '--div--', ], ], @@ -813,52 +843,52 @@ ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.name', + Field::TABLE_NAME . '.feuser_value.name', 'value' => 'name', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.address', + Field::TABLE_NAME . '.feuser_value.address', 'value' => 'address', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.phone', + Field::TABLE_NAME . '.feuser_value.phone', 'value' => 'telephone', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.fax', + Field::TABLE_NAME . '.feuser_value.fax', 'value' => 'fax', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.email', + Field::TABLE_NAME . '.feuser_value.email', 'value' => 'email', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.zip', + Field::TABLE_NAME . '.feuser_value.zip', 'value' => 'zip', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.city', + Field::TABLE_NAME . '.feuser_value.city', 'value' => 'city', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.country', + Field::TABLE_NAME . '.feuser_value.country', 'value' => 'country', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.www', + Field::TABLE_NAME . '.feuser_value.www', 'value' => 'www', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.feuser_value.company', + Field::TABLE_NAME . '.feuser_value.company', 'value' => 'company', ], ], @@ -893,7 +923,7 @@ ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.css.1', - 'value' => 'layout1', + 'value' => 'layout1', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.css.2', @@ -933,17 +963,17 @@ 'items' => [ [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.datepicker_settings.1', + Field::TABLE_NAME . '.datepicker_settings.1', 'value' => 'date', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.datepicker_settings.2', + Field::TABLE_NAME . '.datepicker_settings.2', 'value' => 'datetime', ], [ 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . - Field::TABLE_NAME . '.datepicker_settings.3', + Field::TABLE_NAME . '.datepicker_settings.3', 'value' => 'time', ], ], @@ -1010,7 +1040,7 @@ 'renderType' => 'selectSingle', 'items' => [ [ - 'label' =>'', + 'label' => '', 'value' => 0, ], ], @@ -1025,6 +1055,97 @@ 'type' => 'none', ], ], + 'autocomplete_section' => [ + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.autocomplete_section', + 'config' => [ + 'type' => 'input', + 'eval' => 'trim', + 'max' => '100', + 'behaviour' => [ + 'allowLanguageSynchronization' => true, + ], + ], + 'displayCond' => [ + 'AND' => [ + 'FIELD:type:IN:input,textarea,password,select,country,location,hidden', + 'FIELD:autocomplete_token:!IN:on,off,nickname,sex,impp,url,organization-title,username,new-password,current-password,one-time-code,bday,bday-day,bday-month,bday-year,language,photo', + 'FIELD:autocomplete_token:REQ:true', + ], + ], + ], + 'autocomplete_type' => [ + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.autocomplete_type', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['label' => '', 'value' => ''], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_type.billing', 'value' => 'billing'], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_type.shipping', 'value' => 'shipping'], + ], + ], + 'displayCond' => [ + 'AND' => [ + 'FIELD:type:IN:input,textarea,select,country,location,hidden', + 'FIELD:autocomplete_token:!IN:on,off,nickname,sex,impp,url,organization-title,tel-country-code,tel-area-code,tel-national,tel-local,tel-local-prefix,tel-local-suffix,tel-extension,username,new-password,current-password,one-time-code,bday,bday-day,bday-month,bday-year,language,photo', + 'FIELD:autocomplete_token:REQ:true', + ], + ], + ], + 'autocomplete_purpose' => [ + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.autocomplete_purpose', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['label' => '', 'value' => ''], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_purpose.home', 'value' => 'home'], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_purpose.work', 'value' => 'work'], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_purpose.mobile', 'value' => 'mobile'], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_purpose.fax', 'value' => 'fax'], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_purpose.pager', 'value' => 'pager'], + ], + + ], + 'displayCond' => [ + 'AND' => [ + 'FIELD:type:IN:input,textarea,select,country,location,hidden', + 'FIELD:autocomplete_token:IN:email,impp,tel', + ], + ], + ], + 'autocomplete_token' => [ + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.autocomplete_token', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'itemsProcFunc' => 'In2code\Powermail\Tca\AddAutocompleteTokens->getAutocompleteTokens', + 'itemsProcConfig' => [ + 'useDefaultItems' => true, + ], + 'items' => [ + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.none', 'value' => ''], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.on', 'value' => 'on', 'icon' => '', 'group' => 'general'], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.off', 'value' => 'off', 'icon' => '', 'group' => 'general'], + ], + 'itemGroups' => [ + 'general' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.general', + 'name' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.name', + 'contact' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.contact', + 'address' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.address', + 'tel' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.tel', + 'bday' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.bday', + 'user' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.user', + 'cc' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.cc', + 'other' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.groups.other', + ], + 'default' => '', + 'behaviour' => [ + 'allowLanguageSynchronization' => true, + ], + ], + 'displayCond' => 'FIELD:type:IN:'.$fieldsWithAutocompleteOptions, + ], ], ]; return $fieldsTca; diff --git a/Configuration/TCA/tx_powermail_domain_model_form.php b/Configuration/TCA/tx_powermail_domain_model_form.php index ca3f556be..dbf6df8b1 100644 --- a/Configuration/TCA/tx_powermail_domain_model_form.php +++ b/Configuration/TCA/tx_powermail_domain_model_form.php @@ -33,7 +33,7 @@ 'showitem' => 'title, pages, note, ' . '--div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Field::TABLE_NAME . '.sheet1, ' . - 'css, --div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . + 'css,autocomplete_token, --div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:tabs.access, ' . 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, starttime, endtime', ], ], @@ -177,6 +177,23 @@ ], ], ], + 'autocomplete_token' => [ + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Form::TABLE_NAME . '.autocomplete_token', + 'description' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:' . Form::TABLE_NAME . '.autocomplete_token.description', + 'config' => [ + 'type' => 'select', + 'renderType' => 'selectSingle', + 'items' => [ + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.none', 'value' => ''], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.on', 'value' => 'on'], + ['label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xlf:autocomplete_token.off', 'value' => 'off'], + ], + 'default' => '', + 'behaviour' => [ + 'allowLanguageSynchronization' => true, + ], + ], + ], ], ]; diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf index 16eefed23..88f4947c8 100644 --- a/Resources/Private/Language/locallang_db.xlf +++ b/Resources/Private/Language/locallang_db.xlf @@ -114,6 +114,9 @@ Pages + + Autocomplete + Page @@ -375,6 +378,24 @@ Email or Name + + Autocomplete options + + + Additional autocomplete options + + + Token (optional) + + + Section (optional) + + + Purpose (optional) + + + Type (optional) + Answer @@ -633,6 +654,227 @@ More ... + + Disable attribute (default) + + + Automatically complete (on) + + + Do not automatically complete (off) + + + General + + + Personal information + + + Birthday + + + User information + + + Contact information + + + Individual address information + + + Payment information + + + Telephone + + + Other + + + Full name + + + Prefix or title + + + Given (or "first") name + + + Middle name + + + Family (or "last") name + + + Honorific suffix + + + Nickname + + + Gender identity + + + Email address + + + Instant messaging protocol endpoint + + + Website + + + Organization title + + + Organization + + + Street address + + + Address line 1 + + + Address line 2 + + + Address line 3 + + + First administrative level + + + Second administrative level + + + Third administrative level + + + Fourth administrative level + + + Country or territory code + + + Country or territory name + + + Postal code (ZIP) + + + Full telephone no. + + + Country code + + + Area code + + + Telephone number without the county code component + + + Telephone number without the country or area code + + + Exchange number + + + Number within exchange + + + Internal extension code + + + Username + + + New password + + + Current password + + + One-time verification code + + + Birthday + + + Day component of birthday + + + Month component of birthday + + + Year component of birthday + + + Full name + + + Given (or "first") name + + + Middle name + + + Family (or "last") name + + + Identification code, e.g. CC no. + + + Expiration date + + + Month component of the expiration date + + + Year component of the expiration date + + + Security code + + + Type of payment instrument + + + Transaction currency + + + Transaction amount + + + Preferred language + + + Photo + + + + Home + + + Work + + + Mobile + + + Fax + + + Pager + + + + Billing + + + Shipping + diff --git a/Resources/Private/Partials/Form/Field/Country.html b/Resources/Private/Partials/Form/Field/Country.html index 16726b402..552e81088 100644 --- a/Resources/Private/Partials/Form/Field/Country.html +++ b/Resources/Private/Partials/Form/Field/Country.html @@ -16,6 +16,7 @@ prependOptionLabel="{f:translate(key:'pleaseChoose')}" class="powermail_country {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" value="{vh:misc.prefillField(field:field, mail:mail)}" + autocomplete="{vh:string.autocomplete(field:field)}" additionalAttributes="{vh:validation.validationDataAttribute(field:field)}" id="powermail_field_{field.marker}" /> diff --git a/Resources/Private/Partials/Form/Field/Hidden.html b/Resources/Private/Partials/Form/Field/Hidden.html index 162e609e1..d0c9c9d41 100644 --- a/Resources/Private/Partials/Form/Field/Hidden.html +++ b/Resources/Private/Partials/Form/Field/Hidden.html @@ -3,4 +3,5 @@ id="powermail_field_{field.marker}" property="{field.marker}" value="{vh:misc.prefillField(field:field, mail:mail)}" - class="powermail_hidden {field.css} powermail_{field.marker}" /> + class="powermail_hidden {field.css} powermail_{field.marker}" + autocomplete="{vh:string.autocomplete(field:field)}" /> diff --git a/Resources/Private/Partials/Form/Field/Input.html b/Resources/Private/Partials/Form/Field/Input.html index 70f39ca37..3952270b9 100644 --- a/Resources/Private/Partials/Form/Field/Input.html +++ b/Resources/Private/Partials/Form/Field/Input.html @@ -10,6 +10,7 @@ placeholder="{field.placeholder}" value="{vh:misc.prefillField(field:field, mail:mail)}" class="powermail_input {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" + autocomplete="{vh:string.autocomplete(field:field)}" additionalAttributes="{vh:validation.validationDataAttribute(field:field)}" id="powermail_field_{field.marker}" /> diff --git a/Resources/Private/Partials/Form/Field/Location.html b/Resources/Private/Partials/Form/Field/Location.html index 963180d84..4f041da0b 100644 --- a/Resources/Private/Partials/Form/Field/Location.html +++ b/Resources/Private/Partials/Form/Field/Location.html @@ -10,6 +10,7 @@ property="{field.marker}" value="{vh:misc.prefillField(field:field, mail:mail)}" additionalAttributes="{data-powermail-location:'prefill',data-powermail-eidurl:'{f:uri.page(absolute:1)}'}" + autocomplete="{vh:string.autocomplete(field:field)}" class="powermail_location {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}"/> diff --git a/Resources/Private/Partials/Form/Field/Password.html b/Resources/Private/Partials/Form/Field/Password.html index 864bc930b..56486cb85 100644 --- a/Resources/Private/Partials/Form/Field/Password.html +++ b/Resources/Private/Partials/Form/Field/Password.html @@ -8,6 +8,7 @@ id="powermail_field_{field.marker}" property="{field.marker}" value="" + autocomplete="{vh:string.autocomplete(field:field)}" additionalAttributes="{vh:validation.validationDataAttribute(field:field)}" class="powermail_password {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" /> @@ -25,6 +26,7 @@ id="powermail_field_{field.marker}_mirror" property="{field.marker}_mirror" value="" + autocomplete="{vh:string.autocomplete(field:field)}" additionalAttributes="{vh:validation.passwordValidationDataAttribute(field:field)}" class="powermail_password {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" /> diff --git a/Resources/Private/Partials/Form/Field/Select.html b/Resources/Private/Partials/Form/Field/Select.html index cbaf31a36..637e8ef76 100644 --- a/Resources/Private/Partials/Form/Field/Select.html +++ b/Resources/Private/Partials/Form/Field/Select.html @@ -9,6 +9,7 @@ property="{field.marker}" class="powermail_select {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" id="powermail_field_{field.marker}" + autocomplete="{vh:string.autocomplete(field:field)}" additionalAttributes="{vh:validation.validationDataAttribute(field:field)}" multiple="{field.multiselectForField}" value="{vh:misc.prefillField(field:field, mail:mail)}" /> diff --git a/Resources/Private/Partials/Form/Field/Textarea.html b/Resources/Private/Partials/Form/Field/Textarea.html index e26003138..fef995e12 100644 --- a/Resources/Private/Partials/Form/Field/Textarea.html +++ b/Resources/Private/Partials/Form/Field/Textarea.html @@ -11,6 +11,7 @@ property="{field.marker}" placeholder="{field.placeholder}" value="{vh:misc.prefillField(field:field, mail:mail)}" + autocomplete="{vh:string.autocomplete(field:field)}" additionalAttributes="{vh:validation.validationDataAttribute(field:field)}" class="powermail_textarea {settings.styles.framework.fieldClasses} {vh:validation.errorClass(field:field, class:'powermail_field_error')}" /> diff --git a/Resources/Private/Templates/Form/Form.html b/Resources/Private/Templates/Form/Form.html index 67b969ab1..27811d27e 100644 --- a/Resources/Private/Templates/Form/Form.html +++ b/Resources/Private/Templates/Form/Form.html @@ -20,6 +20,7 @@ section="c{ttContentData.uid}" name="field" enctype="multipart/form-data" + autocomplete="{form.autocompleteToken}" additionalAttributes="{vh:validation.enableJavascriptValidationAndAjax(form:form)}" addQueryString="{settings.misc.addQueryString}" class="powermail_form powermail_form_{form.uid} {form.css} {settings.styles.framework.formClasses} {vh:misc.morestepClass(activate:settings.main.moresteps)}"> diff --git a/composer.json b/composer.json index 2322eb218..02cd9079d 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "license": "GPL-2.0-or-later", "require": { "php": "^8.1", - "typo3/cms-core": "^12.4", + "typo3/cms-core": "^12.4.18", "ext-json": "*", "ext-gd": "*", "ext-fileinfo": "*", diff --git a/ext_tables.sql b/ext_tables.sql index 26029b6fc..cd8501f03 100644 --- a/ext_tables.sql +++ b/ext_tables.sql @@ -10,6 +10,7 @@ CREATE TABLE tx_powermail_domain_model_form ( note tinyint(4) unsigned DEFAULT '0' NOT NULL, css varchar(255) DEFAULT '' NOT NULL, pages varchar(255) DEFAULT '' NOT NULL, + autocomplete_token varchar(3) DEFAULT '' NOT NULL, tstamp int(11) unsigned DEFAULT '0' NOT NULL, crdate int(11) unsigned DEFAULT '0' NOT NULL, @@ -114,6 +115,10 @@ CREATE TABLE tx_powermail_domain_model_field ( mandatory tinyint(4) unsigned DEFAULT '0' NOT NULL, own_marker_select tinyint(4) unsigned DEFAULT '0' NOT NULL, marker varchar(255) DEFAULT '' NOT NULL, + autocomplete_token varchar(20) DEFAULT '' NOT NULL, + autocomplete_section varchar(100) DEFAULT '' NOT NULL, + autocomplete_type varchar(8) DEFAULT '' NOT NULL, + autocomplete_purpose varchar(8) DEFAULT '' NOT NULL, # Dummy Fields auto_marker tinyint(2) unsigned DEFAULT '0' NOT NULL,