|
|
<?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;
|
|
|
}
|
|
|
}
|