You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

335 lines
8.9 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace Artmark\Forms;
use Artmark\Forms\Attributes\TargetAttribute;
use Artmark\Forms\Attributes\ActionAttribute;
use Artmark\Forms\Attributes\MethodAttribute;
use Artmark\Forms\Attributes\MultipartAttribute;
use Artmark\Forms\Fields\HiddenField;
use Artmark\Forms\Fields\TextField;
use Artmark\Forms\Fields\TextAreaField;
use Artmark\Forms\Fields\EmailField;
use Artmark\Forms\Fields\PasswordField;
use Artmark\Forms\Fields\CheckboxField;
use Artmark\Forms\Fields\SelectField;
use Artmark\Forms\Fields\RadioField;
/**
* Description of Form
*
* @author Andrey Pokidov <pokidov@e-traffic.ru>
*/
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;
}
}