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