使用Symfony管理生成器让用户管理记录的子集

时间:2011-05-04 18:34:41

标签: symfony1 symfony-1.4

我的第一篇文章,希望这是对的! =)

我正在使用symfony 1.4和doctrine创建一个管理Web应用程序开发的站点。 我的记录包含Project和ProjectFeatures的这个问题

现在我要做的是使用管理生成器让用户通过一个链接来管理一个项目的功能,该链接通过project_id限制所有返回的功能,如下所示:http://mysite/member/project/:project_id/features

在我的routing.yml配置中,我有:

member_project_feature:  
  class: sfDoctrineRouteCollection  
    options:
      model:                ProjectFeature
      module:               memberProjectFeature
      prefix_path:          /member/project/:project_id/features
      with_show:            true
      column:               id
      with_wildcard_routes: true

project_id是模型ProjectFeature中的现有列,
我将使用自定义查询仅通过该project_id检索功能。

现在我可以使用以下方法生成一个链接到该管理生成器模块的URL而不会出现错误:
url_for('member_project_feature', array('project_id' => $project['id']))

路由系统确实识别了网址:
May 04 14:30:59 symfony [info] {sfPatternRouting} Match route "member_project_feature" (/member/project/:project_id/features.:sf_format) for /member/project/1/features with parameters array ( 'module' => 'memberProjectFeature', 'action' => 'index', 'sf_format' => 'html', 'project_id' => '1',)

但管理生成器无法使用该prefix_path在其模板中生成链接,并返回错误 InvalidArgumentException ,消息为“/ member / project /:project_id / features /:action / action.:sf_format“route有一些缺少的必需参数(:project_id)。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我在这个网址找到了答案:http://www.blogs.uni-osnabrueck.de/rotapken/?s=symfony 但是我会在这里给它并缩短它,因为stackoverflow很棒,它应该存在很长时间=)

1st - 我在问题中使用的路由配置是有效的 第二 - 您需要在admin

生成的操作文件中添加方法
public function execute($sfRequest)
{
  // taken from http://www.blogs.uni-osnabrueck.de/rotapken/?s=symfony
  $this->forward404Unless(
    $project_id = $sfRequest->getUrlParameter('project_id'));

   $this->forward404Unless(
     $this->project = Doctrine::getTable('ttcWebProject')->find($project_id));

   $this->getContext()->getRouting()
     ->setDefaultParameter('project_id', $project_id);

   if ($id = $sfRequest->getUrlParameter('id'))
   {
     $this->getContext()->getRouting()->setDefaultParameter('id', $id);
   }

   $result = parent::execute($sfRequest);

   return $result;
 }

此时url会正确生成,但这是获得最有可能实现的最终结果的最后一步:

第3 - 要通过project_id获取列表,我可以在generator.yml中提供表方法,getFilterDefaults的默认值或操作文件中的此方法:

protected function buildQuery ()
{
  $q = parent::buildQuery();
  $rootAlias = $q->getRootAlias();
  $q->andWhere("{$rootAlias}.project_id = ?", 
    $this->getRequest()->getUrlParameter('project_id'));

   return $q;
 } 

答案 1 :(得分:0)

我不是100%肯定你在这里尝试做什么,但听起来你需要ProjectFeature::toParams方法返回project_id。