2010-01-07 53 views
2

我有一个名为articles的模块,其中显示我上传的文章列表。在索引上,它只是列出了所有文章。在Symfony中排序文章列表

但我想知道如何做到这一点,如果我点击作者,例如,它会带我到一个页面,只显示该作者的文章(并使URL很漂亮:文章/丹尼尔)或由不同的领域,如通过出版。我知道如何明确查询,但我不明白我是否应该为这些东西制作新模板,或只是在索引页上更改参数并检查它们。

回答

3

您可以使用一个ORM对象路由来实现这一点,只需最少的编码。我假设你在Doctrine上,但是如果你在Propel上,实现应该非常相似(可能只是使用sfPropelRoute作为你的类)。在应用程序的config/routing.yml中添加自定义路线:

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

注:我使用的URL /作家/而不是/用品/你的要求所以这条路线不会与任何动作的冲突你的文章模块,但可以随意使用你的配置中的任何URL。

保存更改后清空缓存,使Symfony知道新的路由。所做的是告诉你的应用程序采用匹配/ authors/*的所有URL,并通过文章模块的作者动作传递它们,生成一个匹配URL中author:参数的对象列表。对象路由只用上面的配置自动完成。

您的论文模块添加的作者行动

现在:

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

现在,你有你的动作模板变量的查询结果。在您的authorSuccess.php模板中,按照您认为合适的方式遍历$ articles数组。

要使用作者的名字从你的主目录链接到这条路线,你可以使用url_for助手与您刚刚创建的动态生成完整的URL路径:

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

这一切就是这么简单。

+0

感谢您的帮助!不过,我有一个新问题。看作为作者姓名或出版物往往不止一个字或使用不友好的字符,我尝试使用slu instead,但我得到新的错误。我改变了我的路由这样: publication_articles: 网址:/出版/:publication_slug 类:sfDoctrineRoute PARAM:{模块:文章,动作:发布} 选项:{模式:第一条,键入:list} 而在文章类中创建了getPublicationSlug()。但我得到这个错误: “/ publications /:publication_slug”route有一些缺少的必需参数(:publication_slug)。 – Danny 2010-01-10 20:42:14

+0

我会猜测你在尝试使用url_for或link_to使用该路由生成一个URL,当你收到该错误时。我见过的唯一一次使用对象链接时:url_for('my_route',$ obj)。我从来没有成功地获得这项工作,并且我已经尝试了很多变体,作为在线指南中的实际工作版本(http://www.symfony-project.org/jobeet/1_2/Doctrine/en/05)。尝试通过直接参数插入进行链接:url_for('@ publication_articles?publication_slug ='。$ article-> getPublicationSlug())。希望有所帮助。 – nortron 2010-01-11 01:23:16