37 'renderType' =>
'tcaDescription',
47 'localizationStateSelector' => [
48 'renderType' =>
'localizationStateSelector',
50 'otherLanguageContent' => [
51 'renderType' =>
'otherLanguageContent',
53 'localizationStateSelector'
56 'defaultLanguageDifferences' => [
57 'renderType' =>
'defaultLanguageDifferences',
59 'otherLanguageContent',
73 $table = $this->data[
'tableName'];
74 $fieldName = $this->data[
'fieldName'];
75 $row = $this->data[
'databaseRow'];
76 $parameterArray = $this->data[
'parameterArray'];
79 $itemValue = $parameterArray[
'itemFormElValue'];
80 $config = $parameterArray[
'fieldConf'][
'config'];
81 $evalList = GeneralUtility::trimExplode(
',', $config[
'eval'],
true);
84 $nullControlNameEscaped = htmlspecialchars(
'control[active][' . $table .
'][' . $row[
'uid'] .
'][' . $fieldName .
']');
87 $fieldInformationHtml = $fieldInformationResult[
'html'];
90 if ($config[
'readOnly']) {
92 if (in_array(
'password', $evalList,
true)) {
93 $itemValue = $itemValue ?
'*********' :
'';
96 $disabledFieldAttributes = [
97 'class' =>
'form-control',
98 'data-formengine-input-name' => $parameterArray[
'itemFormElName'],
100 'value' => $itemValue,
104 $html[] =
'<div class="formengine-field-item t3js-formengine-field-item">';
105 $html[] = $fieldInformationHtml;
106 $html[] =
'<div class="form-wizards-wrap">';
107 $html[] =
'<div class="form-wizards-element">';
108 $html[] =
'<div class="form-control-wrap" style="max-width: ' . $width .
'px">';
109 $html[] =
'<input ' . GeneralUtility::implodeAttributes($disabledFieldAttributes,
true) .
' disabled>';
114 $resultArray[
'html'] = implode(LF, $html);
119 foreach ($evalList as $func) {
123 if (isset(
$GLOBALS[
'TYPO3_CONF_VARS'][
'SC_OPTIONS'][
'tce'][
'formevals'][$func])) {
124 if (class_exists($func)) {
125 $evalObj = GeneralUtility::makeInstance($func);
126 if (method_exists($evalObj,
'deevaluateFieldValue')) {
128 'value' => $itemValue
130 $itemValue = $evalObj->deevaluateFieldValue($_params);
132 if (method_exists($evalObj,
'returnFieldJS')) {
133 $resultArray[
'additionalJavaScriptPost'][] =
'TBE_EDITOR.customEvalFunctions[' . GeneralUtility::quoteJSvalue($func) .
']'
134 .
' = function(value) {' . $evalObj->returnFieldJS() .
'};';
145 'class' => implode(
' ', [
151 'data-formengine-input-params' => json_encode([
152 'field' => $parameterArray[
'itemFormElName'],
153 'evalList' => implode(
',', $evalList),
154 'is_in' => trim($config[
'is_in'])
156 'data-formengine-input-name' => $parameterArray[
'itemFormElName'],
159 $maxLength = $config[
'max'] ?? 0;
160 if ((
int)$maxLength > 0) {
161 $attributes[
'maxlength'] = (int)$maxLength;
163 if (!empty($config[
'placeholder'])) {
164 $attributes[
'placeholder'] = trim($config[
'placeholder']);
166 if (isset($config[
'autocomplete'])) {
167 $attributes[
'autocomplete'] = empty($config[
'autocomplete']) ?
'new-' . $fieldName :
'on';
170 $valuePickerHtml = [];
171 if (isset($config[
'valuePicker'][
'items']) && is_array($config[
'valuePicker'][
'items'])) {
172 $mode = $config[
'valuePicker'][
'mode'] ??
'';
173 $itemName = $parameterArray[
'itemFormElName'];
174 $fieldChangeFunc = $parameterArray[
'fieldChangeFunc'];
175 if ($mode ===
'append') {
176 $assignValue =
'document.querySelectorAll(' . GeneralUtility::quoteJSvalue(
'[data-formengine-input-name="' . $itemName .
'"]') .
')[0]'
177 .
'.value+=\'\'+this.options[this.selectedIndex].value';
178 } elseif ($mode ===
'prepend') {
179 $assignValue =
'document.querySelectorAll(' . GeneralUtility::quoteJSvalue(
'[data-formengine-input-name="' . $itemName .
'"]') .
')[0]'
180 .
'.value=\'\'+this.options[this.selectedIndex].value+document.editform[' . GeneralUtility::quoteJSvalue($itemName) .
'].value';
182 $assignValue =
'document.querySelectorAll(' . GeneralUtility::quoteJSvalue(
'[data-formengine-input-name="' . $itemName .
'"]') .
')[0]'
183 .
'.value=this.options[this.selectedIndex].value';
185 $valuePickerHtml[] =
'<select';
186 $valuePickerHtml[] =
' class="form-control tceforms-select tceforms-wizardselect"';
187 $valuePickerHtml[] =
' onchange="' . htmlspecialchars($assignValue .
';this.blur();this.selectedIndex=0;' . implode(
'', $fieldChangeFunc)) .
'"';
188 $valuePickerHtml[] =
'>';
189 $valuePickerHtml[] =
'<option></option>';
190 foreach ($config[
'valuePicker'][
'items'] as $item) {
191 $valuePickerHtml[] =
'<option value="' . htmlspecialchars($item[1]) .
'">' . htmlspecialchars($languageService->sL($item[0])) .
'</option>';
193 $valuePickerHtml[] =
'</select>';
196 $valueSliderHtml = [];
197 if (isset($config[
'slider']) && is_array($config[
'slider'])) {
198 $id =
'slider-' . $fieldId;
199 $resultArray[
'requireJsModules'][] = [
'TYPO3/CMS/Backend/FormEngine/FieldWizard/ValueSlider' =>
200 'function(ValueSlider) { new ValueSlider(' . GeneralUtility::quoteJSvalue($id) .
'); }'
202 $min = $config[
'range'][
'lower'] ?? 0;
203 $max = $config[
'range'][
'upper'] ?? 10000;
204 $step = $config[
'slider'][
'step'] ?? 1;
205 $width = $config[
'slider'][
'width'] ?? 400;
207 if (in_array(
'int', $evalList,
true)) {
209 $itemValue = (int)$itemValue;
210 } elseif (in_array(
'double2', $evalList,
true)) {
211 $valueType =
'double';
212 $itemValue = (double)$itemValue;
214 $callbackParams = [ $table, $row[
'uid'], $fieldName, $parameterArray[
'itemFormElName'] ];
215 $valueSliderHtml[] =
'<div';
216 $valueSliderHtml[] =
' id="' . $id .
'"';
217 $valueSliderHtml[] =
' data-slider-id="' . $id .
'"';
218 $valueSliderHtml[] =
' data-slider-min="' . (int)$min .
'"';
219 $valueSliderHtml[] =
' data-slider-max="' . (int)$max .
'"';
220 $valueSliderHtml[] =
' data-slider-step="' . htmlspecialchars($step) .
'"';
221 $valueSliderHtml[] =
' data-slider-value="' . htmlspecialchars($itemValue) .
'"';
222 $valueSliderHtml[] =
' data-slider-value-type="' . htmlspecialchars($valueType) .
'"';
223 $valueSliderHtml[] =
' data-slider-item-name="' . htmlspecialchars($parameterArray[
'itemFormElName']) .
'"';
224 $valueSliderHtml[] =
' data-slider-callback-params="' . htmlspecialchars(json_encode($callbackParams)) .
'"';
225 $valueSliderHtml[] =
' style="width: ' . $width .
'px;"';
226 $valueSliderHtml[] =
'>';
227 $valueSliderHtml[] =
'</div>';
231 $fieldControlHtml = $fieldControlResult[
'html'];
235 $fieldWizardHtml = $fieldWizardResult[
'html'];
239 if (in_array(
'email', $evalList,
true)) {
240 $inputType =
'email';
241 } elseif (!empty(array_intersect($evalList, [
'int',
'num']))) {
242 $inputType =
'number';
244 if (isset($config[
'range'][
'lower'])) {
245 $attributes[
'min'] = (int)$config[
'range'][
'lower'];
247 if (isset($config[
'range'][
'upper'])) {
248 $attributes[
'max'] = (int)$config[
'range'][
'upper'];
253 $mainFieldHtml[] =
'<div class="form-control-wrap" style="max-width: ' . $width .
'px">';
254 $mainFieldHtml[] =
'<div class="form-wizards-wrap">';
255 $mainFieldHtml[] =
'<div class="form-wizards-element">';
256 $mainFieldHtml[] =
'<input type="' . $inputType .
'" ' . GeneralUtility::implodeAttributes($attributes,
true) .
' />';
257 $mainFieldHtml[] =
'<input type="hidden" name="' . $parameterArray[
'itemFormElName'] .
'" value="' . htmlspecialchars($itemValue) .
'" />';
258 $mainFieldHtml[] =
'</div>';
259 if (!empty($valuePickerHtml) || !empty($valueSliderHtml) || !empty($fieldControlHtml)) {
260 $mainFieldHtml[] =
'<div class="form-wizards-items-aside">';
261 $mainFieldHtml[] =
'<div class="btn-group">';
262 $mainFieldHtml[] = implode(LF, $valuePickerHtml);
263 $mainFieldHtml[] = implode(LF, $valueSliderHtml);
264 $mainFieldHtml[] = $fieldControlHtml;
265 $mainFieldHtml[] =
'</div>';
266 $mainFieldHtml[] =
'</div>';
268 if (!empty($fieldWizardHtml)) {
269 $mainFieldHtml[] =
'<div class="form-wizards-items-bottom">';
270 $mainFieldHtml[] = $fieldWizardHtml;
271 $mainFieldHtml[] =
'</div>';
273 $mainFieldHtml[] =
'</div>';
274 $mainFieldHtml[] =
'</div>';
275 $mainFieldHtml = implode(LF, $mainFieldHtml);
277 $fullElement = $mainFieldHtml;
279 $checked = $itemValue !==
null ?
' checked="checked"' :
'';
281 $fullElement[] =
'<div class="t3-form-field-disable"></div>';
282 $fullElement[] =
'<div class="checkbox t3-form-field-eval-null-checkbox">';
283 $fullElement[] =
'<label for="' . $nullControlNameEscaped .
'">';
284 $fullElement[] =
'<input type="hidden" name="' . $nullControlNameEscaped .
'" value="0" />';
285 $fullElement[] =
'<input type="checkbox" name="' . $nullControlNameEscaped .
'" id="' . $nullControlNameEscaped .
'" value="1"' . $checked .
' />';
286 $fullElement[] = $languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.nullCheckbox');
287 $fullElement[] =
'</label>';
288 $fullElement[] =
'</div>';
289 $fullElement[] = $mainFieldHtml;
290 $fullElement = implode(LF, $fullElement);
292 $checked = $itemValue !==
null ?
' checked="checked"' :
'';
293 $placeholder = $shortenedPlaceholder = $config[
'placeholder'] ??
'';
296 if (strlen($placeholder) > 0) {
297 $shortenedPlaceholder = GeneralUtility::fixed_lgd_cs($placeholder, 20);
298 if ($placeholder !== $shortenedPlaceholder) {
299 $overrideLabel = sprintf(
300 $languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override'),
301 '<span title="' . htmlspecialchars($placeholder) .
'">' . htmlspecialchars($shortenedPlaceholder) .
'</span>'
304 $overrideLabel = sprintf(
305 $languageService->sL(
'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override'),
306 htmlspecialchars($placeholder)
310 $overrideLabel = $languageService->sL(
311 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.placeholder.override_not_available'
315 $fullElement[] =
'<div class="checkbox t3js-form-field-eval-null-placeholder-checkbox">';
316 $fullElement[] =
'<label for="' . $nullControlNameEscaped .
'">';
317 $fullElement[] =
'<input type="hidden" name="' . $nullControlNameEscaped .
'" value="' . $fallbackValue .
'" />';
318 $fullElement[] =
'<input type="checkbox" name="' . $nullControlNameEscaped .
'" id="' . $nullControlNameEscaped .
'" value="1"' . $checked . $disabled .
' />';
319 $fullElement[] = $overrideLabel;
320 $fullElement[] =
'</label>';
321 $fullElement[] =
'</div>';
322 $fullElement[] =
'<div class="t3js-formengine-placeholder-placeholder">';
323 $fullElement[] =
'<div class="form-control-wrap" style="max-width:' . $width .
'px">';
324 $fullElement[] =
'<input type="text" class="form-control" disabled="disabled" value="' . htmlspecialchars($shortenedPlaceholder) .
'" />';
325 $fullElement[] =
'</div>';
326 $fullElement[] =
'</div>';
327 $fullElement[] =
'<div class="t3js-formengine-placeholder-formfield">';
328 $fullElement[] = $mainFieldHtml;
329 $fullElement[] =
'</div>';
330 $fullElement = implode(LF, $fullElement);
333 $resultArray[
'html'] =
'<div class="formengine-field-item t3js-formengine-field-item">' . $fieldInformationHtml . $fullElement .
'</div>';