【问题标题】:Using the Symfony admin generator to let a user manage a subset of record使用 Symfony 管理生成器让用户管理记录子集
【发布时间】:2011-08-18 19:08:39
【问题描述】:

我在这里的第一篇文章,希望它是正确的! =)

我正在创建一个站点来管理使用 symfony 1.4 和教义的 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']))

并且路由系统确实可以识别 url:
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',)

但管理员生成器无法使用该前缀路径在其模板内生成它的链接,并返回错误 InvalidArgumentException 并带有消息 “/member/project/:project_id/features/:action/ action.:sf_format" 路由缺少一些强制参数 (:project_id)。

有什么想法吗?

【问题讨论】:

    标签: symfony1 symfony-1.4


    【解决方案1】:

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

    1st - 我在问题中使用的路由配置是有效的。
    2nd - 您需要在管理员生成的操作文件中添加一个方法

    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 已正确生成,但这是获得您最可能想要实现的最终结果的最后一步:

    3rd - 要通过 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;
     } 
    

    【讨论】:

    • 只是一个简短的评论。博客文章的作者更新了他的文章,因此创建操作在子控制器中工作......
    【解决方案2】:

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

    【讨论】:

    • 嗨,我想在路由中使用 :projet_id 来确保这个管理员生成的模块中的每个操作都与 url 中的 :project_id 指定的项目相关。功能列表将针对此 project_id,新功能将针对此 project_id。基本上我希望这个管理员生成器使用 :project_id 参数生成所有 url
    • 我尝试使用 toParams 方法,它可以用于为一个对象生成的链接,但不适用于过滤器或索引等集合链接。无论如何它都不起作用。也许它适用于推进?也许它已被弃用? (tohenk.wordpress.com/2009/04/22/…)
    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2011-05-26
    • 1970-01-01
    相关资源
    最近更新 更多