От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы познакомимся с интересным методом Yii2 afterSave, который может быть достаточно полезен при сохранении данных в БД. Также мы узнаем, как отличить сохранение новой записи (isnewrecord) от обновления прежней.
Итак, метод afterSave — что за метод и где он может пригодиться? Собственно, ответ на первый вопрос понятен из названия самого метода, который можно перевести как «после сохранения». Действительно, данный метод вызывается после метода save, который осуществляет сохранение данных в БД.
Вполне возможно вам может потребовать выполнить некоторые действия после операции сохранения. Например, вам может банально потребоваться записать в сессию сообщение об успешном сохранении записи, чтобы затем вывести это сообщение в шаблоне. Собственно, давайте именно эту задачу и решим.
В качестве примера возьмем форму редактирования записей контроллера Post, если помните, ее мы сгенерировали с помощью модуля Gii в одной из предыдущих статей. Давайте откроем модель Post и допишем в нее метод afterSave:
1 2 3 4 5 |
public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); echo 'Worked!'; } |
Пока что в качестве примера просто выведем сообщение, чтобы убедиться, что все работает. Если теперь добавить или изменить уже имеющуюся запись, то мы должны в итоге увидеть наше сообщение на чистой странице.
Просто так ничего выводить нам, конечно же, не нужно. Мы хотим записать сообщение в сессию, чтобы затем вывести его в шаблоне. Сделать это нам поможет следующий код:
1 2 3 4 5 |
public function afterSave($insert, $changedAttributes) { parent::afterSave($insert, $changedAttributes); Yii::$app->session->setFlash('success', 'Запись сохранена'); } |
Чтобы вывести сообщение, в шаблоне — views\layouts\main.php — добавим следующий код перед обращением к переменной $content:
1 2 3 4 5 6 |
<?php if( Yii::$app->session->hasFlash('success') ): ?> <div class="alert alert-success alert-dismissible" role="alert"> <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button> <?php echo Yii::$app->session->getFlash('success'); ?> </div> <?php endif;?> |
Данный код будет покажет сообщение из сессии с ключом success, если таковое там будет. Давайте протестируем теперь процесс сохранения записи.
Отлично! Метод работает, как мы и хотим. Давайте теперь пойдем немного дальше. Сейчас одно и то же сообщение мы видим как в случае обновления записи, так и в случае ее создания. А что если мы захотим разграничивать их и показывать различные сообщения в зависимости от выполненной операции?
Здесь нам поможет первый параметр метода afterSave — $insert. Данный параметр принимает булево значение: true — если запись новая или false — если запись обновляется. Зная это, давайте немного изменим реализацию метода, описав условие для проверки новой записи (isNewRecord):
1 2 3 4 5 6 7 8 9 |
public function afterSave($insert, $changedAttributes) { if ($insert) { Yii::$app->session->setFlash('success', 'Запись добавлена'); } else { Yii::$app->session->setFlash('success', 'Запись обновлена'); } parent::afterSave($insert, $changedAttributes); } |
Теперь при обновлении записи мы будем видеть одно сообщение:
Ну а при добавлении нового поста мы увидим уже другое сообщение:
Задача решена. На этом мы, пожалуй, остановимся. Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.