Странная вещь у меня здесь. Я скопировал все из 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, являющейся последним ответом в списке, однако он не отображается на реальной странице.
Любые идеи?
Здесь нет никакой разницы, так как страница не перезагружается, поэтому флэш-сообщения не появляются. Мне нужно как-то прошить без перезагрузки страницы.
Похоже, вы ожидаете флэш-сообщения AJAX. Нравится ? codeeven.github.io/toastr
Для ajax вам не повезло только с Twig, это сложнее. Вполне возможно, но вы ищете не в том месте, вам следует искать учебник по Javascript + Ajax.
Да, действительно, я сделал это с помощью ajax. Этот метод прошивки был довольно привлекательным, и я думал, что он будет работать, но на S4. Спасибо!






Вы хотите действительно работающую флеш-память 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>
Спасибо за ваш информативный ответ, однако он по-прежнему не работает, как в вашем примере: / После вашего кода контроллера мне нужно добавить некоторый возврат в моем случае. Я добавляю файл ветки индекса рендеринга, и результат тот же, я вижу на вкладке «Сеть». что он действительно загрузился, но не отображается на моей странице.
Документация 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 и избежать перезагрузки страницы?
Можете ли вы показать свои коды index.html.twig? и base.html.twig
Окончательный ответ из моего комментария, чтобы вы могли решить этот вопрос: вы пытаетесь выполнять вспышки AJAX, которые невозможны в чистой ветке.
Вы должны либо найти что-то вроде тостр, либо поиграть с некоторыми плагинами jquery.
Вы получаете только сообщения об успехе, устанавливая в своем контроллере многие другие типы сообщений. Не могли бы вы вставить
{{ dump(app.flashes) }}?