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
PHTML

<?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;
4 years ago
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()]);
}
}
}
4 years ago
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;
}
4 years ago
/**
* Создаёт в форме текстовое поле типа 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;
}
}