我正在使用Symfony 1.2.9(使用Propel ORM)来创建网站。我已经开始使用管理生成器来实现管理功能。
然而,我遇到了一个轻微的“问题”。我的模型是相关的(例如,一个表可能有几个1:N关系和N:N关系)。我还没有找到办法令人满意地解决这个问题。作为一个战术解决方案(对于列表视图),我决定只显示父对象,然后添加交互以显示相关对象。我将使用Blog模型来说明这一点。
以下是博客模型的关系:
N:M与Blogroll的关系(模拟博客卷) 1:N与Blogpost的关系(模拟提交给博客的帖子)
我原本打算在博客上显示(分页)博客列表,当它被选中时,使用AJAX,但我对管理生成器的确如此挣扎,所以我搁置了这个想法 - 除非有人非常友好地阐明了如何做到这一点。
相反,我现在正在做的事情(作为战术/临时解决方案),我已经在列表视图中添加了交互,允许用户:
查看博客卷的列表 该行的博客
查看该行上博客的帖子列表
在行上添加博客
在上述所有内容中,我已经编写了基本上将请求转发给approriate操作(admin生成)的操作。但是,我需要传递一些参数(比如博客ID等),以便返回正确的博客卷或博客帖子列表等。
我确信有更好的方法可以做我想做的事情,但如果我的问题不存在,我可以提出问题:
我如何获得与特定行相关的对象 列表视图中的(例如,博客对象)
一旦我有了这个对象,我可以选择提取各种字段:id等。 如何将这些参数传递给管理员生成的操作?
关于第二个问题,我的猜测是这可能是这样做的方式(我可能错了)
public function executeMyAddedBlogRollInteractionLink(sfWebRequest $request)
{
// get the object *somehow* (I'm guessing this may work)
$object = $this->getRoute()->getObject();
// retrieve the required parameters from the object, and build a query string
$query_str=$object->getId();
//forward the request to the generated code (action to display blogroll list in this case)
$this->forward('backendmodulename',"getblogrolllistaction?params=$query_string");
}
这感觉有点像黑客,但我不知道怎么回事。我也不热衷于发送params(可能包括user_id等通过GET,甚至POST也不是那么安全,因为看看浏览器正在做什么请求是相当明智的)。如果有一个比我上面建议更好的方式来实现具有一个或多个M:N关系的对象所需的这种管理,我将很高兴听到“推荐”的方式来实现它。
我记得读过将某些行为标记为内部行为。即只能在应用程序内调用。我想知道在这种情况下这是否有用吗?
答案 0 :(得分:0)
我假设您的应用程序被称为后端。假设有两个模型,BlogPost和BlogPostComment。这些是使用名为blog_post和blog_post_comment的管理生成模块进行管理的。
我相信你想要一个链接来反对列表页面上backend.php / blog_post上显示的每个BlogPost。这些链接将您带到backend.php / blog_post_comment,它应该只显示与相关BlogPost相关的评论。
在apps / backend / blog_post / templates下,创建一个名为_commentslink.php的文件并将其放入其中:
<a href="<?php echo url_for('blog_post_comment_collection', array('action' => 'filter', 'blog_post_comment_filters[blogpost_id]'=>$blog_post->getId())) ?>">View Comments</a>
然后在apps / backend / blog_post / config / generator.yml中,您需要在列表视图的字段中包含此部分:
....
param:
config:
list:
display: [ id, title, _commentslink ]
注意_commentslink - _告诉它使用partial而不是在模型中查找字段。您的对象在此部分中可用为$&lt;模型名称&gt; - 在这种情况下是$ blog_post。
基本上,所有这个方法都是指向与评论列表中的过滤器通常相同的操作的链接,将相关条件传递给它以使其按blogpost_id过滤。
如果您在后端启用了CSRF保护,则需要将其禁用,否则此方法将无效。这是在apps / backend / config / settings.yml中设置的。那里会有一个名为csrf_secret的设置 - 应设置为false以禁用csrf。
如果您需要支持表格中的1:N关系,您应该尝试使用symfony 1.3 / 1.4。 1.3根据我的经验,从1.2.x开始相对无忧无虑的升级 - 1.4是相同的,但删除了已弃用的功能。