symfony2(pre)在发布之前验证表单(加载时)

时间:2016-02-05 09:01:12

标签: symfony symfony-forms symfony-validator

我需要在加载页面(没有帖子)和显示错误时验证用户配置文件表单。

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

要求

  • 错误必须以与邮寄后相同的方式显示。
  • 必填字段必须包含field is empty错误消息。

通用且几乎正常工作的解决方案:显示错误消息,没关系。但是,它们未突出显示 ,因为 表单元素未收到has-error样式类 ,因为 表单字段为标记为有效 ,因为 valid正在检查submitted并且提交的内容为false,因为未提交。

 $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设为false或将submitted设为true?也许有完全不同的解决方案?我发现很难相信我是第一个实现这一点的人,因为我发现很难相信我无法从我构建的表单中检索数据并使用$form->setData($user);设置数据。

其他信息

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

  1. $form->submit([], false);here一样。不好 - 如果必填字段为空,则不会显示错误。
  2. here中使用ViolationMapper();。根本不适合我......:/
  3. 实施有缺点的工作解决方案:使用来自用户实体的数据集创建用户数据作为数组。问题:在更改表单和/或用户实体时必须保持功能。

    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);
        }
    }
    

0 个答案:

没有答案