Бзик с AlertWidget

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Бзик с AlertWidget

Сообщение Auramel »

Доброго времени суток, коллеги. Нужен ваш совет.

Идея
Написать некий класс-обертку для пользовательских оповещений.

Зачем?
Ну, собственно, сообщать пользователю какую-либо информацию.

Пример

Код: Выделить всё

/**
     * Tu dum, tu dum, tu dum tu dum tu dum tu dum tu duuuuuuum tu tu tu dum
     * @return string
     */
    public function actionIndex(): string
    {
        Alert::success('Все пошло как надо, съешьте немного шоколада');
    }
Реализация
Собственно, сделал AlertWidget (не спрашивайте: "зачем?")

Код: Выделить всё

<?php

namespace app\widgets;

/**
 * Class AlertWidget
 * @package app\widgets
 */
class AlertWidget extends Widget
{
    /** @var string */
    public $message;

    /** @var string */
    public $className;

    /**
     * @param string $message
     * @return string
     * @throws \Exception
     */
    public static function success(string $message): string
    {
        return static::widget([
            'className' => 'success',
            'message'   => $message
        ]);
    }

    /**
     * @param string $message
     * @return string
     * @throws \Exception
     */
    public static function fail(string $message): string
    {
        return static::widget([
            'className' => 'danger',
            'message'   => $message
        ]);
    }

    /**
     * @param string $message
     * @return string
     * @throws \Exception
     */
    public static function warning(string $message): string
    {
        return static::widget([
            'className' => 'warning',
            'message'   => $message
        ]);
    }

    /**
     * @param string $message
     * @return string
     * @throws \Exception
     */
    public static function info(string $message): string
    {
        return static::widget([
            'className' => 'info',
            'message'   => $message
        ]);
    }

    /**
     * @param array $messages
     * @return void
     */
    public static function viewMessages(array $messages = []): void
    {
        foreach ($messages as $message) {
            print $message;
        }
    }

    /**
     * @return string
     */
    public function run(): string
    {
        return $this->render('alert', [
            'class'     => $this->className,
            'message'   => $this->message
        ]);
    }
}
Добавил, если можно так сказать, helper.

Код: Выделить всё

<?php

namespace app\helpers;

use app\widgets\AlertWidget;

use Yii;

/**
 * Class Alert
 * @package app\helpers
 */
class Alert
{
    /**
     * @param string $message
     * @throws \Exception
     * @return void
     */
    public static function addErrorMessage(string $message): void
    {
        $message = AlertWidget::fail($message);
        static::addMessage($message);
    }

    /**
     * @param string $message
     * @throws \Exception
     * * @return void
     */
    public static function addSuccessMessage(string $message): void
    {
        $message = AlertWidget::success($message);
        static::addMessage($message);
    }

    /**
     * @param string $message
     * @throws \Exception
     * * @return void
     */
    public static function addWarningMessage(string $message): void
    {
        $message = AlertWidget::warning($message);
        static::addMessage($message);
    }

    /**
     * @param string $message
     * @throws \Exception
     * * @return void
     */
    public static function addInfoMessage(string $message): void
    {
        $message = AlertWidget::info($message);
        static::addMessage($message);
    }

    /**
     * @param string $message
     * * @return void
     */
    public static function addMessage(string $message): void
    {
        Yii::$app->getSession()->addFlash('messages', $message);
    }
}
В main.php (layout) делаю проверку hasFlash('messages'), если true => вывожу сообщения. Все работает как часы, еще не подводило. Недавно задумался насчет зависимостей. Очень не нравится фрагмент Yii::$app->getSession()->addFlash().
5-ая точка подсказывает мне, что что-то тут не так :D есть у кого какие идеи?
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Бзик с AlertWidget

Сообщение Nex-Otaku »

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

Ну и конечно же, есть и готовые решения этой задачи. Виджет от Картика, например: https://github.com/kartik-v/yii2-widget-alert

Почему бы не использовать их?
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: Бзик с AlertWidget

Сообщение Auramel »

Спасибо за Ваш ответ!

Насчет рендеринга: полностью Вас поддерживаю - ибо, на этапе написания несколько раз вставал этот вопрос. В ближайшее время исправлю.

Насчет расширений: из под коробки стоит крутая штука и она, все-таки, привязана к Bootstrap v3.
Чужие расширения рассмотреть как-то не догадался. Так бывает, к сожалению. :|
В текущем проекте никак и нигде не используется Bootstrap и JQuery. Заменили на Vue.js и самописные стили (на БЭМ).

Не отрицаю, что, скорее всего, проделал лишнюю работу. Это уже нехватка гаек в голове. :)
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Бзик с AlertWidget

Сообщение Loveorigami »

Можете глянуть и мою обертку.
https://github.com/loveorigami/yii2-not ... on-wrapper

Она позволяет выводить сообщения после ajax запросов.
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: Бзик с AlertWidget

Сообщение Auramel »

Loveorigami писал(а): 2018.02.14, 22:22 Можете глянуть и мою обертку.
https://github.com/loveorigami/yii2-not ... on-wrapper

Она позволяет выводить сообщения после ajax запросов.
Большое спасибо за Вашу активность. Рассмотрю и Ваш вариант.
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Бзик с AlertWidget

Сообщение Dominus »

Ну и мою можете глянуть))
https://github.com/Dominus77/yii2-sweetalert2-widget
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Auramel
Сообщения: 80
Зарегистрирован: 2017.11.17, 14:39
Откуда: Russia, Ufa
Контактная информация:

Re: Бзик с AlertWidget

Сообщение Auramel »

спрашивал по коду, а получился некий "базар" :D
Ответить