Yii2 afterSave

Yii2 afterSave

От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком 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:

<?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">&times;</span></button>
        <?php echo Yii::$app->session->getFlash('success'); ?>
    </div>
<?php endif;?>

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 можно посмотреть в этом цикле уроков.

Самые свежие новости IT и веб-разработки на нашем Telegram-канале

Фреймворк YII2: теория и первая практика

Овладейте азами фреймворка Yii2 за 5 дней!

Получить

Метки:

Комментарии Вконтакте:

Комментарии Facebook:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree