我需要在加载页面(无帖子)时验证用户个人资料表单并显示错误。
结果证明这是一个相当大的挑战。
要求
- 错误必须以与发布后相同的方式显示。
- 必填字段必须有
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);
.
其他信息
找到对我不起作用的解决方案:
已实现的工作解决方案有缺点:将用户数据创建为具有来自用户实体的数据集的数组。问题:在更改表单和/或用户实体时必须保持功能。
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);
}
}