*/ class Form extends AbstractVisibleHtml { const METHOD_POST = 'POST'; const METHOD_GET = 'GET'; use TargetAttribute, ActionAttribute, MethodAttribute, MultipartAttribute; /** * Ассоциативный список полей формы * @var AbstractField[] */ private $fields = []; /** * Префикс для идентификаторов полей * @var string */ private $idPrefix = ''; /** * Префикс для имен полей * @var string */ private $namePrefix = ''; public function load(array $values) { if (empty($values)) { return; } foreach ($this->fields as $field) { if (array_key_exists($field->name(), $values)) { $field->setValue($values[$field->name()]); } } } public function loadErrors() { $errors = session()->get('errors'); if (empty($errors)) { return; } $messageBag = $errors->getBag('default'); if (empty($messageBag)) { return; } foreach ($messageBag->messages() as $key => $messages) { if (!array_key_exists($key, $this->fields)) { continue; } foreach ($messages as $message) { $this->fields[$key]->addError($message); } } } /** * Количество полей формы * @return int */ public function fieldAmount() { return count($this->fields); } /** * Возвращает поле с именем $name, если такое поле есть * @param string $name * @return AbstractField Если поля нет, то возвращает null */ public function field($name) { return array_key_exists($name, $this->fields) ? $this->fields[$name] : null; } /** * Создаёт в форме скртое поле с именем $name и значением $value * @param string $name * @param string $value * @return HiddenField */ public function newHidden($name, $value = '') { $field = new HiddenField($this, $name, $value); $this->registerField($field); return $field; } /** * Создаёт в форме текстовое поле с именем $name и значением $value * @param string $name * @param string $value * @return TextField */ public function newText($name, $value = '') { $field = new TextField($this, $name, $value); $this->registerField($field); return $field; } /** * Создаёт в форме поле для адреса электронной почты с именем $name и значением $value * @param string $name * @param string $value * @return EmailField */ public function newEmail($name, $value = '') { $field = new EmailField($this, $name, $value); $this->registerField($field); return $field; } /** * Создаёт в форме поле для ввода пароля с именем $name и значением $value * @param string $name * @param string $value * @return PasswordField */ public function newPassword($name, $value = '') { $field = new PasswordField($this, $name, $value); $this->registerField($field); return $field; } /** * Создаёт в форме текстовое поле типа textarea с именем $name и значением $value * @param string $name * @param string $value * @return TextAreaField */ public function newTextArea($name, $value = '') { $field = new TextAreaField($this, $name, $value); $this->registerField($field); return $field; } /** * Создаёт в форме поле-флаг с именем $name * @param string $name * @return CheckboxField */ public function newCheckbox($name) { $field = new CheckboxField($this, $name); $this->registerField($field); return $field; } /** * Создаёт в форме select с именем $name * @param string $name * @return SelectField */ public function newSelect($name) { $field = new SelectField($this, $name); $this->registerField($field); return $field; } /** * Создаёт в форме radio button с именем $name * @param string $name * @return RadioField */ public function newRadio($name) { $field = new RadioField($this, $name); $this->registerField($field); return $field; } private function registerField(AbstractField $field) { $this->fields[$field->name()] = $field; } /** * Возвращает значение префикса для идентификаторов полей формы * @return string */ public function idPrefix() { return $this->idPrefix; } /** * Метод сообщает, задан ли префикс для идентификаторов полей формы * @return boolean Если префикс задан, то возвращает true, иначе false */ public function hasIdPrefix() { return $this->idPrefix !== ''; } /** * Метод позволяет задать новое значение для префикса для идентификаторов полей формы * @param string $newPrefix * @return $this */ public function setIdPrefix($newPrefix) { if (!is_string($newPrefix)) { throw new FormException('ID prefix must be a string'); } $this->idPrefix = trim($newPrefix); return $this; } /** * Убирает префикс для идентификаторов полей формы, если он был ранее задан * @return $this */ public function removeIdPrefix() { $this->idPrefix = ''; return $this; } /** * Возвращает значение префикса для названий полей формы * @return string */ public function namePrefix() { return $this->namePrefix; } /** * Метод сообщает, задан ли префикс для названий полей формы * @return boolean Если префикс задан, то возвращает true, иначе false */ public function hasNamePrefix() { return $this->namePrefix !== ''; } /** * Метод позволяет задать новое значение для префикса для названий полей формы * @param string $newPrefix * @return $this */ public function setNamePrefix($newPrefix) { if (!is_string($newPrefix)) { throw new FormException('Name prefix must be a string'); } $this->namePrefix = trim($newPrefix); return $this; } /** * Убирает префикс для названий полей формы, если он был ранее задан * @return $this */ public function removeNamePrefix() { $this->namePrefix = ''; return $this; } /** * Возвращает ассоциативный массив с HTML аттрибутами формы * @return stirng[] */ public function getAssociativeAttributes() { $attributes = parent::getAssociativeAttributes(); $this->appendMethodAttribute($attributes); $this->appendActionAttribute($attributes); $this->appendTargetAttribute($attributes); $this->appendMultipartAttribute($attributes); return $attributes; } }