/** * Set the value Attribute to the right place * * @param Element $element The element * @param string $key * @param string $value * @return void */ public function setAttribute(Element $element, $key, $value = '') { if ($element->getHtmlAttribute($key) !== null) { $element->setHtmlAttribute($key, $value); } else { $element->setAdditionalArgument($key, $value); } }
/** * Handles the incoming form data * * @param Element $element * @param array $userConfiguredElementTypoScript * @return array */ protected function handleIncomingValues(Element $element, array $userConfiguredElementTypoScript) { if (!$this->getIncomingData()) { return; } $elementName = $element->getName(); if ($element->getHtmlAttribute('value') !== null) { $modelValue = $element->getHtmlAttribute('value'); } else { $modelValue = $element->getAdditionalArgument('value'); } if ($this->getIncomingData()->getIncomingField($elementName) !== null) { /* filter values and set it back to incoming fields */ /* remove xss every time */ $userConfiguredElementTypoScript['filters.'][-1] = 'removexss'; $keys = TemplateService::sortedKeyList($userConfiguredElementTypoScript['filters.']); foreach ($keys as $key) { $class = $userConfiguredElementTypoScript['filters.'][$key]; if ((int) $key && strpos($key, '.') === false) { $filterArguments = $userConfiguredElementTypoScript['filters.'][$key . '.']; $filterClassName = $this->typoScriptRepository->getRegisteredClassName((string) $class, 'registeredFilters'); if ($filterClassName !== null) { // toDo: handel array values if (is_string($this->getIncomingData()->getIncomingField($elementName))) { if (is_null($filterArguments)) { $filter = $this->objectManager->get($filterClassName); } else { $filter = $this->objectManager->get($filterClassName, $filterArguments); } if ($filter) { $value = $filter->filter($this->getIncomingData()->getIncomingField($elementName)); $this->getIncomingData()->setIncomingField($elementName, $value); } else { throw new \RuntimeException('Class "' . $filterClassName . '" could not be loaded.'); } } } else { throw new \RuntimeException('Class "' . $filterClassName . '" not registered via TypoScript.'); } } } if ($element->getHtmlAttribute('value') !== null) { $element->setHtmlAttribute('value', $this->getIncomingData()->getIncomingField($elementName)); } else { $element->setAdditionalArgument('value', $this->getIncomingData()->getIncomingField($elementName)); } } $this->signalSlotDispatcher->dispatch(__CLASS__, 'txFormHandleIncomingValues', array($element, $this->getIncomingData(), $modelValue, $this)); }
/** * 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)) { $labelLayout = $this->getGlobalLayoutByElementType('LABEL'); $mandatoryLayout = ''; $errorLayout = ''; if ($this->formBuilder->getControllerAction() === 'show') { /* layout.mandatory */ $mandatoryMessages = $this->formBuilder->getValidationBuilder()->getMandatoryValidationMessagesByElementName($element->getName()); if (!empty($mandatoryMessages)) { $mandatoryLayout = $this->replaceLabelContent('mandatory', $mandatoryMessages); } /* layout.error */ $errorMessages = $element->getValidationErrorMessages(); if (!empty($errorMessages)) { $errorLayout = $this->replaceLabelContent('error', $errorMessages); } } /* Replace the mandatory and error messages */ $mandatoryReturn = $this->replaceTagWithMarker('mandatory', 'body', $labelLayout); $labelContainContent = false; if ($mandatoryReturn['html'] !== '') { if (!empty($mandatoryLayout)) { $labelContainContent = true; } $labelLayout = str_replace($mandatoryReturn['marker'], $mandatoryLayout, $mandatoryReturn['html']); } $errorReturn = $this->replaceTagWithMarker('error', 'body', $labelLayout); if ($errorReturn['html'] !== '') { if (!empty($errorLayout)) { $labelContainContent = true; } $labelLayout = str_replace($errorReturn['marker'], $errorLayout, $errorReturn['html']); } /* Replace the label value */ $labelValueReturn = $this->replaceTagWithMarker('labelvalue', 'body', $labelLayout); if ($labelValueReturn['html'] !== '') { if (!empty($element->getAdditionalArgument('label'))) { $labelContainContent = true; } $labelLayout = str_replace($labelValueReturn['marker'], $element->getAdditionalArgument('label'), $labelValueReturn['html']); } if (!$labelContainContent) { $labelLayout = ''; } else { $libxmlUseInternalErrors = libxml_use_internal_errors(true); $dom = new \DOMDocument('1.0', 'utf-8'); $dom->formatOutput = true; $dom->preserveWhiteSpace = false; if ($dom->loadXML($labelLayout)) { $nodes = $dom->getElementsByTagName('label'); if ($nodes->length) { $node = $nodes->item(0); if ($node) { $node->setAttribute('for', $element->getId()); $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'], $labelLayout, $labelReturn['html']); } $errorReturn = $this->replaceTagWithMarker('error', 'body', $elementWrap['html']); if ($errorReturn['html'] !== '') { $elementWrap['html'] = str_replace($errorReturn['marker'], $errorLayout, $errorReturn['html']); } $mandatoryReturn = $this->replaceTagWithMarker('mandatory', 'body', $elementWrap['html']); if ($mandatoryReturn['html'] !== '') { $elementWrap['html'] = str_replace($mandatoryReturn['marker'], $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 */ $legendLayout = $this->getGlobalLayoutByElementType('LEGEND'); $legendValueReturn = $this->replaceTagWithMarker('legendvalue', 'body', $legendLayout); $legendContainContent = false; if ($legendValueReturn['html'] !== '') { if (!empty($element->getAdditionalArgument('legend'))) { $legendContainContent = true; } $legendLayout = str_replace($legendValueReturn['marker'], $element->getAdditionalArgument('legend'), $legendValueReturn['html']); } /* remove <mandatory /> and <error /> from legend */ $mandatoryReturn = $this->replaceTagWithMarker('mandatory', 'body', $legendLayout); if (!empty($mandatoryReturn['html'])) { $legendLayout = str_replace($mandatoryReturn['marker'], '', $mandatoryReturn['html']); } $errorReturn = $this->replaceTagWithMarker('error', 'body', $legendLayout); if (!empty($errorReturn['html'])) { $legendLayout = str_replace($errorReturn['marker'], '', $errorReturn['html']); } if (!$legendContainContent) { $legendLayout = ''; } /* No fieldset tag exist. * Ignore CONTAINERWRAP * */ if ($elementWrap['html'] === '') { $containerWrapReturn = $this->replaceTagWithMarker('elements', 'body', $elementLayout); $legendReturn = $this->replaceTagWithMarker('legend', 'body', $containerWrapReturn['html']); if ($legendReturn['html'] !== '') { $containerWrapReturn['html'] = str_replace($legendReturn['marker'], $legendLayout, $legendReturn['html']); } if ($containerWrapReturn['marker'] && $containerWrapReturn['html']) { $containerWrap = explode($containerWrapReturn['marker'], $containerWrapReturn['html']); } else { $containerWrap = array('', ''); } $layout = $element->getLayout(); $layout['containerInnerWrap'] = $containerWrap; $layout['noFieldsetTag'] = true; $element->setLayout($layout); } else { $legendReturn = $this->replaceTagWithMarker('legend', 'body', $elementWrap['html']); if ($legendReturn['html'] !== '') { $elementWrap['html'] = str_replace($legendReturn['marker'], $legendLayout, $legendReturn['html']); } /* 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; $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); } } } } }