Флэш-сообщение Yii не отображается после запроса Ajax

Кто-нибудь знает, как я могу показать флэш-сообщение в структуре YII после запроса ajax? Я использую стандартные операции CRUD, сгенерированные Gii. Когда я создаю или обновляю данные в CGridView, я вижу свое Flash-сообщение. Но когда данные удалены, теперь есть flash, но Yii::app()->user->setFlash('success', 'My message') помещает сообщение в сеанс.

мой контент actionDelete

$result = $this->loadModel($id)->delete();
        if ($result)
            Yii::app()->user->setFlash('success', 'Data was deleted');
        else
            Yii::app()->user->setFlash('error', 'Error was occurred');

        if (Yii::app()->request->getIsAjaxRequest())
        {
            echo Yii::app()->user->getFlash('success');
        } else {
            $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array(index));
        }

person LIAL    schedule 09.12.2012    source источник
comment
Таким образом, вы не видите сообщение, которое вы установили. Это?   -  person Anup Yadav    schedule 09.12.2012
comment
Может быть, вы показываете сообщение «успех», но не сообщение «ошибка»?   -  person Ivo Renkema    schedule 10.12.2012


Ответы (2)


Итак, у вас возникла проблема с получением флэш-сообщения через ajax? Ваш контроллер выглядит нормально, метод getIsAjaxRequest будет запущен, но проблема заключается в отображении флэш-сообщения в DOM.

Сначала создайте div, который будет содержать ваше флеш-сообщение:

<div id="myflashwrapper" style=""display: none;"></div>

Затем в сценарии, где вы вызываете свой метод ajax, вам нужно добавить что-то вроде:

$('#myflashwrapper').html(message).fadeIn().delay(3000).fadeOut();

Это просто изменяет HTML-содержимое элемента с идентификатором "myflashwrapper" на возвращаемое флэш-сообщение. Как видите, эта функция ожидает заполнения переменной с именем «message». Мы хотим, чтобы echo Yii::app()->user->getFlash('success'); из ваших функций удаления getIsAjaxRequest возвращалось как это значение.

Это означает, что вам нужно изменить javascript, который выполняется, когда вы нажимаете ссылку удаления из представлений Yii CRUD по умолчанию.

Вы делаете это, предполагая, что используете CGridView, вы можете использовать scriptMap

Yii::app()->getClientScript()->scriptMap = array(
    'jquery.yiigridview.js' => Yii::app()->baseUrl . '/js/custom.gridview.js',
    ...
);

Файл скрипта, на который вы ссылаетесь здесь, будет использоваться вместо скрипта Yii по умолчанию для gridview. Очевидно, вы хотите изменить только одну функцию внутри, поэтому вы можете получить исходный файл js здесь: framework/zii/widgets/assets/gridview/jquery.yiigridview.js

Просто скопируйте все из этого файла, вставьте в свой файл custom.gridview.js, измените функцию ajax, которая вызывается при удалении, и все заработает.

person Brett Gregson    schedule 09.12.2012

Вам нужно получать флэш-сообщения. Попробуйте поместить этот код в ваш protected/layouts/main.php

<?php foreach(Yii::app()->user->getFlashes() as $key => $message) : ?>
    <div class="flash-<?php echo $key; ?>"><?php echo $message; ?></div>
<?php endforeach; ?>
person sensorario    schedule 10.12.2012
comment
Если я использую flash-сообщения, то, конечно, знаю, как их получить в обычном случае. Но это не работает в запросах Ajax. Я думаю, эскимос прав, но у меня не было времени проверить, работает он или нет. - person LIAL; 10.12.2012
comment
В качестве обратного вызова ajax вы можете загрузить страницу с этим кодом и поместить ее на главную страницу. - person sensorario; 12.12.2012