3

我需要在加载页面(无帖子)时验证用户个人资料表单并显示错误。

结果证明这是一个相当大的挑战。

要求

  • 错误必须以与发布后相同的方式显示。
  • 必填字段必须有field is empty错误消息。

通用且几乎可行的解决方案:显示错误消息,这很好。但是它们没有突出显示,因为表单元素没有接收has-error样式类,因为表单字段被标记为有效,因为 valid正在检查submitted和提交是假的,因为没有提交。

 $errors = $this->get('validator')->validate($form);
    if (count($errors)) {
        /** @var ConstraintViolation $error */
        foreach ($errors as $error) {
            // data.firstname
            if (preg_match('/^data\.(.*)/', $error->getPropertyPath(), $matches)) {
                $path = $matches[1];
            } // children[schoolGrades].data
            elseif (preg_match('/^children\[(.*?)\]\.data/', $error->getPropertyPath(), $matches)) {
                $path = $matches[1];
            } else {
                throw new \Exception(sprintf('Cannot parse field path from "%s"', $error->getPropertyPath()));
            }
            $formElement = $form->get($path);
            $formElement->addError(new FormError($error->getMessage()));
        }
    }
    $form->handleRequest($request);

问题

有没有办法设置valid为假或submitted真?也许有完全不同的解决方案?我很难相信我是第一个实现此功能的人,因为我很难相信我无法从我构建的表单中检索数据作为数组并使用$form->setData($user);.

其他信息

找到对我不起作用的解决方案

  1. $form->submit([], false);就像在这里一样。不好 - 如果必填字段为空,则不会显示错误。
  2. ViolationMapper();这里使用。根本不适合我...:/

已实现的工作解决方案有缺点:将用户数据创建为具有来自用户实体的数据集的数组。问题:在更改表单和/或用户实体时必须保持功能。

public static function handleRequest(User $user, FormInterface $form, Request $request)
{
    if ($request->get(UserWizardModel::URL_GET_PARAM_LAST_STEP) && !$request->get($form->getName())) {
        $schoolGradeIdArray = [];
        foreach ($user->getSchoolGrades() as $schoolGrade) {
            $schoolGradeIdArray[] = $schoolGrade->getId();
        }
        $userAsArray = [
            'firstname' => $user->getFirstname(),
            'lastname' => $user->getLastname(),
            'profileType' => '',
            'phone' => $user->getPhone(),
            'schoolGrades' => $schoolGradeIdArray,
            'profileSchool' => $user->getProfileSchool()->getId(),
        ];
        $form->submit($userAsArray);
    } else {
        $form->handleRequest($request);
    }
}
4

0 回答 0