Partage
  • Partager sur Facebook
  • Partager sur Twitter

symfony et les messages flash

non affichage des messages flash (mooc symfony)

Sujet résolu
17 janvier 2018 à 20:48:59

Bonjour,

j'ai un problème sure le mooc symfony

Je dois créer une page contact et sa route (c'est fait)

je dois faire afficher un message flash en cliquant sur le lien et rediriger vers l'index, ça ne fonctionne pas, ça fait pas mal de temps que je cherche et j'aimerai pouvoir avancer dans mon apprentissage.

j'ai modifié le controller advert  en incorporant ce code

public function formulaireAction(Request $request)

{
 
  $this->addFlash('info', "formulaire non disponible");

  return $this->redirectToRoute('oc_core_home');
}

et j'ai modifié le layout général en incorporant ce code 

{% for message in app.flashes('info') %}
    <div class="flash-info">
        {{ message }}
    </div>
{% endfor %}

merci d'avance


-
Edité par CerjerPerpi 17 janvier 2018 à 20:49:22

  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2018 à 21:37:45

Peux-tu montrer tout ton controller ?
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2018 à 21:45:27

oui bien sûr

<?php

// src/OC/PlatformBundle/Controller/AdvertController.php

namespace OC\PlatformBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class AdvertController extends Controller
{
  public function indexAction($page)
  {

    

    // Notre liste d'annonce en dur
    $listAdverts = array(
      array(
        'title'   => 'Recherche développpeur Symfony',
        'id'      => 1,
        'author'  => 'Alexandre',
        'content' => 'Nous recherchons un développeur Symfony débutant sur Lyon. Blabla…',
        'date'    => new \Datetime()),
      array(
        'title'   => 'Mission de webmaster',
        'id'      => 2,
        'author'  => 'Hugo',
        'content' => 'Nous recherchons un webmaster capable de maintenir notre site internet. Blabla…',
        'date'    => new \Datetime()),
      array(
        'title'   => 'Offre de stage webdesigner',
        'id'      => 3,
        'author'  => 'Mathieu',
        'content' => 'Nous proposons un poste pour webdesigner. Blabla…',
        'date'    => new \Datetime())
    );

    return $this->render('OCPlatformBundle:Advert:index.html.twig', array(
      'listAdverts' => $listAdverts,
    ));

  }
public function viewAction($id)
  {
    $advert = array(
      'title'   => 'Recherche développpeur Symfony2',
      'id'      => $id,
      'author'  => 'Alexandre',
      'content' => 'Nous recherchons un développeur Symfony2 débutant sur Lyon. Blabla…',
      'date'    => new \Datetime()
    );

    return $this->render('OCPlatformBundle:Advert:view.html.twig', array(
      'advert' => $advert
    ));
  }
public function formulaireAction(Request $request)

{
 
  $this->addFlash('info', "formulaire non disponible");

  return $this->redirectToRoute('oc_core_home');
}
  public function addAction(Request $request)
  {
 if ($request->isMethod('POST')) {
      $request->getSession()->getFlashBag()->add('info', 'Annonce bien enregistrée.');

      // Puis on redirige vers la page de visualisation de cettte annonce
      return $this->render('OCPlatformBundle:Advert:add.html.twig');
    }

    // Si on n'est pas en POST, alors on affiche le formulaire
    
  }

  public function editAction($id, Request $request)
  {
    if ($request->isMethod('POST')) {
      $request->getSession()->getFlashBag()->add('notice', 'Annonce bien modifiée.');

      return $this->redirectToRoute('oc_platform_view', array('id' => 5));
    }

    $advert = array(
      'title'   => 'Recherche développpeur Symfony',
      'id'      => $id,
      'author'  => 'Alexandre',
      'content' => 'Nous recherchons un développeur Symfony débutant sur Lyon. Blabla…',
      'date'    => new \Datetime()
    );

    return $this->render('OCPlatformBundle:Advert:edit.html.twig', array(
      'advert' => $advert
    ));
  }

  public function deleteAction($id)
  {
    return $this->render('OCPlatformBundle:Advert:delete.html.twig');
  }

  public function menuAction($limit)
  {
    // On fixe en dur une liste ici, bien entendu par la suite on la récupérera depuis la BDD !
    $listAdverts = array(
      array('id' => 2, 'title' => 'Recherche développeur Symfony'),
      array('id' => 5, 'title' => 'Mission de webmaster'),
      array('id' => 9, 'title' => 'Offre de stage webdesigner')
    );

    return $this->render('OCPlatformBundle:Advert:menu.html.twig', array(
      // Tout l'intérêt est ici : le contrôleur passe les variables nécessaires au template !
      'listAdverts' => $listAdverts
    ));
  }
}



-
Edité par CerjerPerpi 17 janvier 2018 à 21:46:34

  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2018 à 23:17:35

Bonsoir

Quelle version du symfony tu utilise ?

Si 2.8 c'est 

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



  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 0:17:07

Si tu ne fais de pas redirection, regarde dans le profiler si tu as bien quelque chose dans "Flashes".

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 9:29:48

Qu'est ce qui ne fonctionne pas exactement ? j'étais bloqué au même niveau que toi et en utilisant ton code et la modification de Hous tout fonctionne pour moi
  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 9:36:04

en fait ce qui ne fonctionne pas c'est que je n'ai pas de messagezs flash ce que je trouve bizarre car le code a l'air bon.
  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 9:43:54

As-tu installé bootstrap comme il fait dans le tuto ? car avec tu as des id qui ont des affichages spécifique pour les alertes, avec ton code ce que j'ai remarqué c'est que ta div envoie juste du texte avec aucun fond, mais personnellement le flash s'affiche correctement avec : 
{% for flash_message in app.session.flashBag.get('info') %}
                <div class="alert alert-warning" role="alert">
                    {{ flash_message }}
                </div>
            {% endfor %}
  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 9:58:30

Apparemment Bootstrap est intégré dans le code:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>{% block title %}OC Plateforme{% endblock %}</title>

  {% block stylesheets %}
    {# On charge le CSS de bootstrap depuis le site directement #}
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
  {% endblock %}
</head>

<body>
  <div class="container">
    <div id="header" class="jumbotron">
      <h1>Ma plateforme d'annonces</h1>
      <p>
        Ce projet est propulsé par Symfony,
        et construit grâce au MOOC OpenClassrooms et SensioLabs.
      </p>
      <p>
        <a class="btn btn-primary btn-lg" href="https://openclassrooms.com/courses/developpez-votre-site-web-avec-le-framework-symfony2">
          Participer au MOOC »
        </a>
      </p>
    </div>

    <div class="row">
      <div id="menu" class="col-md-3">
        <h3>Les annonces</h3>
        
          
 
        <ul class="nav nav-pills nav-stacked">
          <li><a href="{{ path('oc_platform_home') }}">Accueil</a></li>
          <li><a href="{{ path('oc_platform_add')}}">Ajouter</a></li>
           <li><a href="{{ path('oc_platform_formulaire')}}">Nous contacter</a></li>
      
        </ul>
        <h4>Dernières annonces</h4>
        {{ render(controller("OCPlatformBundle:Advert:menu", {'limit': 3})) }}
   

      </div>
      <div id="content" class="col-md-9">
        {% block body %}
      {% for message in app.flashes('info') %}
    <div class="flash-info">
        {{ message }}
    </div>
{% endfor %}
        {% endblock %}
      </div>
    </div>

    <hr>

    <footer>
      <p>The sky's the limit © {{ 'now'|date('Y') }} and beyond.
     </a></li></p>
    </footer>
  </div>

  {% block javascripts %}
    {# Ajoutez ces lignes JavaScript si vous comptez vous servir des fonctionnalités du bootstrap Twitter #}
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
  {% endblock %}

</body>
</html>



  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 10:10:19

Alors le code du flash est dans le layout dans un block {% bdoy %}

Pour l'afficher dans les autres views tu dois hériter le contenu du block body 

{% block body %} {{ parent() }} {% endblock %}

ou bien tu mets le code du flash dans un autre block et tu l'appel dans les autre views

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 10:19:43

je l'ai mis à la base dans base.html.twig mais je vais voir de la manière que tu me dis .
  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 11:35:49

Ton erreur est la suivante :

Dans ton "base.html.twig", tu définis le contenu de la balise body

{% block body %}
    {% for message in app.flashes('info') %}
    <div class="flash-info">
        {{ message }}
    </div>
    {% endfor %}
{% endblock %}

Mais lors tu fais l'extend de ta base

{% extends "base.html.twig" ]
{% block body %}
    Blablabla
{% endblock %}

Celui-ci remplace le contenu, donc tes flashs disparaissent.

Il faut donc, dans ta base, avoir des balises vides, qui seront remplies lors de l'extend

{% block body %}{% endblock %}





-
Edité par Colbv 18 janvier 2018 à 11:36:31

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 16:37:22

d'accord je comprends mieux mais du coup il faut mettre l'affichage des messages flash ou pour que ma base se remplissent automatiquement
  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 16:49:48

Si tu le mets dans base.html.twig :

{% for message in app.flashes('info') %}
    <div class="flash-info">
        {{ message }}
    </div>
{% endfor %}
{% block body %}{% endblock %}

Et tu ne mets rien dans la page appelante, toutes les pages qui utilisent base.html.twig (celles qui commencent par  {% extends "base.html.twig" %}) auront la possibilité d'afficher un message flash s'il y en a un.

-
Edité par HarvestR 18 janvier 2018 à 17:44:12

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 17:56:08

Dans ton base.html.twig, tu as deux parties bien distinctes :

- tout ce qui se trouve à l'intérieur des balises {% block ... %}{% endblock %} est vide, car ces balises seront remplies (ou pas) par des twigs qui hériteront de la base,

- tout ce qui est en-dehors des balises ne bougera pas.

Si tu veux que tes flashbags apparaissent dans tous les twigs qui hériteront de ta base, tu les mets dedans, mais en-dehors des balises.

Si tu veux avoir des pages avec et sans flashbags, il faudra que tu crées deux bases : une "base_avec_flashbag.html.twig" et une "base_sans_flashbag.html.twig". Ensuite, tu fera hériter ton twig soit de l'une, soit de l'autre.

En général, on a deux niveaux, mais tu peux en avoir davantage : un twig qui étend un second qui étend un troisième.

-
Edité par Colbv 18 janvier 2018 à 17:56:48

  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2018 à 19:43:01

Bonjour,

C'est bon j'ai réussi merci beaucoup, c'était en réalité un soucis d'héritage comme tu as dit je devais placer mon code dansq le fichier qui héritait du template principal

Merci énormément

  • Partager sur Facebook
  • Partager sur Twitter
25 avril 2018 à 15:21:51

Petit up. Problème similaire:

Mon affichage des messages flash dans le le layout général:

{# src/OC/CoreBundle/Resources/views/layout.html.twig #}

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">

  <title>{% block title %}OC TP Symfony{% endblock %}</title>

  {% block stylesheets %}
    {# On charge le CSS de bootstrap depuis le site directement #}
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
  {% endblock %}
</head>

<body>
  <div class="container">
    [...]
    <div class="row">
      <div id="menu" class="col-md-3">
      [...]
      </div>
      <div id="content" class="col-md-9">
      
      {% for message in app.flashes('info') %}
          <div class="flash-info">
              Message flash: {{ message }}
          </div>
      {% endfor %}
      
        {% block body %}
        {% endblock %}
      </div>
    </div>

    <hr>

    <footer>
      <p>The sky's the limit © {{ 'now'|date('Y') }} and beyond.</p>
    </footer>
  </div>

  {% block javascripts %}
    {# Ajoutez ces lignes JavaScript si vous comptez vous servir des fonctionnalités du bootstrap Twitter #}
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
  {% endblock %}

</body>
</html>



Effectivement, quand je réalise l'action qui doit afficher le message flash, il s'affiche.... mais en text brut. Si je fais un F5, le message ne s'affiche plus, donc côté session, c'est ok.

Avez-vous une idée pour que l'effet visuel "flash" se produise ?

-
Edité par vetdom 25 avril 2018 à 16:03:16

  • Partager sur Facebook
  • Partager sur Twitter
19 juin 2018 à 12:52:39

Il te manque un appel au css bootstrap, tu as juste celui au js

Dans la section <head> tu dois rajouter :

<head>
    ...
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>

Tu devrais aussi en profiter pour mettre à jour la version de bootstrap.js (3.3.7) et celle de jquery (3.2.1).

Par ailleurs, si tu utilises bootstrap et jquery sur toutes tes pages, il vaut mieux sortir les appels à ces deux js du {%block javascript %}, et réserver ce block aux scripts spécifiques à la page, sinon tu risques d'écraser les appels à bootstrap.js et jquery.js. Voir l'exemple ci-dessous

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
{% block javascript %}{% endblock %}





-
Edité par HarvestR 19 juin 2018 à 12:53:42

  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2019 à 23:50:46

Slt ! 

Svp J’ai le Symfony 4.3 et je n'arrive Pas aussi à afficher l’es flash! Merci de m’aider svp

  • Partager sur Facebook
  • Partager sur Twitter
24 juin 2019 à 23:58:36

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter