/**
  * Get the label
  * @param \TYPO3\CMS\Form\Domain\Model\Element $model
  * @return string
  */
 protected function getLabel(\TYPO3\CMS\Form\Domain\Model\Element $model)
 {
     $label = '';
     if ($model->getAdditionalArgument('legend')) {
         $label = $model->getAdditionalArgument('legend');
     } elseif ($model->getAdditionalArgument('label')) {
         $label = $model->getAdditionalArgument('label');
     }
     return $label;
 }
 /**
  * @param array $typoScript
  * @return PostProcessor|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\CMS\Core\Tests\AccessibleObjectInterface
  */
 protected function createSubject(array $typoScript)
 {
     $subject = $this->getAccessibleMock(PostProcessor::class, array('__none'), array($this->elementProphecy->reveal(), $typoScript));
     $subject->_set('controllerContext', $this->controllerContextProphecy->reveal());
     $subject->_set('objectManager', $this->objectManagerProphecy->reveal());
     return $subject;
 }
Example #3
0
 /**
  * If the id is not defined it is automatically generated
  * using the following syntax: field-{element_counter}
  * The id attribute will be transformed if it contains some
  * non allowed characters:
  * - spaces are changed into hyphens
  * - if the id start with a integer then transform it to field-{integer}
  * - remove all characters expect a-z A-Z 0-9 _ - : .
  *
  * @param string $id
  * @return string
  */
 protected function sanitizeIdAttribute($id)
 {
     $id = $this->formBuilder->getFormUtility()->sanitizeIdAttribute($id);
     if (empty($id)) {
         $id = 'field-' . $this->element->getElementCounter();
     }
     return $id;
 }
Example #4
0
 /**
  * Set the rendered mandatory message
  * and the validation error message if available
  *
  * @param Element $element
  * @return void
  */
 protected function setValidationMessages(Element $element)
 {
     $elementName = $element->getName();
     $mandatoryMessages = $this->validationBuilder->getMandatoryValidationMessagesByElementName($elementName);
     $element->setMandatoryValidationMessages($mandatoryMessages);
     if ($this->getValidationErrors() && $this->getValidationErrors()->forProperty($elementName)->hasErrors()) {
         /** @var \TYPO3\CMS\Extbase\Error\Error[] $errors */
         $errors = $this->getValidationErrors()->forProperty($elementName)->getErrors();
         $errorMessages = array();
         foreach ($errors as $error) {
             $errorMessages[] = $error->getMessage();
         }
         $element->setValidationErrorMessages($errorMessages);
     }
 }
 /**
  * Replace <labelvalue /> or <legendvalue />, <mandatory />
  * and <error /> in a label / legend with the associated content.
  * Return the replaced <label /> / <legend /> layout and the replaced
  * <mandatory /> and <error /> layout.
  *
  * @param \TYPO3\CMS\Form\Domain\Model\Element $element
  * @param string $scope
  * @return array
  */
 protected function getDescriptionElementLayouts(Element $element, $scope = 'label')
 {
     $labelLayout = $this->getGlobalLayoutByElementType(strtoupper($scope));
     $labelContainContent = false;
     $mandatoryLayout = '';
     $errorLayout = '';
     if ($this->formBuilder->getControllerAction() === 'show') {
         /* Replace the mandatory and error messages */
         /* layout.mandatory */
         $mandatoryMessages = $this->formBuilder->getValidationBuilder()->getMandatoryValidationMessagesByElementName($element->getName());
         if (!empty($mandatoryMessages)) {
             $mandatoryLayout = $this->replaceLabelContent('mandatory', $mandatoryMessages);
         }
         $mandatoryReturn = $this->replaceTagWithMarker('mandatory', 'body', $labelLayout);
         if (!empty($mandatoryReturn['html'])) {
             if (!empty($mandatoryLayout)) {
                 $labelContainContent = true;
             }
             $labelLayout = str_replace($mandatoryReturn['marker'], $mandatoryLayout, $mandatoryReturn['html']);
         }
         /* layout.error */
         $errorMessages = $element->getValidationErrorMessages();
         if (!empty($errorMessages)) {
             $errorLayout = $this->replaceLabelContent('error', $errorMessages);
         }
         $errorReturn = $this->replaceTagWithMarker('error', 'body', $labelLayout);
         if (!empty($errorReturn['html'])) {
             if (!empty($errorLayout)) {
                 $labelContainContent = true;
             }
             $labelLayout = str_replace($errorReturn['marker'], $errorLayout, $errorReturn['html']);
         }
     }
     /* Replace the label value */
     $labelValueReturn = $this->replaceTagWithMarker($scope . 'value', 'body', $labelLayout);
     if (!empty($labelValueReturn['html'])) {
         if (!empty($element->getAdditionalArgument($scope))) {
             $labelContainContent = true;
         }
         $labelLayout = str_replace($labelValueReturn['marker'], $element->getAdditionalArgument($scope), $labelValueReturn['html']);
     }
     return array('labelContainContent' => $labelContainContent, 'labelLayout' => $labelLayout, 'errorLayout' => $errorLayout, 'mandatoryLayout' => $mandatoryLayout);
 }
 /**
  * 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);
     }
 }
 /**
  * @param Element $model
  * @param array $optGroupData
  * @return void
  */
 protected function getChildElements(Element $model, array $optGroupData = array())
 {
     foreach ($model->getChildElements() as $element) {
         $this->createElement($element, $optGroupData);
     }
 }
 /**
  * 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);
                 }
             }
         }
     }
 }