/** * 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); } } } } }
/** * 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 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); } }