Yii2 afterSave

16

Від автора: вітаю вас, друзі. Ми продовжуємо цикл статей, присвячених знайомству з фреймворком Yii2. У цій статті ми познайомимося з цікавим методом Yii2 afterSave, який може бути досить корисний при збереженні даних в БД. Також ми дізнаємося, як відрізнити збереження нового запису (isnewrecord) від оновлень колишньою.

Отже, метод afterSave — що за метод і де він може стати в нагоді? Власне, відповідь на перше питання зрозумілий з назви самого методу, який можна перекласти як «після збереження». Дійсно, даний метод викликається після методу save, який здійснює збереження даних у БД.

Цілком можливо вам може вимагати виконати деякі дії після операції збереження. Наприклад, вам може банально потрібно записати у сесію повідомлення про успішне збереження запису, щоб потім вивести це повідомлення в шаблоні. Власне, давайте саме цю задачу і вирішимо.

В якості прикладу візьмемо форму редагування записів контролера Post, якщо пам’ятаєте, її ми згенерували за допомогою модуля Gii в одній з попередніх статей. Давайте відкриємо модель Post і допишемо в неї метод afterSave:

public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
echo ‘Worked!’;
}

Yii2 afterSave

Поки що в якості прикладу просто виведемо повідомлення, щоб переконатися, що все працює. Якщо тепер додати або змінити вже наявну запис, то ми повинні в підсумку побачити наше повідомлення на чистій сторінці.

Yii2 afterSave

Просто так нічого виводити нам, звичайно ж, не потрібно. Ми хочемо записати повідомлення у сесію, щоб потім вивести його в шаблоні. Зробити це нам допоможе наступний код:

public function afterSave($insert, $changedAttributes)
{
parent::afterSave($insert, $changedAttributes);
Yii::$app->session->setFlash(‘success’, ‘Запис збережено’);
}

Щоб вивести повідомлення, в шаблоні — views\layouts\main.php — додамо наступний код перед зверненням до змінної $content:

session->hasFlash(‘success’) ): ?>


session->getFlash(‘success’); ?>

Yii2 afterSave

Даний код буде покаже повідомлення з сесії з ключем success, якщо таке там буде. Давайте протестуємо тепер процес збереження запису.

Yii2 afterSave

Відмінно! Метод працює, як ми хочемо. Давайте тепер підемо трохи далі. Зараз одне і те ж повідомлення ми бачимо як у випадку поновлення запису, так і у разі її створення. А що якщо ми захочемо розмежовувати їх і показувати різні повідомлення в залежності від виконаної операції?

Тут нам допоможе перший параметр методу afterSave — $insert. Даний параметр приймає логічне значення: true, якщо запис нова або false — якщо запис оновлюється. Знаючи це, давайте трохи змінимо реалізацію методу, описавши умова для перевірки нового запису (isNewRecord):

public function afterSave($insert, $changedAttributes)
{
if ($insert) {
Yii::$app->session->setFlash(‘success’, ‘Запис додана’);
} else {
Yii::$app->session->setFlash(‘success’, ‘Запис оновлено’);
}
parent::afterSave($insert, $changedAttributes);
}

Тепер при оновленні запису ми будемо бачити одне повідомлення:

Yii2 afterSave

Ну а при додаванні нового посту ми побачимо вже інше повідомлення:

Yii2 afterSave

Задача вирішена. На цьому ми, мабуть, зупинимося. Більше про фреймворку ви можете дізнатися з наших безкоштовних або платних уроків. Також створення найпростішого блогу на Yii2 можна подивитися в цьому циклі уроків.