结果证明这是一个很大的挑战。
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);
设置数据。
找到对我不起作用的解决方案:
$form->submit([], false);
与here一样。不好 - 如果必填字段为空,则不会显示错误。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);
}
}