Symfony1 显示与Symfony 1.2.9管理生成器的1:N和M:N关系

Symfony1 显示与Symfony 1.2.9管理生成器的1:N和M:N关系,symfony1,Symfony1,我正在使用Symfony 1.2.9(带推进ORM)创建一个网站。我已经开始使用管理生成器来实现管理功能。我在让管理员管理器显示一个对象(blog)时遇到了各种各样的问题,这个对象(blog)有一个1:N关系(blogposts)和一个N:M关系(blogroll) 事实证明,这比我想象的要困难得多(我敢说,比需要的困难得多)。我已经在这个问题上花了两天时间,没有取得多大进展。我正在尝试为博客生成管理功能 我已经发布了我的模式的简略版本。希望这将有助于澄清我所面临的问题(也许我没有足够清楚地解释

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

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

我已经发布了我的模式的简略版本。希望这将有助于澄清我所面临的问题(也许我没有足够清楚地解释这个问题——但希望模式能够澄清我所面临的问题,以及我正在尝试做的事情)

一个博客有0到1个博客卷,0到N个博客帖子附加到它。每个博客文章都有0到M条评论。目前,我可以查看博客列表。但我想添加两个互动(或链接),让我:

  • 查看blogroll(这是附加到博客的博客列表)
  • 查看附加到博客的博客帖子列表
  • 当显示blogpost列表时,我希望link显示一个链接(与前面的功能相同),该链接允许我显示所选blogpost的评论列表


    我相信我不是第一个(或唯一一个)尝试这样做的人。我是否走错了方向,是否有更好的(即用户更直观的)方式来显示和执行具有这种关系的对象上的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字段上的筛选器的方法(更糟糕的情况是,我将从表单中删除该字段)