Использование генератора администраторов Symfony, чтобы позволить пользователю управлять подмножеством записей - PullRequest
2 голосов
/ 04 мая 2011

Мой первый пост здесь, надеюсь, будет правильным!=)

Я создаю сайт для управления разработкой веб-приложений с использованием symfony 1.4 и доктрины.Мои записи состоят из этой проблемы 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,
Iбудет использовать пользовательский запрос для извлечения функций только по этому 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',)

Но генератор администратора не может генерировать свои ссылки внутри своих шаблонов с этим prefix_path и возвращает ошибку InvalidArgumentException с сообщением В маршруте "/member/project/:project_id/features/:action/action.:sf_format" отсутствуют некоторые обязательные параметры (: project_id).

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Ну, я нашел свой ответ по этому адресу: http://www.blogs.uni -osnabrueck.de / rotapken /? S = symfony Но я дам его здесь и укоротю, потому что stackoverflow - это круто, и это должно бытьв течение длительного времени =)

1-й - Конфигурация маршрутизации, которую я использовал в моем вопросе, действительна.
2-й - Вам необходимо добавить метод в файле действий, сгенерированном администратором

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;
 } 
0 голосов
/ 04 мая 2011

Я не на 100% уверен в том, что вы пытаетесь сделать здесь, но, похоже, вам нужен метод ProjectFeature::toParams, возвращающий идентификатор_проекта.

...