【问题标题】:Showing 1:N and M:N relationships with Symfony 1.2.9 admin generator使用 Symfony 1.2.9 管理生成器显示 1:N 和 M:N 关系
【发布时间】:2009-12-14 22:52:49
【问题描述】:

我正在使用 Symfony 1.2.9(带有 Propel ORM)来创建一个网站。我已经开始使用管理生成器来实现管理功能。我在让管理员显示具有一个 1:N 关系(博客帖子)和一个 N:M 关系(blogroll)的对象(博客)时遇到了各种各样的问题。

事实证明,这比我想象的要困难得多(我敢说,比它需要的要困难得多)。我已经在这个问题上花了两天时间,并没有取得太大进展。我正在尝试为博客生成管理功能。

我已经发布了我的架构here 的精简版。希望它将有助于澄清我遇到的问题(也许我没有足够清楚地解释问题 - 但希望架构应该澄清我面临的问题以及我正在尝试做的事情)。

一个博客有 0 到 1 个博客卷,附有 0 到 N 个博客文章。每篇博文都附有 0 到 M cmets。目前,我可以查看博客列表。但我想添加 2 个交互(或链接),让我:

  1. 查看 blogroll(这是附在博客上的博客列表)
  2. 查看附加到博客的博文列表。

当显示博文列表时,我希望链接显示一个链接(与以前的功能相同),它允许我显示所选博文的 cmets 列表。

我确信我不是第一个(或唯一一个)尝试过这样做的人。我是否以错误的方式进行操作,是否有更好的(即用户更直观)显示和执行具有这种关系的对象的 CRUD 方式?有人可以帮忙吗?

【问题讨论】:

    标签: symfony1


    【解决方案1】:

    你为什么不按照你在其他问题中提出的建议去做。

    (这同样适用于 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 过滤帖子。
    重定向或转发没有错,这不是 hack ;)


    评论后编辑:

    我还建议您转发请求。
    不,您不必更改路由,只需按照您的建议附加参数即可。

    对于重写,我重新考虑如果您重写 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 标准,但我认为您可以这样做 ;)
    希望对您有所帮助。

    【讨论】:

    • 嗨,Felix,感谢您对转发/重定向不是黑客行为的保证。我来自桌面 C++ 环境,所以有时我的想法太僵化了 ;) 无论如何,回到你提供的解决方案,我更喜欢转发到由 admin gen 生成的模块,因为它有一个过滤器部分等。我认为缺少的链接正是您所建议的。我已经像您在上一篇文章中建议的那样覆盖了 buildCriteria() 方法,并且我在那里设置了 blog_id(从会话中检索 - 糟糕!)。我可以覆盖列表操作,但请您澄清一下您的意思:
    • i).覆盖列表操作以接受博客的 ID 参数 - 我是否必须更改列表的路由以采用 blog_id 参数,或者我可以简单地附加一个 '?blog_id= $vlog_id 到 url,然后在覆盖列表操作中使用 $request->getParameter('blog_id') ? ii)。扩展查询以按此博客 ID 过滤帖子。如果您能给我发送一个 sn-p(通过 pastebin),我将不胜感激,以说明您所说的 (i) 和 (ii) 的含义。我认为之后我应该能够实现该功能。再次感谢您的帮助。
    • 我尝试转发并收到错误:return $this->forward('blgpostadmin', "index?blog_id=$blog_id&user_id=$user_id");操作“blgpostadmin/indexblog_id3user_id3”不存在。 ??!
    • 我过去的工作方式是使用用户会话变量。这样做的问题是它适用于显示列表 - 但是,当您创建新的博客文章时,我们应该已经设置了 blog_id - 但是,博客文章表单允许用户从所有可用列表中进行选择博客。这是不正确的,因为该列表最初仅限于特定的博客 ID。我试图覆盖新操作,但找不到访问 blog_id 的方法。我想我可以使用 session_id,但这开始感觉很像一个全局变量......
    • 我已经覆盖了 buildQuery() 方法并且列表显示了受限记录。无论如何要限制 blog_id 字段上的过滤器(更糟糕的情况,我会简单地从表单中删除该字段)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多