Yii2: Диалоги confirm в стиле bootstrap

По-умолчанию, все системные диалоги confirm используют стандартный javascript alert(). Однако это немного не вписывается в концепцию сайта на Twitter Bootstrap.

Библиотека Bootbox содержит как стандартные методы alert, prompt и confirm, так и метод dialog, создающий модальное диалоговое окно.

Метод confirm описан в файле app/vendor/yiisoft/yii2/assets/yii.js:

[js]/**
* Displays a confirmation dialog.
* The default implementation simply displays a js confirmation dialog.
* You may override this by setting `yii.confirm`.
* @param message the confirmation message.
* @param ok a callback to be called when the user confirms the message
* @param cancel a callback to be called when the user cancels the confirmation
*/
confirm: function (message, ok, cancel) {
if (confirm(message+»123″)) {
!ok || ok();
} else {
!cancel || cancel();
}
},[/js]

Для использования своего confirm во всем приложении, можно его переопределить.

Сначала подключим bootbox, используя composer

Добавим зависимость «bower-asset/bootbox»: «~4.3.0» в секцию «require» файла composer.json и обновим зависимости:

[nix@localhost basic]# composer update
Loading composer repositories with package information
Updating dependencies (including require-dev) 

 - Installing bower-asset/bootbox (v4.3.0)
 Downloading: 100%

Writing lock file
Generating autoload files

Новый AssetBundle

Создадим новый файл BootboxAsset.php и соответствующий класс:

<?php
namespace app\assets;

use Yii;
use yii\web\AssetBundle;

class BootboxAsset extends AssetBundle
{
    public $sourcePath = '@vendor/bower/bootbox';
    public $js = [
        'bootbox.js',
    ];
}

Добавим его в зависимости app\assests\AppAssest.php

В массив $depends добавляем элемент ‘app\assets\BootboxAsset’:

class AppAsset extends AssetBundle
{
    // ...
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
        'app\assets\BootboxAsset',
    ];
}

Дальше самое интересное

Переопределяем confirm

Пример реализации переопределения встроенных функций yii.js, метод overrideSystemConfig() класса BootboxAssest:

public static function overrideSystemConfirm()
    {
        Yii::$app->view->registerJs('
            yii.confirm = function(message, ok, cancel) {
                bootbox.confirm(message, function(result) {
                    if (result) { !ok || ok(); } else { !cancel || cancel(); }
                });
            }
        ');
    }

Последний штрих

Осталось только включить переопределение confirm. Для глобального действия, проще всего это сделать в файле views/layouts/main.php, сразу после подключения стандартных скриптов:

<?php
// ...
AppAsset::register($this);
BootboxAsset::overrideSystemConfirm();
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>

Результат

Пример confirm, открывающегося при удалении записи:

yii2-custom-confirm

15 thoughts on “Yii2: Диалоги confirm в стиле bootstrap

    1. Кирилл

      Yii 2.0.7
      Проделал как у вас все, ошибка:
      Cannot redeclare class app\assets\BootboxAsset

      need help

          1. nix Автор записи

            Namespace поправьте, если класс BootboxAsset лежит в каталоге frontend/assets, namespace будет frontend\assets;

          2. Кирилл

            Решено:
            frontend\assets\BootboxAsset.php
            вставить:

            namespace frontend\assets;

            use Yii;
            use yii\web\AssetBundle;

            class BootboxAsset extends AssetBundle
            {
            public $sourcePath = ‘@vendor/bower/bootbox’;
            public $js = [
            ‘bootbox.js’,
            ];

            public static function overrideSystemConfirm()
            {
            Yii::$app->view->registerJs(‘
            yii.confirm = function(message, ok, cancel) {
            bootbox.confirm(message, function(result) {
            if (result) { !ok || ok(); } else { !cancel || cancel(); }
            });
            }
            ‘);
            }

            }

            в /frontend/assets/FrontendAsset.php вставить:
            public $depends = [

            ‘frontend\assets\BootboxAsset’,
            ];

  1. Art

    Доброго. Уважаемый Nix, а чуток о себе можете? Хотя бы как вас зовут, где с вами можно пообщаться?

  2. Руслан

    Сделал всё точно, только выдаёт ошибку «Method Not Allowed. This url can only handle the following request methods: POST.»

  3. louisvuitton

    Как задать локаль для bootbox, чтобы Ok\Cancel перевести в Прменить\Отмена

  4. ramil.lorem.ipsum

    Что измениться, если мы js код запишем не в статичном методе overrideSystemConfirm, а в предопределенном методе init()? Тогда не нужна будет лишняя строчка во вьюхе:
    BootboxAsset::overrideSystemConfirm()

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

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