【问题标题】:Empty session variable after the first reload第一次重新加载后的空会话变量
【发布时间】:2020-01-21 13:02:32
【问题描述】:

我有一个模态用户帐户的注册表单,并从我的模板“base.html.twig”中调用。我希望如果提交后存在表单错误(在实体级别检查约束),我希望重新显示我的模态表单。

因此,为此,在我的控制器处理注册时,如果表单无效,我会创建一个会话变量。然后,在我的模板“base.html.twig”中检查会话变量是否存在。如果是,那么我在模态 div 级别将数据可见性属性传递给 1。最后,在 JavaScript 中,如果此数据可见性属性为 1,我将显示上述 div。

我的问题是,如果出现错误,提交后表单不会自动重新显示。我必须自己点击按钮才能这样做。

在这里,在屏幕截图中,流程试图让我更好地理解。

我点击帐户创建按钮:

我通过明确编码错误来完成模态形式:

我提交表格:

提交后,尽管存在错误,但表单没有重新显示:

我必须点击“注册”按钮才能再次显示表单:

这是有问题的,因为最终用户不会知道有错误,然后必须重新点击“注册”按钮。

这是我的代码。

在我的模板“base.html.twig”中:

...
      {% if app.session.get('errorFomRegistration') %}
        <div id="registrationModal" class="modal fade" role="dialog" data-visibility='1'>
      {% else %}
        <div id="registrationModal" class="modal fade" role="dialog" data-visibility='0'>
      {% endif %}
          <div class="modal-dialog">
            <div class="modal-content">
              <div class="modal-header">
                <h4 class="modal-title">Sign up</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                  <span aria-hidden="true">&times;</span>
                </button>
              </div>
              <div class="modal-body">
                <div>
                  {% if app.session.get('errorFomRegistration') %}
                    {{ include('_messages.html.twig') }}
                  {% endif %}
                </div>
                {{ render(controller('App\\Controller\\security\\SecurityController::registration', {'request': app.request})) }}
              </div>
            </div>
          </div>
        </div>
        </div>
...

在我的控制器“SecurityController.php”中:

    /**
     * User registration
     * 
     * @Route("/security/registration/{shortForm}", name="security.registration")
     *
     * @param bool $shortForm
     * @param Request $request
     * @param EntityManagerInterface $manager
     * @param UserPasswordEncoderInterface $encoder
     * @param AuthorizationCheckerInterface $authChecker
     * @param \Swift_Mailer $mailer
     * @param UserRepository $userRepository
     * 
     * @return Response
     */
    public function registration(bool $shortForm = false, Request $request, EntityManagerInterface $manager, UserPasswordEncoderInterface $encoder, 
                                  AuthorizationCheckerInterface $authChecker, \Swift_Mailer $mailer, UserRepository $userRepository): Response
    {

        $session = $this->get('session');

        $session->set('errorFomRegistration', false);
...
        $form->handleRequest($request);

        if ($form->isSubmitted())
        {

            if ($form->isValid())
            {
...
            }
            else 
            {

                $session->set('errorFomRegistration', true);
                \dump($session->get('errorFomRegistration'));

            }

        }
...

最后,在我的 app.js 中:

...
  // Display the login modal form if there is an autentication error
  var $registrationDiv = $('#registrationModal');

  console.log('Before display');

  if($registrationDiv.data('visibility') == '1')
  {

    console.log('Visible');

    $registrationDiv.modal('show');

  }
...

谁有办法让我摆脱这个我已经尝试了几个星期的问题?

提前感谢您的帮助。

【问题讨论】:

  • 处理此类验证的最高效和人性化的方式是在流程中进行。如果您必须咨询后端进行验证,请使用 Ajax/XHR 执行验证,同时向用户显示进度指示器。然后,您将使用 JavaScript 来识别和可视化需要注意的表单控件。您可能需要稍微重新连接您的流程,但它会变得更好。
  • 我不明白为此使用会话的价值。默认方法是,如果 isValid 失败,那么您只需再次放置原始表单,只有这次将显示验证错误。检查文档中的表单示例。根本不需要使用会话。
  • 我的问题是表单是从另一个模板调用的模式。因此,提交后,初始模板再次显示。但是,表格不是。这就是为什么我想使用一个会话变量来指示应该再次显示表单。

标签: php forms symfony session constraints


【解决方案1】:

我在 Laravel 中做过同样的事情。您需要在 if 条件内的模态打开按钮上应用 javascript click() 方法。

【讨论】:

  • 非常感谢您的关注。我不明白我必须做什么。什么时候必须使用点击功能?里面的“如果条件”?
猜你喜欢
  • 2014-02-12
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
相关资源
最近更新 更多