diff --git a/extension/Classes/Core/Form/Checkbox.php b/extension/Classes/Core/Form/Checkbox.php index 02bc0133a696bc13258e9a734f2d975ce2c9ddaf..951d9815795ed71056b3fa2a80ec33396b99d7cf 100644 --- a/extension/Classes/Core/Form/Checkbox.php +++ b/extension/Classes/Core/Form/Checkbox.php @@ -16,13 +16,13 @@ namespace IMATHUZH\Qfq\Core\Form; //use IMATHUZH\Qfq\Core\Helper\Logger; //use IMATHUZH\Qfq\Core\Helper\OnArray; //use IMATHUZH\Qfq\Core\Helper\Sanitize; +use IMATHUZH\Qfq\Core\Helper\HelperFormElement; use IMATHUZH\Qfq\Core\Helper\Support; +use IMATHUZH\Qfq\Core\Store\Store; + //use IMATHUZH\Qfq\Core\Report\Link; //use IMATHUZH\Qfq\Core\Report\Report; //use IMATHUZH\Qfq\Core\Store\Sip; -use IMATHUZH\Qfq\Core\Helper\HelperFormElement; -use IMATHUZH\Qfq\Core\Store\Store; -use TYPO3\PharStreamWrapper\Helper; /** @@ -101,7 +101,7 @@ class Checkbox { $attributeBase = HelperFormElement::getAttributeFeMode($formElement[FE_MODE]); $attributeBase .= Support::doAttribute('type', $formElement[FE_TYPE]); - $attributeBase .= HelperFormElement::getAttributeList($formElement, [F_FE_DATA_PATTERN_ERROR, F_FE_DATA_REQUIRED_ERROR, F_FE_DATA_MATCH_ERROR, F_FE_DATA_ERROR]); + $attributeBase .= HelperFormElement::getAttributeList($formElement, [F_FE_DATA_REQUIRED_ERROR]); switch ($formElement['checkBoxMode']) { case 'single': @@ -178,6 +178,7 @@ class Checkbox { if ($formElement[FE_BUTTON_CLASS] == '') { $formElement[FE_BUTTON_CLASS] = 'btn-default'; } + $formElement[FE_BUTTON_CLASS] = 'btn ' . $formElement[FE_BUTTON_CLASS]; if ($formElement[FE_MODE] == FE_MODE_READONLY) { $formElement[FE_BUTTON_CLASS] .= ' disabled'; @@ -194,7 +195,6 @@ class Checkbox { * * Layout: The Bootstrap Layout needs very special setup, the checkboxes are wrapped differently with <div * class=checkbox> depending of if they aligned horizontal or vertical. - * * @param array $formElement * @param string $htmlFormElementName * @param string $attributeBase @@ -214,27 +214,30 @@ class Checkbox { $values = explode(',', $value); $attributeBase .= Support::doAttribute('data-load', ($formElement[FE_DYNAMIC_UPDATE] === 'yes') ? 'data-load' : ''); - $attributeBase .= HelperFormElement::getAttributeList($formElement, [F_FE_DATA_PATTERN_ERROR, F_FE_DATA_REQUIRED_ERROR, F_FE_DATA_MATCH_ERROR, F_FE_DATA_ERROR]); - - $key = HelperFormElement::prependFormElementNameCheckBoxMulti($htmlFormElementName, 'h', true); - $htmlHidden = HelperFormElement::buildNativeHidden($key, ''); - $this->fillStoreAdditionalFormElementsCheckboxHidden($formElement, $htmlFormElementName, $htmlHidden); + if ($formElement[FE_MODE] == FE_MODE_READONLY) { + $attributeBase .= Support::doAttribute('disabled', 'disabled'); + } $html = ''; - $attribute = $attributeBase; - if (isset($formElement[FE_AUTOFOCUS])) { - $attribute .= Support::doAttribute('autofocus', $formElement[FE_AUTOFOCUS]); - } + // Used in getFormElementForJson() for dynamic update. + $labelBaseClass = $formElement[FE_BUTTON_CLASS]; for ($ii = 0, $jj = 1; $ii < count($itemKey); $ii++, $jj++) { + + $attribute = $attributeBase; $jsonValue = false; $classActive = ''; + $htmlFormElementNameUniq = HelperFormElement::prependFormElementNameCheckBoxMulti($htmlFormElementName, $ii, true); - $attribute .= Support::doAttribute('id', $formElement[FE_HTML_ID] . '-' . $ii); + $attribute .= Support::doAttribute('id', HelperFormElement::getCheckboxRadioOptionId($formElement[FE_HTML_ID], $ii)); $attribute .= Support::doAttribute('name', $htmlFormElementNameUniq); $attribute .= Support::doAttribute(ATTRIBUTE_DATA_REFERENCE, $formElement[FE_DATA_REFERENCE] . '-' . $ii); + if (isset($formElement[FE_AUTOFOCUS])) { + $attribute .= Support::doAttribute('autofocus', $formElement[FE_AUTOFOCUS]); + unset ($formElement[FE_AUTOFOCUS]); + } $attribute .= Support::doAttribute('value', $itemKey[$ii], false); @@ -250,13 +253,13 @@ class Checkbox { $htmlElement = '<input ' . $attribute . '>' . $value; - $html .= Support::wrapTag("<label class='btn " . $formElement[FE_BUTTON_CLASS] . "$classActive'>", + $checkboxLabelId = HelperFormElement::getCheckboxRadioOptionId($formElement[FE_HTML_ID], $ii, HTML_ID_EXTENSION_LABEL); + $html .= Support::wrapTag("<label class='" . $formElement[FE_BUTTON_CLASS] . "$classActive' id=\"$checkboxLabelId\">", $htmlElement, true); - $json[] = $this->getFormElementForJsonCheckBox($htmlFormElementNameUniq, $jsonValue, $formElement); + $formElement[FE_TMP_CLASS_OPTION] = $labelBaseClass . $classActive; - // Init for the next checkbox - $attribute = $attributeBase; + $json[] = $this->getFormElementForJsonCheckBox($htmlFormElementNameUniq, $jsonValue, $formElement, $ii); } $html = Support::wrapTag('<div class="btn-group" data-toggle="buttons">', $html); @@ -270,6 +273,21 @@ class Checkbox { * Layout: The Bootstrap Layout needs very special setup, the checkboxes are wrapped differently with <div * class=checkbox> depending of if they aligned horizontal or vertical. * + * <div class="col-md-6" required="required"> + * <label class="checkbox-inline" id="1039-21332-1-0-0-l"> + * <input checked="checked" id="1039-21332-1-0-0" name="groups-1[]" required="required" type="checkbox" value="1"> + * label1 + * <span aria="hidden" class="checkmark"></span> + * </label> + * + * <label class="checkbox-inline" id="1039-21332-1-0-2-l"> + * <input id="1039-21332-1-2-0" name="groups-1[]" + * required="required" type="checkbox" value="2"> + * label2 + * <span aria="hidden" class="checkmark"></span> + * </label> + * </div> + * * @param array $formElement * @param string $htmlFormElementName * @param string $attributeBase @@ -289,14 +307,8 @@ class Checkbox { $values = explode(',', $value); $attributeBase .= Support::doAttribute('data-load', ($formElement[FE_DYNAMIC_UPDATE] === 'yes') ? 'data-load' : ''); - $attributeBase .= HelperFormElement::getAttributeList($formElement, [F_FE_DATA_PATTERN_ERROR, F_FE_DATA_REQUIRED_ERROR, F_FE_DATA_MATCH_ERROR, F_FE_DATA_ERROR]); - // 'font-weight: 400;': class 'checkbox' forces bold for the label - this is not ok. - $attributeBaseLabel = Support::doAttribute('style', 'min-width: ' . $formElement[F_FE_MIN_WIDTH] . 'px; font-weight: 400;'); - -// $key = HelperFormElement::prependFormElementNameCheckBoxMulti($htmlFormElementName, 'h'); -// $htmlHidden = HelperFormElement::buildNativeHidden($key, ''); -// $this->fillStoreAdditionalFormElementsCheckboxHidden($formElement, $htmlFormElementName, $htmlHidden); + $attributeBaseLabel = Support::doAttribute('style', 'min-width: ' . $formElement[F_FE_MIN_WIDTH] . 'px;'); $html = ''; @@ -305,26 +317,23 @@ class Checkbox { if ($formElement[FE_MODE] == FE_MODE_READONLY) { $checkboxClass .= ' qfq-disabled'; // necessary for own style checkboxes to display them 'disabled' } + // Used in getFormElementForJson() for dynamic update. $formElement[FE_TMP_CLASS_OPTION] = $checkboxClass; $br = ''; - $flagFirst = true; for ($ii = 0, $jj = 1; $ii < count($itemKey); $ii++, $jj++) { $jsonValue = false; $attribute = $attributeBase; $htmlFormElementNameUniq = HelperFormElement::prependFormElementNameCheckBoxMulti($htmlFormElementName, $ii, true); - $checkboxId = HelperFormElement::getCheckboxRadioOptionId($formElement[FE_HTML_ID], $ii); - $attribute .= Support::doAttribute('id', $checkboxId); + $attribute .= Support::doAttribute('id', HelperFormElement::getCheckboxRadioOptionId($formElement[FE_HTML_ID], $ii)); $attribute .= Support::doAttribute('name', $htmlFormElementNameUniq); $attribute .= Support::doAttribute(ATTRIBUTE_DATA_REFERENCE, $formElement[FE_DATA_REFERENCE] . '-' . $ii); - // Do this only the first round. - if ($flagFirst) { - $flagFirst = false; - if (isset($formElement[FE_AUTOFOCUS])) - $attribute .= Support::doAttribute('autofocus', $formElement[FE_AUTOFOCUS]); + if (isset($formElement[FE_AUTOFOCUS])) { + $attribute .= Support::doAttribute('autofocus', $formElement[FE_AUTOFOCUS]); + unset ($formElement[FE_AUTOFOCUS]); } $attribute .= Support::doAttribute('value', $itemKey[$ii], false); @@ -340,11 +349,6 @@ class Checkbox { $htmlElement = '<input ' . $attribute . '>' . $value; - // With ALIGN_HORIZONTAL: the label causes some trouble: skip it -// if (($orientation === ALIGN_VERTICAL)) { -// $htmlElement = Support::wrapTag('<label>', $htmlElement); -// } - $checkboxLabelId = HelperFormElement::getCheckboxRadioOptionId($formElement[FE_HTML_ID], $ii, HTML_ID_EXTENSION_LABEL); $htmlElement = Support::wrapTag("<label class=\"$checkboxClass\" $attributeBaseLabel id=\"$checkboxLabelId\">", $htmlElement, true); @@ -360,7 +364,7 @@ class Checkbox { } $html .= $htmlElement . $br; - $json[] = $this->getFormElementForJsonCheckbox($htmlFormElementNameUniq, $jsonValue, $formElement, $ii, $checkboxClass); + $json[] = $this->getFormElementForJsonCheckbox($htmlFormElementNameUniq, $jsonValue, $formElement, $ii); } @@ -502,12 +506,11 @@ class Checkbox { * @param array $formElement * * @param int $optionIdx - * @param string $class * @return array * @throws \CodeException * @throws \UserFormException */ - private function getFormElementForJsonCheckBox($htmlFormElementName, $value, array $formElement, $optionIdx = 0, $optionClass = '') { + private function getFormElementForJsonCheckBox($htmlFormElementName, $value, array $formElement, $optionIdx = 0) { $addClassRequired = array(); $json = HelperFormElement::getJsonFeMode($formElement[FE_MODE]); // disabled, required @@ -521,18 +524,10 @@ class Checkbox { } $statusHidden = ($formElement[FE_MODE] == 'hidden'); - $pattern = null; - if (isset($formElement[FE_CHECK_PATTERN]) && $formElement[FE_CHECK_PATTERN] != '') { - $pattern = $statusHidden ? false : $formElement[FE_CHECK_PATTERN]; - } // 'value' update via 'form-update' on the full row: only if there is no other FE in that row if ($flagRowUpdate) { $json[API_FORM_UPDATE_VALUE] = $value; - -//CR if ($pattern !== null) { -// $json['pattern'] = $pattern; -// } } if ($formElement[FE_MODE] == FE_MODE_REQUIRED || $formElement[FE_MODE] == FE_MODE_SHOW_REQUIRED) { @@ -558,15 +553,9 @@ class Checkbox { if (isset($formElement[FE_TYPE])) { $key = $formElement[FE_HTML_ID] . HTML_ID_EXTENSION_INPUT; - // For FE.type='note': update the column 'input' - if ($formElement[FE_TYPE] === FE_TYPE_NOTE) { - $json[API_ELEMENT_UPDATE][$key][API_ELEMENT_CONTENT] = $value; - } - // Check show/hide: only FE with FE_MODE_SQL given, might change. if (!empty($formElement[FE_MODE_SQL])) { $class = is_numeric($formElement[FE_BS_INPUT_COLUMNS]) ? ('col-md-' . $formElement[FE_BS_INPUT_COLUMNS]) : $formElement[FE_BS_INPUT_COLUMNS]; -// $class = 'col-md-' . $formElement[FE_BS_INPUT_COLUMNS] . ' '; $json[API_ELEMENT_UPDATE][$key][API_ELEMENT_ATTRIBUTE]['required'] = ($formElement[FE_MODE] == 'required'); $json[API_ELEMENT_UPDATE][$key][API_ELEMENT_ATTRIBUTE]['hidden'] = $statusHidden; @@ -589,25 +578,6 @@ class Checkbox { $class .= ($formElement[FE_MODE] == FE_MODE_HIDDEN) ? ' hidden' : ''; $json[API_ELEMENT_UPDATE][$key][API_ELEMENT_ATTRIBUTE]['class'] = $class; - if ($pattern !== null) { - $json[API_ELEMENT_UPDATE][$key][API_ELEMENT_ATTRIBUTE]['pattern'] = $pattern; - } - - } - - // #3647 -// if (!$flagRowUpdate) { - - // #4771 - temporary workaround: SELECT in 'multi FE row' won't updated after 'save' or with dynamic update. - //TODO #5016 - exception for FE_TYPE_CHECKBOX should be removed ASAP - if ($formElement[FE_TYPE] != FE_TYPE_SELECT && $formElement[FE_TYPE] != FE_TYPE_UPLOAD && $formElement[FE_TYPE] != FE_TYPE_CHECKBOX) { - $json[API_ELEMENT_UPDATE][$formElement[FE_HTML_ID]][API_ELEMENT_ATTRIBUTE]['value'] = $value; - $json[API_ELEMENT_UPDATE][$formElement[FE_HTML_ID]][API_ELEMENT_ATTRIBUTE]['required'] = ($formElement[FE_MODE] == 'required'); - $json[API_ELEMENT_UPDATE][$formElement[FE_HTML_ID]][API_ELEMENT_ATTRIBUTE]['hidden'] = $statusHidden; - - if ($pattern !== null) { - $json[API_ELEMENT_UPDATE][$formElement[FE_HTML_ID]][API_ELEMENT_ATTRIBUTE]['pattern'] = $pattern; - } } }