diff --git a/src/AbstractField.php b/src/AbstractField.php index f833085..d82e04f 100644 --- a/src/AbstractField.php +++ b/src/AbstractField.php @@ -33,6 +33,12 @@ abstract class AbstractField extends AbstractHtml */ private $name; + /** + * Сообщения об ошибках + * @var string[] + */ + private $errors = []; + protected function __construct($form, $type, $name) { self::checkName($name); @@ -129,6 +135,51 @@ abstract class AbstractField extends AbstractHtml } /** + * Возвращает массив сообщений об ошибках + * @return string[] + */ + public function errors() + { + return $this->errors; + } + + /** + * Проверяет, есть ли у поля сообщения об ошибках + * @return boolean + */ + public function hasErrors() + { + return count($this->errors) > 0; + } + + /** + * Очищает сообщения об ошибках + * @return $this + */ + public function cleanErrors() + { + $this->errors = []; + + return $this; + } + + /** + * Добавляет новое сообщение об ошибке в поле + * @param string $message + * @return $this + */ + public function addError($message) + { + $cleanedMessage = trim(strval($message)); + + if (!in_array($cleanedMessage, $this->errors)) { + $this->errors[] = $cleanedMessage; + } + + return $this; + } + + /** * * @return array */ diff --git a/src/Form.php b/src/Form.php index 8b7ff40..6bfffd8 100644 --- a/src/Form.php +++ b/src/Form.php @@ -59,6 +59,31 @@ class Form extends AbstractVisibleHtml } } + 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 diff --git a/src/FormRenderer.php b/src/FormRenderer.php index 7ed81db..231874a 100644 --- a/src/FormRenderer.php +++ b/src/FormRenderer.php @@ -49,6 +49,7 @@ class FormRenderer Blade::directive('form_label', function ($expression) { return 'renderLabel(' . $expression . '); ?>'; }); Blade::directive('form_field', function ($expression) { return 'renderField(' . $expression . '); ?>'; }); + Blade::directive('form_error', function ($expression) { return 'renderError(' . $expression . '); ?>'; }); } public function beginForm(Form $form) @@ -69,6 +70,25 @@ class FormRenderer ]); } + public function renderError(AbstractField $field, $template = '') + { + if (!$field->hasErrors()) { + return ''; + } + + if (is_string($template) && !empty($template)) { + $correctTemplate = $template; + } + else { + $correctTemplate = 'error'; + } + + return view('accessories.forms.' . $correctTemplate, [ + 'renderer' => $this, + 'field' => $field, + ]); + } + public function endForm() { return "\n";