params); $this->hidden = $oldform->_hidden; foreach ($oldform->_content as $element) { [$ctl, $attr] = $this->parseLegacyAttr($element); if (is_array($element)) { switch ($ctl['elem']) { case 'wikitext': $this->addTextarea('wikitext') ->attrs($attr) ->id('wiki__text') ->val($ctl['text']) ->addClass($ctl['class']); break; case 'textfield': $this->addTextInput($ctl['name'], $ctl['text']) ->attrs($attr) ->id($ctl['id']) ->addClass($ctl['class']); break; case 'passwordfield': $this->addPasswordInput($ctl['name'], $ctl['text']) ->attrs($attr) ->id($ctl['id']) ->addClass($ctl['class']); break; case 'checkboxfield': $this->addCheckbox($ctl['name'], $ctl['text']) ->attrs($attr) ->id($ctl['id']) ->addClass($ctl['class']); break; case 'radiofield': $this->addRadioButton($ctl['name'], $ctl['text']) ->attrs($attr) ->id($ctl['id']) ->addClass($ctl['class']); break; case 'tag': $this->addTag($ctl['tag']) ->attrs($attr) ->attr('name', $ctl['name']) ->id($ctl['id']) ->addClass($ctl['class']); break; case 'opentag': $this->addTagOpen($ctl['tag']) ->attrs($attr) ->attr('name', $ctl['name']) ->id($ctl['id']) ->addClass($ctl['class']); break; case 'closetag': $this->addTagClose($ctl['tag']); break; case 'openfieldset': $this->addFieldsetOpen($ctl['legend']) ->attrs($attr) ->attr('name', $ctl['name']) ->id($ctl['id']) ->addClass($ctl['class']); break; case 'closefieldset': $this->addFieldsetClose(); break; case 'button': case 'field': case 'fieldright': case 'filefield': case 'menufield': case 'listboxfield': throw new \UnexpectedValueException('Unsupported legacy field ' . $ctl['elem']); default: throw new \UnexpectedValueException('Unknown legacy field ' . $ctl['elem']); } } else { $this->addHTML($element); } } } /** * Parses out what is the elements attributes and what is control info * * @param array $legacy * @return array */ protected function parseLegacyAttr($legacy) { $attributes = []; $control = []; foreach ($legacy as $key => $val) { if ($key[0] == '_') { $control[substr($key, 1)] = $val; } elseif ($key == 'name') { $control[$key] = $val; } elseif ($key == 'id') { $control[$key] = $val; } else { $attributes[$key] = $val; } } return [$control, $attributes]; } /** * Translates our types to the legacy types * * @param string $type * @return string */ protected function legacyType($type) { static $types = [ 'text' => 'textfield', 'password' => 'passwordfield', 'checkbox' => 'checkboxfield', 'radio' => 'radiofield', 'tagopen' => 'opentag', 'tagclose' => 'closetag', 'fieldsetopen' => 'openfieldset', 'fieldsetclose' => 'closefieldset' ]; return $types[$type] ?? $type; } /** * Creates an old legacy form from this modern form's data * * @return \Doku_Form */ public function toLegacy() { $this->balanceFieldsets(); $legacy = new \Doku_Form($this->attrs()); $legacy->_hidden = $this->hidden; foreach ($this->elements as $element) { if (is_a($element, 'dokuwiki\Form\HTMLElement')) { $legacy->_content[] = $element->toHTML(); } elseif (is_a($element, 'dokuwiki\Form\InputElement')) { /** @var InputElement $element */ $data = $element->attrs(); $data['_elem'] = $this->legacyType($element->getType()); $label = $element->getLabel(); if ($label instanceof LabelElement) { $data['_class'] = $label->attr('class'); } $legacy->_content[] = $data; } } return $legacy; } }