Symfony: как скрыть поля формы от отображения и затем установить значения для них в классе действий - PullRequest
0 голосов
/ 19 мая 2010

Я довольно новичок в Symfony, и у меня есть 2 поля, относящиеся к моей таблице "Pages"; созданный и обновленный. Они связаны с таблицей пользователей (sfGuardUser) в качестве внешних ключей. Я хочу, чтобы они были скрыты от редактирования / новых форм, поэтому я настроил файл generator.yml, чтобы не отображать эти поля:

form:
  display:
    General: [name, template_id]
    Meta: [meta_title, meta_description, meta_keywords]

Теперь мне нужно установить поля для сохранения. Я искал, как это сделать весь день, и перепробовал сотни методов. Метод, который я получил, работает в классе действий:

protected function processForm(sfWebRequest $request, sfForm $form)
  {
    $form_params = $request->getParameter($form->getName());
    $form_params['updated_by'] = $this->getUser()->getGuardUser()->getId();
    if ($form->getObject()->isNew()) $form_params['created_by'] = $this->getUser()->getGuardUser()->getId();

    $form->bind($form_params, $request->getFiles($form->getName()));

Так что это работает. Но у меня возникает ощущение, что в идеале мне следует не изменять веб-запрос, а напрямую изменять форму / объект. Однако я не имел никакого успеха с такими вещами, как:

$form->getObject()->setUpdatedBy($this->getUser()->getGuardUser());

Если бы кто-нибудь мог предложить какой-либо совет о лучших способах решения этой проблемы, я был бы очень благодарен.

Спасибо, Том

Ответы [ 3 ]

0 голосов
/ 19 мая 2010

После обработки и сохранения формы вы можете установить эти поля на объекте и повторно сохранить:

protected function processForm(sfWebRequest $request, sfForm $form)
{
  $form->bind($request->getParameter($form->getName()));

  if ($form->isValid())
  {
    $page = $form->save();
    $user = $this->getUser()->getGuardUser();
    $page->setUpdatedBy($user);
    if (empty($page->created_by))
    {
      $page->setCreatedBy($user);
    }

    $page->save();

    $this->getUser()->setFlash('notice', 'Successfully saved page.');
    $this->redirect('@homepage');
  }
}

Существует также расширение Doctrine под названием Blameable, которое автоматически устанавливает поля edited_by и made_by в указанных моделях. Веб-сайт Doctrine претерпевает некоторую реорганизацию, но вот кэшированная страница для расширения.

0 голосов
/ 29 декабря 2010

То, что вы хотите сделать, это настроить вашу форму и сбросить части 'create_at' и 'updated_at' формы в configure

class SampleForm extends BaseSampleForm
{   
  public function configure()
  {
    unset(
      $this['created_at'],
      $this['updated_at']
    );
  }
}

Тогда они не будут отображаться в форме и получат значения, настроенные с помощью поведения «Timestampable» перед сохранением

http://stereointeractive.com/blog/2010/04/07/symfony-forms-hide-created_at-updated_at-columns/

0 голосов
/ 19 мая 2010

Чтобы обработать форму, создайте новый объект, установите поля и сохраните.

$article = new Article();
$article->setName($request->getParameter($form->getName());
$article->setDescription($request->getParameter($form->getDescription());
$article->setMetaKeywords($request->getParameter($form->getMetaKeywords());
$article->save();
...