2
votes

My first post here, hopefully It will be right! =)

I am creating a site to manage web application development using symfony 1.4 and doctrine. My records consist for this problem of Project and ProjectFeatures

Now what I want to do is use the admin generator to let users manage the features for one project thru a link constraining all the returned features by project_id, that would look like: http://mysite/member/project/:project_id/features

in my routing.yml configuration, I have:

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 is an existing column in the model ProjectFeature,
I will use a custom query to retrieve features only by that project_id.

Now I can generate a url to link to that admin generator module without error using:
url_for('member_project_feature', array('project_id' => $project['id']))

And the routing system does recognise the 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',)

But the admin generator can't generate it's links inside it's templates with that prefix_path and returns error InvalidArgumentException with message The "/member/project/:project_id/features/:action/action.:sf_format" route has some missing mandatory parameters (:project_id).

Any idea?

2

2 Answers

3
votes

Well I found my answer at this url: http://www.blogs.uni-osnabrueck.de/rotapken/?s=symfony But I will give it here and shorten it because, stackoverflow is awesome and it should be there for a long time =)

1st - The routing configuration I used in my question is valid.
2nd - You need to add a method in the action file generated by the 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;
 }

At this point the url gets generated correctly but here is the last step to get to the end result you most probably want to achieve:

3rd - To get the list by project_id I can either provide a table method in the generator.yml, a default value to the getFilterDefaults or this method in the action file:

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

   return $q;
 } 
0
votes

I'm not 100% certain about what you're trying to do here, but it sounds like you need the ProjectFeature::toParams method return the project_id.