/**
  * 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);
                 }
             }
         }
     }
 }
Example #2
0
 /**
  * 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);
     }
 }