Symfony: Как передать Doctrine Collection в форму в качестве значений по умолчанию? - PullRequest
0 голосов
/ 04 августа 2011

Мое действие:

public function executeEdit(sfWebRequest $request)
{
    // Get the object
    $article = $this->getRoute()->getObject();

    // Create the form
    $this->form = new ArticleEditForm( $article );
}

Вы можете видеть, что $article - это коллекция доктрин, которая передается в форму в качестве значений по умолчанию.$article объект содержит такие поля, как "заголовок", "текст", "автор" и т. Д.

Но это вызывает ошибку при создании формы:

500 | Internal Server Error | Doctrine_Record_UnknownPropertyException
Unknown record property / related component "_csrf_token" on "article"

Так что в основномформа пытается использовать коллекцию Doctrine для заполнения значений по умолчанию для элементов формы.Но, очевидно, в этом объекте нет csrf_token ... Но он все еще пытается найти тот, который будет использоваться в качестве значения по умолчанию ...

И что произойдет, если у вас есть форма, в которой всегда естьдополнительные пустые поля, которые являются пустыми, но другие имеют значения по умолчанию, которые передаются.Если эти пустые поля не имеют заданных значений в Doctrine Collection, вы получите сообщение об ошибке ...

Теперь, очевидно, я мог бы заранее сделать простой массив, в котором я указал бы значения по умолчанию и передал бы это:

$defaults = array( 'title' => $article->title, 'text' => $article->text, 'author' => $article->author );
$this->form = new ArticleEditForm( $defaults);

Это работает.Моя проблема в том, что приведенная выше «статья» является примером по причинам простоты.На самом деле моя форма содержит около 30 полей.Таким образом, единственный способ работы этого решения - вручную указать 30 отдельных значений по умолчанию в массиве.Это плохое решение с точки зрения обслуживания, очевидно.

Я полагаю, что разработчики Symfony достаточно умны, чтобы найти хорошее решение, но я просто не могу его найти ... Никаких подсказок

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

Я обнаружил свою проблему. Моя пользовательская форма расширялась BaseForm. Как только я изменил это на расширение BaseArticleForm, я смог успешно передать статьи Doctrine Collections в качестве значений по умолчанию.

0 голосов
/ 04 августа 2011

Эта проблема связана с тем, что ваша форма не создает _csrf_token.Вы можете добавить его при создании формы на странице шаблона, например:

<?php 
  echo $form->renderFormTag(url_for('article/edit'))
  echo $form->render();
?>
  <input type="hidden" name="form[_csrf_token]" value="<?= $form->getCSRFToken(); ?>">
  <input type="submit" value="Submit" />
</form>
...