Bonjour,

Je débute avec symfony 2 (ma version est la 2.8.4), et je rencontre un probléme tout simple mais je bloque.
J'ai creer un petit blog , j'ai une page d'index qui affiche le titre de l'article et un resumé de l'article

Ce que je fais

mon controller est comme ça

class PostController extends Controller
{
  public function indexAction()
  {
        $repository=$this->getDoctrine()
      ->getManager()
      ->getRepository('BlogBundle:Post')
      ;

      $listearticles= $repository->findAll();

      return $this->render('BlogBundle:Post:index.html.twig', array('articles' => $listearticles));
  }

    public function showAction()
  {

    return $this->render('BlogBundle:Post:show.html.twig', array('articles' => $listearticles));
  }

}

ma page index

{% extends 'layout.html.twig' %}

{% block main %}
    {% for post in articles %}
        <article class="post">
            <h2>
                <a href="{{ path('post_show') }}">
                    {{ post.title }}
                </a>
            </h2>
            {{ post.id }}
            {{ post.summary }}
        </article>
    {% endfor %}
{% endblock %}

Ce que je voudrais faire

Je voudrais que le titre soit cliquable vers l'article en question

Ce que j'obtiens

rien , je ne sais pas comment m'y prendre

4 réponses


Bonjour.
Pour commencer, est-ce que tu as par exemple visionné des tutoriels » Tous les tutoriels Symfony 2 et/ou formation » Symfony 2.4 : Création d'un e-commerce qui sont présent(e)s sur le site ?
Ensuite, sans parler précisément de Symfony, est-ce que tu as des connaissances en POO ?
Car vu ce que tu as fait dans ta fonction showAction, j'en doute.

Bonjour Lartak
Non je n'ai pas regarder les tutoriels ni la formation car la doc de symfony m'a permis de demarrer mon projet sans difficulté.
Pour répondre à deuxiéme question à propos de mes connaissances en POO, oui j'ai quelques notions de POO rien d'extraordinaire ( sans doute pas assez) cela parait évidant car le probléme que je rencontre est enfantin mais malhuresement je ne vois pas comment le résoudre

bonjour,

{% extends 'layout.html.twig' %}

{% block main %}
    {% for post in articles %}
        <article class="post">
            <h2>
                <a href="{{ path('post_show', {id: post.id) }}">  {# ajout de l'id de l'article en parametre de ta route vers PostController::showAction #}
                    {{ post.title }}
                </a>
            </h2>
            {{ post.id }}
            {{ post.summary }}
        </article>
    {% endfor %}
{% endblock %}

route vers post, dans ton fichier de routing, ici exemple en yaml

post_show:
    path: /chemin/vers/article/{id}   ## <= id en parametre ( entre accolades)
    defaults: { _controller: BlogBundle:Post:show } ## <= ton controller
    methods: ["get"]
    requirements: 
        id: \d+              ## <= à quoi doit correspondre id,   ici il doit être un nombre
public function showAction($id) // <= $id = identifiant de l'article
{
      $article = $this->getDoctrine()->getRepository('BlogBundle:Post')->find($id);
      if(!$article) {
            // il n'y a pas d'article correspondant => erreur 404 ou redirection ou ce que tu veux ... 
      }
      return $this->render('BlogBundle:Post:show.html.twig', array('article' => $article));
  }

Salut @Alexandre,

Voici exemple simple :

Dans ton controller;

use BlogBundle\Entity\Post;

class PostController extends Controller 
{
        public function indexAction()
        {
                $posts = $this->getDoctrine()->getRepository('BlogBundlle:Post')->findAll();

                return $this->render(
                    'BlogBundle:Post:show.html.twig',
                    array('posts' => $posts)
                );
        }

        public function showAction(Post $post)
        {
                return $this->render(
                    'BlogBundle:Post:show.html.twig',
                    array('post' => $post)
                );
        }
}

Routing.

blog.post.index:
    path: /articles
    defaults: {_controller:  BlogBundle:Post:index }

blog.post.show:
    path: /article/{post} # tous les urls qui correspondent à /article/1, /article/2 etc...
    defaults: {_controller:  BlogBundle:Post:show }
    requirements:
            post: \d+ # signifie que le parametre post est un entier[ par defaut les parametres sont des chaines.]

Tes vues

Dans index.html.twig

    {% extend 'BlogBundle::layout.html.twig' %}

    {% block main %}
            {% for post in posts %}
                <article class="post">
                        <h2>
                            <a  href="{{ path( 'blog.post.show', {post : post.id }) }}">{{  post.title }} </a>
                        </h2>
                        <p>
                            {{ post.summary }}
                        </p>
                </article>
            {% endfor %}
    {% endblock %}

Dans show.html.twig =>

    {% extend 'BlogBundle::layout.html.twig' %}

    {% block main %}
                <article>
                        <h2 class="post">
                            <a  href="{{ path( 'blog.post.show', {post : post.id })  }}">{{  post.title }} </a>
                        </h2>
                        <p>
                            {{ post.content }}
                        </p>
                </article>
    {% endblock %}

Voila Voila