Прелоадер для страниц

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
delgus
Сообщения: 55
Зарегистрирован: 2018.01.29, 14:07
Откуда: Ярославль

Прелоадер для страниц

Сообщение delgus »

Были у меня actions которые долго отрабатывали и в результате страница зависала и придумал я вот такую хардкорную штуку

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

class SiteController extends Controller
{
    public function init()
    {
        parent::init();
        Yii::$app->on(Application::EVENT_BEFORE_ACTION, function ($event) {
            $actions = ['view', 'wait-to-solved', 'redirect', 'upload', 'inwork', 'solved'];
            foreach ($actions as $action) {
                if ($event->action->id == $action) {
                    echo '<div id="preloader">Идет загрузка...</div>';
                    ob_implicit_flush(false);
                    flush();
                }
            }
        });
        Yii::$app->on(Application::EVENT_BEFORE_ACTION, function ($event) {
            $this->getView()->registerJs('$("#preloader").hide()');
        });
    }
  }
Ну естественно она не работала при redirect, а потом отвалилась потому что HeadersAlreadySentException. Можно ли как-то заставить этот скрипт отрабатывать. Или же надо везде переходить на ajax запросы, или использовать pjax, или вообще жестко хардкорить во вьюхах прописывая $.ajax beforeSend. Есть какие-то простые инструменты во фреймворке чтоб реализовать прелоадер на странице, когда ты долго ожидаешь ответ от сервера. В AJAX не очень шарю, могу конечно прописать в видах $.ajax или создавать XmlHttpRequest на чистом js. Просто хотелось найти более менее лаконичное и удобное решение.Есть предложения?
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Прелоадер для страниц

Сообщение urichalex »

Не надо ничего выводить в контроллере. Накладывайте прелоадер javascript'ом
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Прелоадер для страниц

Сообщение yan »

delgus
Сообщения: 55
Зарегистрирован: 2018.01.29, 14:07
Откуда: Ярославль

Re: Прелоадер для страниц

Сообщение delgus »

Самый удобный и практичный способ
1.Обернуть страницу в Pjax(Как оказалось - очень удобный инструмент, спасибо разработчикам).
2.Ну и в видах повесить на событие beforeSend необходимые действия

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

 $js = <<<JS
        $(document).on('pjax:beforeSend', function() {
           $('.appeal-list').hide();
           $('#loader').show();
        })
JS;
    $this->registerJs($js);
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: Прелоадер для страниц

Сообщение proctoleha »

delgus писал(а): 2018.05.07, 10:27 Самый удобный и практичный способ
1.Обернуть страницу в Pjax(Как оказалось - очень удобный инструмент, спасибо разработчикам).
Только не забывайте, что в ветке 2.1 pjax уже нет, т.к. по мнению разработчиков он очень капризен
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Прелоадер для страниц

Сообщение Alexum »

Если необходимость в такой анимации есть во многих местах проекта, то имеет смысл в AppAsset добавить js-файл а не писать код во view. Кстати https://github.com/vadimsva/waitMe неплохое решение с массой настроек.

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

// Отображаем лоадер
$(document).on('pjax:start', function() {
            $('body').waitMe({
                effect: 'ios',
                bg: 'rgba(0,0,0,0)',
                color: '#FFF'
            });
});

// Скрываем лоадер
$(document).on('pjax:end', function() {
    $('body').waitMe('hide');
});
proctoleha писал(а): 2018.05.07, 10:44
delgus писал(а): 2018.05.07, 10:27 Самый удобный и практичный способ
1.Обернуть страницу в Pjax(Как оказалось - очень удобный инструмент, спасибо разработчикам).
Только не забывайте, что в ветке 2.1 pjax уже нет, т.к. по мнению разработчиков он очень капризен
К величайшему сожалению.
Ответить