# Реализация сохранения значений после отправки

Как вы должны знать, значение инпута задается в атрибуте `value`. Нам необходимо сделать следующее: если форма была отправлена, то в `value` инпута следует записать то значение, которое было в нем в момент отправки.

Каким образом получить это значение? Пусть имя инпута было `year`. В этом случае после отправки формы в `$_REQUEST['year']` и будет находится нужное нам значение.

В нашем случае имя инпута хранится в родительском классе `Tag` в приватном свойстве `$attrs`. Наш класс `Input` как потомок класса `Tag` может получить доступ к любому атрибуту с помощью геттера, вот так: $inputName = $this->getAttr('name').

Давайте получим имя нашего инпута, достанем значение из `$_REQUEST` по этому имени и запишем в `value` инпута:

`<?php class Input extends Tag { public function __construct() { parent:__construct('input'); } // Переопределяем метод родителя: public function open() { $inputName = $this->getAttr('name'); // имя инпута $value = $_REQUEST[$inputName]; // получаем значение инпута по его имени $this->setAttr('value', $value); // записываем в value инпута return parent::open(); // вызываем метод open родителя } public function __toString() { return $this->open(); // здесь теперь не метод родителя, а наш } } ?>`

Приведенный выше код пока не очень корректный: он не учитывает того, что отправки формы могло еще и не быть. Давайте учтем:

`<?php // Пока не запускайте этот код, есть нюансы... class Input extends Tag { public function __construct() { parent:__construct('input'); } // Переопределяем метод родителя: public function open() { $inputName = $this->getAttr('name'); // имя инпута // Если форма была отправлена и есть данные с именем нашего инпута: if (isset($_REQUEST[$inputName])) { $value = $_REQUEST[$inputName]; // получаем значение из $_REQUEST $this->setAttr('value', $value); // записываем в value инпута } return parent::open(); // вызываем метод open родителя } public function __toString() { return $this->open(); } } ?>`

Вот теперь наш код уже достаточно рабочий, но есть пару нюансов.

Что будет, если у нашего инпута по умолчанию уже есть какое-то значение (например, текущий год), например, вот так:

`<?php echo (new Input) ->setAttr('name', 'year') ->setAttr('value', date('Y')); // значение по умолчанию ?>`

В этом случае в теории по заходу на страницу мы должны увидеть текущий год, но при желании можем его поменять, нажать на кнопку отправки - и после обновления страницы в инпуте будет тот год, который и был отправлен.

На самом деле наш код так и работает! Если была отправка формы, то мы попадем в условие и там изменим `value` инпута, но если отправки не было - `value` инпута останется таким, как и было задано.

Второй нюанс: есть инпуты, у которых нет атрибута `name`. Например, кнопка отправки формы. В этом случае с такими инпутами ничего и не надо делать. Учтем это дополнительным условием:

`<?php class Input extends Tag { public function __construct() { parent:__construct('input'); } public function open() { $inputName = $this->getAttr('name'); // Если атрибут name задан у инпута: if ($inputName) { if (isset($_REQUEST[$inputName])) { $value = $_REQUEST[$inputName]; $this->setAttr('value', $value); } } return parent::open(); } public function __toString() { return $this->open(); } } ?>`

Ну вот теперь можно пробовать. Можете запустить приведенный ниже код формы, вбить что-то в инпут и нажать на кнопку отправки - после обновления страницы данные из инпута не исчезнут:

`<?php $form = (new Form)->setAttrs(['action' => '', 'method' => 'GET']); echo $form->open(); echo (new Input)->setAttr('name', 'year'); echo (new Input)->setAttr('type', 'submit'); echo $form->close(); ?>`

А вот пример, когда в инпуте уже есть какое-то значение по умолчанию:

`<?php $form = (new Form)->setAttrs(['action' => '', 'method' => 'GET']); echo $form->open(); echo (new Input)->setAttr('name', 'year')->setAttr('value', date('Y')); echo (new Input)->setAttr('type', 'submit'); echo $form->close(); ?>`

Реализуйте самостоятельно сохранение значений инпутов после отправки. Проверьте работу данного механизма.

С помощью созданного класса сделайте форму с `5`-ю инпутами. Пусть в каждый инпут можно ввести число. Сделайте так, чтобы после отправки на экран выводилась сумма этих чисел, а введенные значения не пропадали из инпутов.

← →
↑