Как отобразить сообщение об ошибке (проверка) в обязательных полях с помощью symfony formbuilder? - PullRequest
0 голосов
/ 21 ноября 2018

PagesController.php

$id = $request->request->get('id');
$target = $request->request->get('target');
$EntityName = 'App\\Entity\\' . ucwords($slug);

$em = $this->getDoctrine()->getManager();
$cmf = $em->getMetadataFactory();
$classes = $cmf->getMetadataFor($EntityName);


if($request->request->get('target')){

  $item = new $EntityName();
  $item= $this->getDoctrine()->getRepository($EntityName)->find($id);

  $formBuilder = $this->createFormBuilder($item);

  foreach ($classes->fieldMappings as $fieldMapping) {
      $formBuilder->add($fieldMapping['fieldName'], TextType::class, array('attr' => array('class' => 'form-control'), 'required'   => true,));
  }

  $formBuilder->add('cancel', ButtonType::class, array('label' => 'Cancel','attr' => array('class' => 'cancel form-btn btn btn-default pull-right close_sidebar close_h')))
  ->add('save', SubmitType::class, array('label' => 'Save','attr' => array('id' => 'submit-my-beautiful-form','class' => 'form-btn btn btn-info pull-right','style' => 'margin-right:5px')));
  $form = $formBuilder->getForm();

  $form->handleRequest($request);


  $response = new JsonResponse(
    array(
      'message' => 'Success',
      'output' => $this->renderView('form.html.twig',
      array(
        'target' => $target,
        'entity' => $item,
        'form' => $form->createView(),
      ))), 200);
      return $response;



} else {

   $em = $this->getDoctrine()->getManager();
    foreach ($classes->fieldMappings as $fieldMapping) {
      $func = 'set'.$fieldMapping['fieldName'];
      $args = $data['form['.$fieldMapping['fieldName'].']'];
      $entity->$func($args);
    }
   $em->persist($entity);
   $em->flush();
  $response = new JsonResponse(array('id' => $data['form[id]']), 200);
  return $response;
}

form.html.twig

<section class="content-header" style="margin-bottom:20px">
  <h1 style="float:left;margin-bottom:30px">Create Entry </h1>
</section>
<section class="content" style="clear:left">
  <div class="form-group">
    {{ form_start(form) }}
    {{ form_end(form) }}
  </section>

Моя форма работает хорошо, когда я заполняю ее и нажимаю кнопку «Сохранить», она сохраняетсяв базе данных.Когда я оставляю все поля пустыми и нажимаю «Сохранить», ничего не происходит, и я получаю 500 Ошибка

Возникла исключительная ситуация при выполнении членов INSERT INTO (имя пользователя, пароль, адрес электронной почты, is_active) ЗНАЧЕНИЯ (?,?,?,?) 'с параметрами ["", null, "", "1"]:

SQLSTATE [23000]: нарушение ограничения целостности: 1048 Столбец «пароль» не может быть пустым

Это на самом деле хорошо, потому что поля обязательны для заполнения, но ошибки не отображаются в моей форме, даже если я добавил «required» = «true».

1 Ответ

0 голосов
/ 21 ноября 2018

Таким образом, при использовании построителя форм у вас есть доступ к:

$form->isSubmitted()

и

$form->isValid()

В результате вы можете сделать что-то вроде:

if ($form->isSubmitted() && $form->isValid()) {
    // save to database
}

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

Это предотвратит ошибку MySQL.потому что ваша форма технически недействительна, и вы пытаетесь сбросить неверные данные.Очевидно, что мы хотим сохранить наши данные только тогда, когда они действительны.

Конечно, если форма не удалась, вы можете вернуть представление и в шаблон, у вас есть доступ к

{{ form_errors() }}

Это будетвозможно, охватит то, что вам нужно, но вы также можете передать в свой шаблон что-то вроде

'formHasErrors' => $form->isSubmitted() && !$form->isValid(),

и затем в своем шаблоне

{% if formHasErrors %}

Что-то еще, что вы можете захотеть сделать, это позволяет вамиметь больше контроля над своими полями, выделите поле, как показано ниже:

{{ form_start(form) }}
    {{ form_label(form.name) }}
    {{ form_errors(form.name, {'attr': {'class': 'form-input'}}) }}
    {{ form_widget(form.name) }}
{{ form_end(form) }}

Очень важно, чтобы вы ловили ошибки и обрабатывали их правильно.Ваша реализация не проверила правильность формы, поэтому вы получили 500 ошибок.

...