2010-01-07 5 views
2

J'ai un module appelé articles, où j'affiche une liste d'articles que j'ai téléchargés. Dans l'index, il s'agit simplement de tous les articles.Trier la liste des articles dans Symfony

Mais je me demandais comment je pouvais faire en sorte que si je clique sur l'auteur, par exemple, cela me conduirait alors à une page qui n'affiche que l'article de cet auteur (et rendant l'url jolie ex: articles/daniel) ou par un domaine différent tel que par publication. Je sais comment faire les requêtes évidemment, mais je ne comprends pas si je devrais faire de nouveaux modèles pour ces choses ou juste changer les paramètres sur la page d'index et vérifier pour eux.

Répondre

3

Vous pouvez utiliser une route d'objet ORM pour y parvenir avec un codage minimal de votre part. Je vais supposer que vous êtes sur Doctrine mais si vous êtes sur Propel, l'implémentation devrait être très similaire (probablement en utilisant simplement sfPropelRoute comme classe). Dans votre configuration de l'application/routing.yml ajoutez votre itinéraire personnalisé:

author_articles: 
    url: /authors/:author 
    param: { module: articles, action: author } 
    class: sfDoctrineRoute 
    options: { model: Article, type: list } 

Note: je l'URL/auteurs/au lieu des/articles/que vous avez demandé si cette voie ne sera pas en conflit avec l'une des actions votre module d'articles, mais n'hésitez pas à utiliser l'URL que vous préférez dans votre configuration.

Videz le cache après avoir enregistré ces modifications pour que Symfony soit informé de la nouvelle route. Ce que cela a fait est dit à votre application de prendre toutes les URL correspondant à/authors/* et les passer à travers l'action auteur de votre module articles, générant une liste d'objets qui correspond au paramètre: auteur dans l'URL. La route d'objet fait tout cela automatiquement avec juste la configuration ci-dessus.

maintenant dans l'action auteur de vos articles ajouter du module:

public function executeAuthor() { 
    $this->articles = $this->getRoute()->getObjects(); 
} 

Maintenant, vous avez le résultat de la requête dans une variable pour votre modèle d'action. Dans votre modèle authorSuccess.php, bouclez le tableau $ articles comme bon vous semble.

Pour créer un lien à cet itinéraire à partir de votre liste principale en utilisant le nom d'un auteur, vous pouvez utiliser l'assistant url_for avec l'itinéraire que vous venez de créer pour générer les URL complètes dynamiquement:

<a href="<?php echo url_for('@author_articles?author=' . $article['author']) ?>"><?php echo $article['author'] ?></a> 

C'est tout ce qu'il ya à faire.

+0

Merci pour votre aide! J'ai un nouveau problème cependant. Voyant que le nom de l'auteur ou de la publication est souvent plus d'un mot ou utilise des caractères hostiles, j'ai essayé d'utiliser des limaces à la place, mais je reçois de nouvelles erreurs. J'ai changé mon cheminement à ceci: publication_articles: url:/publications /: publication_slug Classe: sfDoctrineRoute param: {Module: article, l'action: publication} Options: {modèle: article, tapez: list} Et fait un getPublicationSlug() dans la classe d'article. Mais j'obtiens cette erreur: "/ publications /: publication_slug" route a quelques paramètres obligatoires manquants (: publication_slug). – Danny

+0

Je vais deviner que vous essayez de générer une URL en utilisant cette route avec url_for ou link_to lorsque vous obtenez cette erreur. La seule fois que j'ai vu ça, c'est quand j'utilise l'objet link: url_for ('my_route', $ obj). Je n'ai jamais réussi à le faire fonctionner et j'ai essayé pas mal de variations sur ce qui est présenté comme la version de travail dans le guide en ligne (http://www.symfony-project.org/jobeet/1_2/Doctrine/en/05). Essayez de lier par insertion directe de paramètre: url_for ('@ publication_articles? Publication_slug ='. $ Article-> getPublicationSlug()). J'espère que cela pourra aider. – nortron