/** * Move all userdefined properties to the additionalArguments * array. Ignore the child elements * * @return void */ public function moveAllOtherUserdefinedPropertiesToAdditionalArguments() { $viewHelperDefaultArguments = $this->typoScriptRepository->getModelConfigurationByScope($this->element->getElementType(), 'viewHelperDefaultArguments.'); $ignoreKeys = array(); foreach ($this->userConfiguredElementTyposcript as $attributeName => $attributeValue) { // ignore child elements if (MathUtility::canBeInterpretedAsInteger($attributeName) || isset($ignoreKeys[$attributeName]) || $attributeName == 'postProcessor.' || $attributeName == 'rules.' || $attributeName == 'filters.' || $attributeName == 'layout') { $ignoreKeys[$attributeName . '.'] = true; continue; } $attributeNameWithoutDot = rtrim($attributeName, '.'); $attributeNameToSet = $attributeNameWithoutDot; if (isset($viewHelperDefaultArguments[$attributeName]) || isset($viewHelperDefaultArguments[$attributeNameWithoutDot])) { $this->formBuilder->getFormUtility()->renderArrayItems($attributeValue); $attributeValue = $this->typoScriptService->convertTypoScriptArrayToPlainArray($attributeValue); } else { $attributeValue = $this->formBuilder->getFormUtility()->renderItem($this->userConfiguredElementTyposcript[$attributeNameWithoutDot . '.'], $this->userConfiguredElementTyposcript[$attributeNameWithoutDot]); } $this->additionalArguments[$attributeNameToSet] = $attributeValue; $ignoreKeys[$attributeNameToSet . '.'] = true; $ignoreKeys[$attributeNameToSet] = true; unset($this->userConfiguredElementTyposcript[$attributeNameWithoutDot . '.']); unset($this->userConfiguredElementTyposcript[$attributeNameWithoutDot]); } // remove "stdWrap." from "additionalArguments" on // the FORM Element if (!$this->formBuilder->getConfiguration()->getContentElementRendering() && $this->element->getElementType() == 'FORM') { unset($this->additionalArguments['stdWrap']); unset($this->additionalArguments['stdWrap.']); } }
/** * Move all userdefined properties to the additionalArguments * array. Ignore the child elements * * @return void */ public function moveAllOtherUserdefinedPropertiesToAdditionalArguments() { $ignoreKeys = array(); foreach ($this->userConfiguredElementTyposcript as $attributeName => $attributeValue) { // ignore child elements if (MathUtility::canBeInterpretedAsInteger($attributeName) || isset($ignoreKeys[$attributeName]) || $attributeName == 'postProcessor.' || $attributeName == 'rules.' || $attributeName == 'filters.' || $attributeName == 'layout') { $ignoreKeys[$attributeName . '.'] = true; continue; } $attributeNameWithoutDot = rtrim($attributeName, '.'); $attributeNameToSet = $attributeNameWithoutDot; $rendered = false; if ($this->formBuilder->getConfiguration()->getCompatibility()) { $newAttributeName = $this->formBuilder->getCompatibilityService()->getNewAttributeName($this->element->getElementType(), $attributeNameWithoutDot); /* Should the attribute be renamed? */ if ($newAttributeName !== $attributeNameWithoutDot) { $attributeNameToSet = $newAttributeName; /* If the renamed attribute already exists in the user configured typoscript */ if ($this->arrayKeyExists($newAttributeName, $this->userConfiguredElementTyposcript)) { $attributeValue = $this->formBuilder->getFormUtility()->renderItem($this->userConfiguredElementTyposcript[$newAttributeName . '.'], $this->userConfiguredElementTyposcript[$newAttributeName]); /* set renamed attribute name with the value of the renamed attribute */ $this->additionalArguments[$newAttributeName] = $attributeValue; /* unset the renamed attribute */ $ignoreKeys[$newAttributeName . '.'] = true; $ignoreKeys[$newAttributeName] = true; unset($this->userConfiguredElementTyposcript[$newAttributeName . '.']); unset($this->userConfiguredElementTyposcript[$newAttributeName]); $rendered = true; } } } if ($rendered === false) { $attributeValue = $this->formBuilder->getFormUtility()->renderItem($this->userConfiguredElementTyposcript[$attributeNameWithoutDot . '.'], $this->userConfiguredElementTyposcript[$attributeNameWithoutDot]); $this->additionalArguments[$attributeNameToSet] = $attributeValue; $ignoreKeys[$attributeNameToSet . '.'] = true; $ignoreKeys[$attributeNameToSet] = true; } unset($this->userConfiguredElementTyposcript[$attributeNameWithoutDot . '.']); unset($this->userConfiguredElementTyposcript[$attributeNameWithoutDot]); } // remove "stdWrap." from "additionalArguments" on // the FORM Element if (!$this->formBuilder->getConfiguration()->getContentElementRendering() && $this->element->getElementType() == 'FORM') { unset($this->additionalArguments['stdWrap']); unset($this->additionalArguments['stdWrap.']); } }
/** * @param Element $model * @param array $optGroupData * @return void */ protected function checkElementForOptgroup(Element $model, array $optGroupData = array()) { if ($model->getElementType() === 'OPTGROUP') { $optGroupData = array('label' => $model->getAdditionalArgument('label'), 'disabled' => $model->getAdditionalArgument('disabled')); $this->getChildElements($model, $optGroupData); } else { $optionData = array('value' => $model->getAdditionalArgument('value') ?: $model->getElementCounter(), 'label' => $model->getAdditionalArgument('text'), 'selected' => $model->getAdditionalArgument('selected')); if (!empty($optionData['selected'])) { $this->selectedValues[] = $optionData['value']; } if (count($optGroupData)) { $optGroupLabel = $optGroupData['label']; $this->options[$optGroupLabel]['disabled'] = $optGroupData['disabled']; $this->options[$optGroupLabel]['options'][] = $optionData; } else { $this->options[] = $optionData; } } }
/** * Set the htmlAttributes and the additionalAttributes * Remap htmlAttributes to additionalAttributes if needed * * @param ElementBuilder $elementBuilder * @param Element $element * @return void */ protected function setAttributes(ElementBuilder $elementBuilder, Element $element) { $htmlAttributes = $this->typoScriptRepository->getModelDefinedHtmlAttributes($element->getElementType()); $elementBuilder->setHtmlAttributes($htmlAttributes); $elementBuilder->setHtmlAttributeWildcards(); $elementBuilder->overlayUserdefinedHtmlAttributeValues(); $elementBuilder->setNameAndId(); $elementBuilder->overlayFixedHtmlAttributeValues(); // remove all NULL values $htmlAttributes = array_filter($elementBuilder->getHtmlAttributes()); $elementBuilder->setHtmlAttributes($htmlAttributes); $elementBuilder->moveHtmlAttributesToAdditionalArguments(); $elementBuilder->setViewHelperDefaulArgumentsToAdditionalArguments(); $elementBuilder->moveAllOtherUserdefinedPropertiesToAdditionalArguments(); $htmlAttributes = $elementBuilder->getHtmlAttributes(); $userConfiguredElementTypoScript = $elementBuilder->getUserConfiguredElementTypoScript(); $additionalArguments = $elementBuilder->getAdditionalArguments(); $element->setHtmlAttributes($htmlAttributes); $additionalArguments = $this->typoScriptService->convertTypoScriptArrayToPlainArray($additionalArguments); $additionalArguments['prefix'] = $this->configuration->getPrefix(); $element->setAdditionalArguments($additionalArguments); $this->handleIncomingValues($element, $userConfiguredElementTypoScript); if ($element->getElementType() === 'FORM' && $this->getControllerAction() === 'show') { if (empty($element->getHtmlAttribute('action'))) { if ($element->getAdditionalArgument('confirmation') && (int) $element->getAdditionalArgument('confirmation') === 1) { $element->setAdditionalArgument('action', 'confirmation'); } else { $element->setAdditionalArgument('action', 'process'); } } else { $element->setAdditionalArgument('pageUid', $element->getHtmlAttribute('action')); $element->setAdditionalArgument('action', null); } } // needed if confirmation page is enabled if ($this->sessionUtility->getSessionData($element->getName()) && $element->getAdditionalArgument('uploadedFiles') === null) { $element->setAdditionalArgument('uploadedFiles', $this->sessionUtility->getSessionData($element->getName())); } }
/** * Set the layout for a element * Not supported / ignored: OPTGROUP, OPTION, layout.legend * * @param \TYPO3\CMS\Form\Domain\Model\Element $element * @param array $userConfiguredElementTyposcript The configuration array * @return void * @deprecated since TYPO3 CMS 7, this function will be removed in TYPO3 CMS 8, as the functionality is now done via fluid */ public function setElementLayouts(Element $element, array $userConfiguredElementTyposcript = array()) { GeneralUtility::deprecationLog('EXT:form: Do not use "layout." anymore. Deprecated since TYPO3 CMS 7, this function will be removed in TYPO3 CMS 8.'); if ($element->getElementType() === 'FORM') { $containerWrapReturn = $this->replaceTagWithMarker('elements', 'body', $this->getGlobalLayoutByElementType('CONTAINERWRAP')); if ($this->formBuilder->getControllerAction() === 'show') { $formWrapReturn = $this->replaceTagWithMarker('containerwrap', 'form', $this->getGlobalLayoutByElementType('FORM')); } elseif ($this->formBuilder->getControllerAction() === 'confirmation') { $formWrapReturn = $this->replaceTagWithMarker('containerwrap', 'body', $this->getGlobalLayoutByElementType('CONFIRMATION')); } else { $formWrapReturn = $this->replaceTagWithMarker('containerwrap', 'html', $this->getGlobalLayoutByElementType('HTML')); } $formLayout = str_replace($formWrapReturn['marker'], $containerWrapReturn['html'], $formWrapReturn['html']); $formContainerWrap = explode($containerWrapReturn['marker'], $formLayout); $layout['containerInnerWrap'] = $formContainerWrap; $element->setLayout($layout); $classFromLayout = $this->getElementClassFromLayout('form'); if (!empty($classFromLayout)) { if (!empty($element->getAdditionalArgument('class'))) { $classFromLayout .= ' ' . $element->getAdditionalArgument('class'); } $element->setAdditionalArgument('class', $classFromLayout); } return; } if (in_array($element->getElementType(), $this->registeredFormElements)) { /* Get the element layout definition or fallback to the global definition (if set) */ if (isset($userConfiguredElementTyposcript['layout'])) { $elementLayout = $userConfiguredElementTyposcript['layout']; } else { $elementLayout = $this->getGlobalLayoutByElementType($element->getElementType()); } /* if a element layout exist */ $elementWrap = null; if ($elementLayout) { $elementWrap = $this->determineElementOuterWraps($element->getElementType(), $elementLayout); if ($elementWrap['html'] !== '') { /* layout.label */ if (!in_array($element->getElementType(), $this->elementsWithoutLabel, true)) { $descriptionElementLayouts = $this->getDescriptionElementLayouts($element); if (!$descriptionElementLayouts['labelContainContent']) { $descriptionElementLayouts['labelLayout'] = ''; } else { $libxmlUseInternalErrors = libxml_use_internal_errors(true); $dom = new \DOMDocument('1.0', 'utf-8'); $dom->formatOutput = true; $dom->preserveWhiteSpace = false; if ($dom->loadXML($descriptionElementLayouts['labelLayout'])) { $nodes = $dom->getElementsByTagName('label'); if ($nodes->length) { $node = $nodes->item(0); if ($node) { $node->setAttribute('for', $element->getId()); $descriptionElementLayouts['labelLayout'] = $dom->saveXML($dom->firstChild); } } } libxml_use_internal_errors($libxmlUseInternalErrors); } /* Replace <label />, <error /> and <mandatory /> in the element wrap html */ $labelReturn = $this->replaceTagWithMarker('label', 'body', $elementWrap['html']); if ($labelReturn['html'] !== '') { $elementWrap['html'] = str_replace($labelReturn['marker'], $descriptionElementLayouts['labelLayout'], $labelReturn['html']); } $errorReturn = $this->replaceTagWithMarker('error', 'body', $elementWrap['html']); if ($errorReturn['html'] !== '') { $elementWrap['html'] = str_replace($errorReturn['marker'], $descriptionElementLayouts['errorLayout'], $errorReturn['html']); } $mandatoryReturn = $this->replaceTagWithMarker('mandatory', 'body', $elementWrap['html']); if ($mandatoryReturn['html'] !== '') { $elementWrap['html'] = str_replace($mandatoryReturn['marker'], $descriptionElementLayouts['mandatoryLayout'], $mandatoryReturn['html']); } } $elementWrap = explode($elementWrap['marker'], $elementWrap['html']); } else { $elementWrap = null; } } /* Set element outer wraps and set the default classes */ $elementOuterWrap = null; if ($this->getGlobalLayoutByElementType('ELEMENTWRAP')) { $libxmlUseInternalErrors = libxml_use_internal_errors(true); $dom = new \DOMDocument('1.0', 'utf-8'); $dom->formatOutput = true; $dom->preserveWhiteSpace = false; if ($dom->loadXML($this->getGlobalLayoutByElementType('ELEMENTWRAP'))) { $node = $dom->firstChild; if ($node) { $class = ''; if ($node->getAttribute('class') !== '') { $class = $node->getAttribute('class') . ' '; } $class .= 'csc-form-' . $element->getElementCounter() . ' csc-form-element csc-form-element-' . $element->getElementTypeLowerCase(); $node->setAttribute('class', $class); $elementOuterWrap = $dom->saveXML($dom->firstChild); $return = $this->replaceTagWithMarker('element', 'body', $elementOuterWrap); if ($return['marker'] !== '') { $elementOuterWrap = explode($return['marker'], $return['html']); if ($element->getElementType() === 'SELECT') { $layout = $element->getLayout(); $layout['optionOuterWrap'] = $elementOuterWrap; $element->setLayout($layout); } } else { /* this should never be happen */ $elementOuterWrap = null; } } } else { $elementOuterWrap = null; } libxml_use_internal_errors($libxmlUseInternalErrors); } if ($elementWrap && !$elementOuterWrap) { /* If only $elementWrap isset */ $layout = $element->getLayout(); $layout['elementOuterWrap'] = $elementWrap; $element->setLayout($layout); } elseif (!$elementWrap && $elementOuterWrap) { /* If only $elementOuterWrap isset */ $layout = $element->getLayout(); $layout['elementOuterWrap'] = $elementOuterWrap; $element->setLayout($layout); } elseif ($elementWrap && $elementOuterWrap) { /* If $elementWrap isset and $elementOuterWrap isset */ $elementWrap = array($elementOuterWrap[0] . $elementWrap[0], $elementWrap[1] . $elementOuterWrap[1]); $layout = $element->getLayout(); $layout['elementOuterWrap'] = $elementWrap; $element->setLayout($layout); } /* Set container inner wraps */ if (in_array($element->getElementType(), $this->containerElements)) { $elementWrap = $this->determineElementOuterWraps($element->getElementType(), $elementLayout); /* Replace the legend value */ $descriptionElementLayouts = $this->getDescriptionElementLayouts($element, 'legend'); if (!$descriptionElementLayouts['labelContainContent']) { $descriptionElementLayouts['labelLayout'] = ''; } /* No fieldset tag exist. * Ignore CONTAINERWRAP * */ if ($elementWrap['html'] === '') { $containerWrapReturn = $this->replaceTagWithMarker('elements', 'body', $elementLayout); if ($containerWrapReturn['marker'] && $containerWrapReturn['html']) { /* Replace <legend /> in the element wrap html */ $legendReturn = $this->replaceTagWithMarker('legend', 'body', $containerWrapReturn['html']); if ($legendReturn['html'] !== '') { $containerWrapReturn['html'] = str_replace($legendReturn['marker'], $descriptionElementLayouts['labelLayout'], $legendReturn['html']); } $containerWrap = explode($containerWrapReturn['marker'], $containerWrapReturn['html']); } else { $containerWrap = array('', ''); } $layout = $element->getLayout(); $layout['containerInnerWrap'] = $containerWrap; $layout['noFieldsetTag'] = true; $layout['legend'] = $descriptionElementLayouts['labelLayout']; $element->setLayout($layout); } else { /* set the wraps */ $containerOuterWrap = array('', ''); $containerOuterWrap = explode($elementWrap['marker'], $elementWrap['html']); $containerWrapReturn = $this->replaceTagWithMarker('elements', 'body', $this->getGlobalLayoutByElementType('CONTAINERWRAP')); $containerInnerWrap = explode($containerWrapReturn['marker'], $containerWrapReturn['html']); $containerWrap = array($containerOuterWrap[0] . $containerInnerWrap[0], $containerInnerWrap[1] . $containerOuterWrap[1]); $layout = $element->getLayout(); $layout['containerInnerWrap'] = $containerWrap; $layout['legend'] = $descriptionElementLayouts['labelLayout']; $element->setLayout($layout); $classFromLayout = $this->getElementClassFromLayout('fieldset'); if (!empty($classFromLayout)) { if (!empty($element->getHtmlAttribute('class'))) { $classFromLayout .= ' ' . $element->getHtmlAttribute('class'); } $element->setHtmlAttribute('class', $classFromLayout); } } } else { /* set class attribute for the element tag */ if ($this->formBuilder->getControllerAction() === 'show') { if ($elementType === 'TEXTAREA') { $tagName = 'textarea'; } elseif ($elementType === 'SELECT') { $tagName = 'select'; } else { $tagName = 'input'; } $classFromLayout = $this->getElementClassFromLayout($element->getElementType(), $tagName); if (!empty($classFromLayout)) { if (!empty($element->getAdditionalArgument('class'))) { $classFromLayout .= ' ' . $element->getAdditionalArgument('class'); } $element->setAdditionalArgument('class', $classFromLayout); } } } } }
/** * Handle the incoming form data * * @param Element $element The element * @param ValidationElement $validationElement * @param mixed $modelValue * @param FormBuilder $formBuilder * @return void */ public function handleIncomingFormValues(Element $element, ValidationElement $validationElement, $modelValue, FormBuilder $formBuilder) { $elementName = $element->getName(); if ($element->getElementType() === 'CHECKBOX') { $groupedElement = false; if ($element->getParentElement()->getElementType() === 'CHECKBOXGROUP') { $incomingName = $element->getParentElement()->getName(); $groupedElement = true; } else { $incomingName = $elementName; } $incomingData = $formBuilder->getIncomingData()->getIncomingField($incomingName); $checked = false; if (is_array($incomingData)) { if (isset($incomingData[$elementName]) && $incomingData[$elementName] !== '') { $this->setAttribute($element, 'checked', 'checked'); $checked = true; } else { $this->setAttribute($element, 'checked', null); } } else { if (!empty($modelValue) && $incomingData === $modelValue || $incomingData === $incomingName . '-' . $element->getElementCounter()) { $this->setAttribute($element, 'checked', 'checked'); $checked = true; } else { $this->setAttribute($element, 'checked', null); } } if ($groupedElement && $checked) { $element->getParentElement()->setAdditionalArgument('atLeastOneCheckedChildElement', true); } } elseif ($element->getElementType() === 'RADIO') { $groupedElement = false; if ($element->getParentElement()->getElementType() === 'RADIOGROUP') { $incomingName = $element->getParentElement()->getName(); $groupedElement = true; } else { $incomingName = $elementName; } $checked = false; $incomingData = $formBuilder->getIncomingData()->getIncomingField($incomingName); if (!empty($modelValue) && $incomingData === $modelValue || $incomingData === $incomingName . '-' . $element->getElementCounter()) { $this->setAttribute($element, 'checked', 'checked'); $checked = true; } else { $this->setAttribute($element, 'checked', null); } if ($groupedElement && $checked) { $element->getParentElement()->setAdditionalArgument('atLeastOneCheckedChildElement', true); } } elseif ($element->getElementType() === 'OPTION') { $modelValue = (string) ($element->getAdditionalArgument('value') ?: $element->getElementCounter()); if ($element->getParentElement()->getElementType() === 'OPTGROUP') { $parentName = $element->getParentElement()->getParentElement()->getName(); } else { $parentName = $element->getParentElement()->getName(); } $incomingData = $formBuilder->getIncomingData()->getIncomingField($parentName); /* Multiselect */ if (is_array($incomingData)) { if (in_array($modelValue, $incomingData, true)) { $element->setHtmlAttribute('selected', 'selected'); } else { $element->setHtmlAttribute('selected', null); } } else { if ($modelValue === $incomingData) { $element->setHtmlAttribute('selected', 'selected'); } else { $element->setHtmlAttribute('selected', null); } } } elseif ($element->getElementType() === 'TEXTAREA') { $incomingData = $formBuilder->getIncomingData()->getIncomingField($elementName); $element->setAdditionalArgument('text', $incomingData); } elseif ($element->getElementType() === 'FILEUPLOAD') { if ($formBuilder->getValidationErrors() == null || $formBuilder->getValidationErrors() && $formBuilder->getValidationErrors()->forProperty($elementName)->hasErrors() !== true) { $uploadedFiles = $formBuilder->getIncomingData()->getIncomingField($elementName); if (is_array($uploadedFiles)) { foreach ($uploadedFiles as $key => &$file) { $tempFilename = $this->saveUploadedFile($file['tmp_name']); if (!$tempFilename) { unset($uploadedFiles[$key]); continue; } $file['tempFilename'] = $tempFilename; } $element->setAdditionalArgument('uploadedFiles', $uploadedFiles); $this->setAttribute($element, 'value', ''); $this->sessionUtility->setSessionData($elementName, $uploadedFiles); } } } }