_form = $form; $this->fields = array_keys($form->fields); } protected function _text($value) { return htmlspecialchars($value); } protected function _attr($attr=[]) { $out = ' '; foreach ($attr as $key=>$val) { if (is_array($val)) continue; // skip options etc if ($val===true) { $out .= $key . ' '; } else { $out .= $key . '="' . htmlspecialchars($val, ENT_QUOTES). '" '; } } return $out; } function open($attr=[]) { $attr = $attr + $this->_form->attr; return '
_attr($attr) . '>'; } function label($fieldName, $attr=[]) { $form = $this->_form; if (empty($form->fields[$fieldName])) throw new usageException('Label ' . $fieldName . ' not defined.'); $attr = $attr + $this->_form->attr; $field = $form->fields[$fieldName]; if (in_array($field['type'], ['submit', 'reset', 'checkbox', 'hidden'])) { return ''; // these input types has no label } return ''; } function field($fieldName, $attr=[]) { $form = $this->_form; if (empty($form->fields[$fieldName])) throw new usageException('Label ' . $fieldName . ' not defined.'); $field = $attr + $form->fields[$fieldName]; $fieldValue = ''; if ($field['type']!='checkbox' && isset($field['value'])) $fieldValue = $field['value']; if (isset($form->values[$fieldName])) $fieldValue = $form->values[$fieldName]; $out = ''; if ($field['type']=='textarea') { // textarea $out .= ''; } elseif ($field['type']=='select') { // select $out .= ''; } else { // input if ($field['type']=='checkbox' && $fieldValue==$field['value']) { $field['checked'] = true; } if (!in_array($field['type'], ['submit', 'reset', 'password', 'checkbox'])) { $field['value'] = $fieldValue; } if ($field['type']=='checkbox') { $out .= ' '; } } // todo - radio buttons return $out; } function close() { return '
'; } function all() { $form = $this->_form; $out = $this->open(); foreach ($this->fields as $fieldName) { $out .= $this->label($fieldName); $out .= $this->field($fieldName); if (!empty($form->errors[$fieldName])) { // todo: nechceme spíš pole chyb? $out .= '

' . $this->_text($form->errors[$fieldName]) . '

'; } } $out .= $this->close(); return $out; } function __toString() { return $this->all(); } }