我正在使用Symfony 1.2.9(使用Propel ORM)来创建网站。我已经开始使用管理生成器来实现管理功能。我遇到各种各样的问题让管理员显示一个对象(博客),该对象有一个1:N关系(blogposts)和一个N:M关系(blogroll)。
事实证明这比我想象的要困难得多(我敢说,而不是它需要)。我已经花了两天时间解决这个问题并且没有取得多大进展。我正在尝试为博客生成管理功能。
我发布了我的架构here的精简版。希望它有助于澄清我遇到的问题(也许我不能清楚地解释问题 - 但希望模式应该澄清我面临的问题,以及我正在尝试做的事情)。
一个博客有0到1个博客卷,附有0到N个博客帖子。每篇博文都附有0到M条评论。目前,我可以查看博客列表。但我想添加两个可以让我的交互(或链接):
当显示博客帖子列表时,我希望链接显示链接(与之前相同的功能),这样我就可以显示所选博客帖子的评论列表。
我确信我不是第一个(或唯一)尝试过这样做过的人。我是否采用了错误的方式,对于具有这种关系的对象,是否有更好的(即用户更多的直觉)方式显示和执行CRUD?任何人都可以帮忙吗?
答案 0 :(得分:2)
你为什么不这样做,就像你在另一个问题上提出的那样。
(这又是Doctrine,但对于Propel,它应该是相似的)。
在generator.yml
:
list:
object_actions:
bloglist: {label: Bloglist}
然后在你的actions.class.php
中你必须添加一个函数:
public function executeListBloglist(sfWebRequest $request) {
$blog = $this->getRoute()->getObject();
// retrieve the blogposts via a PEER method (I don't have any clue about Propel ;))
$this->blogposts = however.you.get.the.blogposts();
}
然后创建一个模板bloglistSuccess.php
,您可以在其中显示帖子。
或者,如果您有这样的模块,您可以重定向或转发到博客帖子的管理模块。您可能会覆盖列表操作以接受博客的ID参数,并扩展查询以按此博客ID过滤帖子。
做重定向或转发没有错,它不是黑客;)
评论后编辑:
我还建议您转发请求 不,您不必更改路由,您可以像您建议的那样附加参数。
为了覆盖,我重新考虑如果你再次覆盖buildQuery
方法会更好。 (我不记得如何用Propel调用这个方法,我希望你明白我的意思。)
所以它看起来像这样:
class blogpostAdminActions extends autoBlogpostAdminActions
{
//...
protected function buildQuery()
{
$query = parent::buildQuery();
$request = $this->getRequest(); // <- I am not sure about this method call but there is one that gives you the webRequest.
if ($request->hasParamter('blog_id'))
{
$query->andWhere('blog_id = ?', $request->getParameter('blog_id'));
}
return $query;
}
}
当然你必须将其改为Propel标准,但我认为你可以做到这一点;)
希望这会对你有所帮助。