Symfony 4 addFlash появляется на вкладке сети, но не на странице

Странная вещь у меня здесь. Я скопировал все из S4 Doc, однако это не работает должным образом. Код контроллера:

// Adding a success type message
$this->addFlash("success", "This is a success message");
// Adding a warning type message
$this->addFlash("warning", "This is a warning message");
// Adding an error type message
$this->addFlash("error", "This is an error message");
// Adding a custom type message, remember the type is totally up to you !
$this->addFlash("bat-alarm", "Gotham needs Batman");
// 2. Retrieve manually the flashbag
// Retrieve flashbag from the controller
$flashbag = $this->get('session')->getFlashBag();
// Set a flash message
$flashbag->add("other", "This is another flash message with other type");
// Render some twig view
$carList = $this->getDoctrine()->getRepository(CarProject::class)->findAll();                
return $this->render('index.html.twig', array ('carList' => $carList));

index.html.twig код:

<div>
      {% for flash_message in app.session.flashBag.get('success') %}
        <div class = "alert alert-success">
        {{ flash_message }}
   </div>
      {% endfor %}
   </div>

Я вижу, что он загружен на вкладке Chrome DevTools Network, являющейся последним ответом в списке, однако он не отображается на реальной странице. Symfony 4 addFlash появляется на вкладке сети, но не на странице Любые идеи?

Вы получаете только сообщения об успехе, устанавливая в своем контроллере многие другие типы сообщений. Не могли бы вы вставить {{ dump(app.flashes) }}?

Florent Destremau 24.01.2019 11:05

Здесь нет никакой разницы, так как страница не перезагружается, поэтому флэш-сообщения не появляются. Мне нужно как-то прошить без перезагрузки страницы.

Karolis Šiaulys 24.01.2019 12:24

Похоже, вы ожидаете флэш-сообщения AJAX. Нравится ? codeeven.github.io/toastr

Florent Destremau 24.01.2019 15:12

Для ajax вам не повезло только с Twig, это сложнее. Вполне возможно, но вы ищете не в том месте, вам следует искать учебник по Javascript + Ajax.

Florent Destremau 24.01.2019 15:13

Да, действительно, я сделал это с помощью ajax. Этот метод прошивки был довольно привлекательным, и я думал, что он будет работать, но на S4. Спасибо!

Karolis Šiaulys 24.01.2019 18:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
1 925
3

Ответы 3

Вы хотите действительно работающую флеш-память Symfony 4? (Это не значит, что документ не работает)

Действие вашего контроллера: (

(ПереводчикИнтерфейс должен быть импортирован: use Symfony\Component\Translation\TranslatorInterface;)

public function new(Request $request, TranslatorInterface $translator): Response
{

    // If you want to get the message from the translations file
    $this->addFlash(
        'success',
        $translator->trans('user.edit.flash.success', [
            '%user_info%' => 'balzacLeGeek',
        ])
    );

    // If you want to set the message directly
    $this->addFlash(
        'success',
        'L\'utilisateur balzacLeGeek a été mise à jour avec succes'
    );

    // Rest of your code 
    // here ....
}

В вашем представлении Twig (base.html.twig)

{% for label, messages in app.flashes %}
    {% for message in messages %}
        <div class = "alert alert-{{ label }}" role = "alert">
          {{ message }}
        </div>
    {% endfor %}
{% endfor %}

Если вы использовали перевод в своем контроллере, это файл перевода, который у меня есть для примера: (внутри переводы/translation.en.yaml)

user:
    edit:
        flash:
            success: Great! The user %metier_info% was edited
            error: Sorry! An error was occurend when we have trying to update %metier_info%.

Если вы хотите использовать начальная загрузка-уведомление, давайте что-нибудь настроим

В вашем представлении Twig (base.html.twig)

{% for label, messages in app.flashes %}
    {% for message in messages %}
        <input type = "hidden" class = "notifyLabel" value = "{{ label }}">
        <input type = "hidden" class = "notifyMessage" value = "{{ message }}">
    {% endfor %}
{% endfor %}

Всегда в разделе base.html.twig, но в вашем разделе сценарии

<script src = "https://github.com/mouse0270/bootstrap-notify/releases/download/3.1.3/bootstrap-notify.min.js"></script>
<script>
    $(function() {
        var notifyLabel = $('.notifyLabel').val();
        var notifyMessage = $('.notifyMessage').val();

        if (notifyLabel != undefined) {
            $.notify({
                    // options
                    icon: 'fas fa-check-circle',
                    title: '',
                    message: notifyMessage,
                    url: '',
                    target: '_blank'
                },{
                    // settings
                    element: 'body',
                    type: notifyLabel,
                    allow_dismiss: true,
                    placement: {
                        from: "bottom",
                        align: "right"
                    },
                    animate: {
                        enter: 'animated bounceIn',
                        exit: 'animated bounceOut'
                    }
                }
            );
        }
    });
</script>

Наконец, давайте добавим немного стиля :-)

<style type = "text/css">
    .notice {
        padding: 15px;
        background-color: #fafafa;
        border-left: 6px solid #7f7f84;
        margin-bottom: 10px;
        -webkit-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
           -moz-box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
                box-shadow: 0 5px 8px -6px rgba(0,0,0,.2);
    }
    .notice-sm {
        padding: 10px;
        font-size: 80%;
    }
    .notice-lg {
        padding: 35px;
        font-size: large;
    }
    .notice-success {
        border-color: #80D651;
    }
    .notice-success>strong {
        color: #80D651;
    }
    .notice-info {
        border-color: #45ABCD;
    }
    .notice-info>strong {
        color: #45ABCD;
    }
    .notice-warning {
        border-color: #FEAF20;
    }
    .notice-warning>strong {
        color: #FEAF20;
    }
    .notice-danger {
        border-color: #d73814;
    }
    .notice-danger>strong {
        color: #d73814;
    }
</style>

Спасибо за ваш информативный ответ, однако он по-прежнему не работает, как в вашем примере: / После вашего кода контроллера мне нужно добавить некоторый возврат в моем случае. Я добавляю файл ветки индекса рендеринга, и результат тот же, я вижу на вкладке «Сеть». что он действительно загрузился, но не отображается на моей странице.

Karolis Šiaulys 24.01.2019 10:28

Документация Symfony указывает, что вы должны использовать {{ app.flashes }}. Как этот пример:

    {% for label, messages in app.flashes(['warning', 'error']) %}
        {% for message in messages %}
            <div class = "alert alert-{{ label }}">
                {{ message }}
            </div>
        {% endfor %}
    {% endfor %}

Привет, я использовал все возможные примеры на земле, но ничего. Я думаю, это потому, что когда я нажимаю кнопку, сервер дает мне правильный ответ, однако он не отображается на странице, так как требует перезагрузки страницы? Как только я перезагружаю страницу, я получаю правильный ответ. Но я не хочу перезагружать страницу в моем случае, есть идеи, как использовать addFlash и избежать перезагрузки страницы?

Karolis Šiaulys 24.01.2019 11:18

Можете ли вы показать свои коды index.html.twig? и base.html.twig

balzacLeGeek 24.01.2019 15:02

Окончательный ответ из моего комментария, чтобы вы могли решить этот вопрос: вы пытаетесь выполнять вспышки AJAX, которые невозможны в чистой ветке.

Вы должны либо найти что-то вроде тостр, либо поиграть с некоторыми плагинами jquery.

Другие вопросы по теме