From b9dab562c055b1561d831690632bb13c873386df Mon Sep 17 00:00:00 2001 From: Carsten Rose Date: Sat, 1 Feb 2020 19:53:42 +0100 Subject: [PATCH 01/48] Refs #10013 First implementation of CodeMirror. --- extension/Classes/Core/AbstractBuildForm.php | 89 ++++++++++++++++++-- extension/Classes/Core/Constants.php | 5 +- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/extension/Classes/Core/AbstractBuildForm.php b/extension/Classes/Core/AbstractBuildForm.php index e9ffea52..0cd9c199 100644 --- a/extension/Classes/Core/AbstractBuildForm.php +++ b/extension/Classes/Core/AbstractBuildForm.php @@ -3173,6 +3173,37 @@ abstract class AbstractBuildForm { return $element . HelperFormElement::getHelpBlock(); } + /** + * @param array $formElement + * @param $htmlFormElementName + * @param $value + * @param array $json + * @param string $mode + * @return string + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException + */ + public function buildEditor(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + + if (empty($formElement[FE_EDITOR_TYPE])) { + $formElement[FE_EDITOR_TYPE] = FE_EDITOR_TYPE_TINYMCE; + } + + switch ($formElement[FE_EDITOR_TYPE]) { + case FE_EDITOR_TYPE_TINYMCE: + $html = $this->buildEditorTinyMCE($formElement, $htmlFormElementName, $value, $json, $mode); + break; + case FE_EDITOR_TYPE_CODEMIRROR: + $html = $this->buildEditorCodeMirror($formElement, $htmlFormElementName, $value, $json, $mode); + break; + default: + throw new \UserFormException("Unexpected editor type: '" . $formElement[FE_EDITOR_TYPE] . "'", ERROR_FORMELEMENT_EDITOR_TYPE); + } + + return $html; + } + /** * Build a HTML 'textarea' element which becomes a TinyMCE Editor. * List of possible plugins: https://www.tinymce.com/docs/plugins/ @@ -3188,11 +3219,9 @@ abstract class AbstractBuildForm { * @throws \UserFormException * @throws \UserReportException */ - public function buildEditor(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { + public function buildEditorTinyMCE(array $formElement, $htmlFormElementName, $value, array &$json, $mode = FORM_LOAD) { $attribute = ''; - //TODO plugin autoresize nutzen um Editorgroesse anzugeben - $attribute .= Support::doAttribute('id', $formElement[FE_HTML_ID]); $attribute .= Support::doAttribute('name', $htmlFormElementName); // $attribute .= Support::doAttribute('id', $htmlFormElementName); @@ -3205,7 +3234,7 @@ abstract class AbstractBuildForm { $attribute .= Support::doAttribute('data-load', ($formElement[FE_DYNAMIC_UPDATE] === 'yes') ? 'data-load' : ''); $attribute .= Support::doAttribute('data-title', $formElement[FE_TOOLTIP]); - $formElement = $this->setEditorConfig($formElement, $htmlFormElementName); + $formElement = $this->setEditorTinyMCEConfig($formElement, $htmlFormElementName); // $formElement['editor-plugins']='autoresize code' // $formElement['editor-contextmenu']='link image | cell row column' $json = $this->getPrefixedElementsAsJSON(FE_EDITOR_PREFIX, $formElement); @@ -3223,6 +3252,55 @@ abstract class AbstractBuildForm { return $html . HelperFormElement::getHelpBlock() . $formElement[FE_TMP_EXTRA_BUTTON_HTML] . $formElement[FE_INPUT_EXTRA_BUTTON_INFO]; } + /** + * @param array $formElement + * @param $htmlFormElementName + * @param $value + * @param array $json + * @param $mode + * @return string + * @throws \CodeException + * @throws \UserFormException + * @throws \UserReportException + */ + public function buildEditorCodeMirror(array $formElement, $htmlFormElementName, $value, array &$json, $mode) { + $attribute = ''; + + $attribute .= Support::doAttribute('id', $formElement[FE_HTML_ID]); + $attribute .= Support::doAttribute('name', $htmlFormElementName); +// $attribute .= Support::doAttribute('id', $htmlFormElementName); + $attribute .= Support::doAttribute(ATTRIBUTE_DATA_REFERENCE, $formElement[FE_DATA_REFERENCE]); + + $attribute .= Support::doAttribute('class', 'qfq-codemirror'); +// $attribute .= Support::doAttribute('data-control-name', "$htmlFormElementName"); +// $attribute .= Support::doAttribute('data-placeholder', $formElement[FE_PLACEHOLDER]); +// $attribute .= Support::doAttribute('data-autofocus', $formElement[FE_AUTOFOCUS]); +// $attribute .= Support::doAttribute('data-load', ($formElement[FE_DYNAMIC_UPDATE] === 'yes') ? 'data-load' : ''); +// $attribute .= Support::doAttribute('data-title', $formElement[FE_TOOLTIP]); + +// $formElement = $this->setEditorTinyMCEConfig($formElement, $htmlFormElementName); + // $formElement['editor-plugins']='autoresize code' + // $formElement['editor-contextmenu']='link image | cell row column' + + $formElement[FE_EDITOR_PREFIX . 'mode'] = $formElement[FE_EDITOR_PREFIX . 'mode'] ?? "text/x-sql"; + $formElement[FE_EDITOR_PREFIX . 'lineNumbers'] = $formElement[FE_EDITOR_PREFIX . 'lineNumbers'] ?? true; + + $json = $this->getPrefixedElementsAsJSON(FE_EDITOR_PREFIX, $formElement); + + $attribute .= Support::doAttribute('data-config', $json, true); + + $attribute .= HelperFormElement::getAttributeFeMode($formElement[FE_MODE]); + $attribute .= HelperFormElement::getAttributeList($formElement, [F_FE_DATA_PATTERN_ERROR, F_FE_DATA_REQUIRED_ERROR, F_FE_DATA_MATCH_ERROR, F_FE_DATA_ERROR]); + + $json = $this->getFormElementForJson($htmlFormElementName, $value, $formElement); + + $html = Support::wrapTag("