Symfony1 显示与Symfony 1.2.9管理生成器的1:N和M:N关系
我正在使用Symfony 1.2.9(带推进ORM)创建一个网站。我已经开始使用管理生成器来实现管理功能。我在让管理员管理器显示一个对象(blog)时遇到了各种各样的问题,这个对象(blog)有一个1:N关系(blogposts)和一个N:M关系(blogroll) 事实证明,这比我想象的要困难得多(我敢说,比需要的困难得多)。我已经在这个问题上花了两天时间,没有取得多大进展。我正在尝试为博客生成管理功能 我已经发布了我的模式的简略版本。希望这将有助于澄清我所面临的问题(也许我没有足够清楚地解释这个问题——但希望模式能够澄清我所面临的问题,以及我正在尝试做的事情) 一个博客有0到1个博客卷,0到N个博客帖子附加到它。每个博客文章都有0到M条评论。目前,我可以查看博客列表。但我想添加两个互动(或链接),让我:Symfony1 显示与Symfony 1.2.9管理生成器的1:N和M:N关系,symfony1,Symfony1,我正在使用Symfony 1.2.9(带推进ORM)创建一个网站。我已经开始使用管理生成器来实现管理功能。我在让管理员管理器显示一个对象(blog)时遇到了各种各样的问题,这个对象(blog)有一个1:N关系(blogposts)和一个N:M关系(blogroll) 事实证明,这比我想象的要困难得多(我敢说,比需要的困难得多)。我已经在这个问题上花了两天时间,没有取得多大进展。我正在尝试为博客生成管理功能 我已经发布了我的模式的简略版本。希望这将有助于澄清我所面临的问题(也许我没有足够清楚地解释
我相信我不是第一个(或唯一一个)尝试这样做的人。我是否走错了方向,是否有更好的(即用户更直观的)方式来显示和执行具有这种关系的对象上的CRUD?。外面有人能帮忙吗?你为什么不按照你在另一个问题中提出的建议去做呢 (这同样适用于学说,但对于推进来说应该是类似的) 在
生成器.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
,用于显示帖子
或者,您可以重定向或转发到博客帖子的管理模块(如果您有这样的模块)。在这里,您可能需要覆盖list操作以接受blog的ID参数,并扩展查询以按此blog ID筛选帖子。
重定向或转发没有错,这不是黑客行为;)
评论后编辑:
我还建议您转发该请求。
不,您不必更改路由,只需按照建议附加参数即可
对于重写,我重新考虑,如果重写buildQuery
方法(再次)会更好。(我不记得这个方法是如何用spreep调用的,我希望你明白我的意思)
所以看起来是这样的:
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;
}
}
class BlogPostAdministrations扩展了AutoblogPostAdministrations
{
//...
受保护的函数buildQuery()
{
$query=parent::buildQuery();
$request=$this->getRequest();//hasParamter('blog_id'))
{
$query->andWhere('blog_id=?',$request->getParameter('blog_id');
}
返回$query;
}
}
当然,您必须改变这一点来推进标准,但我认为您可以做到;)
希望这对您有所帮助。嗨,菲利克斯,谢谢您对转发/重定向不是黑客的保证。我来自桌面C++环境,所以有时候我的思维太僵化了;无论如何,回到你的专业解决方案,我更喜欢转发到管理员生成的模块,bcos它有一个过滤器部分等。我认为缺少的链接正是你建议的。我已经重写了buildCriteria()方法,就像您在上一篇文章中建议的那样,我正在那里设置blog_id(从会话中检索到的,很糟糕!)。我可以覆盖列表操作,但请您澄清一下:I)的意思。覆盖列表操作以接受博客的ID参数-我是否必须更改列表的路由以获得博客ID参数,或者我可以简单地在url中附加一个“?”博客ID=$vlog\u ID,然后使用$request->getParameter('blog\u ID'))在覆盖列表操作中?(ii)。扩展查询以按此博客id筛选帖子。如果您能(通过pastebin)向我发送一个片段,演示(I)和(ii)的含义,我将不胜感激。我想在那之后我应该能够实现这个功能。再次感谢您的帮助。我尝试转发时出错:返回$this->forward('blgpostadmin',“index?blog_id=$blog_id&user_id=$user_id”);操作“blgpostadmin/indexblog\u id3user\u id3”不存在??!过去我实现这一点的方法是使用用户会话变量。但问题是,它可以用于显示列表-但是,当您创建新博客帖子时,我们应该已经设置了blog_id-但是,blog post表单允许用户从所有可用博客的列表中进行选择。这是不正确的,因为列表最初被限制为一个特定的blog id。我试图覆盖新操作,但找不到访问blog_id的方法。我想我可以使用session_id,但这开始感觉非常像一个全局变量……我覆盖了buildQuery()方法,列表显示受限制的记录。是否仍有限制blog_id字段上的筛选器的方法(更糟糕的情况是,我将从表单中删除该字段)