По-умолчанию, все системные диалоги 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, открывающегося при удалении записи:
выдает class BootBoxAsset not found
в layouts/main.php добавить
use app\assets\BootboxAsset;
Зачем?
Yii 2.0.7
Проделал как у вас все, ошибка:
Cannot redeclare class app\assets\BootboxAsset
need help
Покажите скрин ошибки
http://i75.fastpic.ru/big/2016/0311/ef/834a1b97668d9b97d0d5959b31d306ef.png
Namespace поправьте, если класс BootboxAsset лежит в каталоге frontend/assets, namespace будет frontend\assets;
Решено:
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’,
];
Нужно подключить класс:
use app\assets\BootboxAsset;
Доброго. Уважаемый Nix, а чуток о себе можете? Хотя бы как вас зовут, где с вами можно пообщаться?
Ответил в почту.
Сделал всё точно, только выдаёт ошибку «Method Not Allowed. This url can only handle the following request methods: POST.»
Как задать локаль для bootbox, чтобы Ok\Cancel перевести в Прменить\Отмена
перед вызовом bootbox.confirm() нужно вызвать bootbox.setLocale(«ru»)
Что измениться, если мы js код запишем не в статичном методе overrideSystemConfirm, а в предопределенном методе init()? Тогда не нужна будет лишняя строчка во вьюхе:
BootboxAsset::overrideSystemConfirm()