1

我正在尝试验证我在.twig文件中制作的表单。我没有使用 .twig 创建表单createFormBuilder。这是我的控制器代码,在提交表单后调用两种情况 1) 视图 2)

public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $errors = '';
    if ($request->getMethod() == 'POST') 
    {
        $validator = $this->get('validator');
        $errors = $validator->validate($entity);
        if (count($errors) > 0) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
}

这是查看文件,我显示这样的错误 Add.html.twig

{% for error in errors %}
    {{error}}
{% endfor %}

我在validation.yml 文件中为不能为空的名称设置了错误。所以现在当我运行视图页面时,每次提交表单后都会显示错误。如果没有错误,它不应该向我显示错误,只显示空白错误。

Note:有没有更好的方法可以做到这一点,所以请分享。请记住,我在没有createFormBuilder 更新的情况下这样做 。它总是向我显示错误。即使我的表单是有效的并且没有遗漏任何字段。

4

3 回答 3

1

如果您想自己制作表单,则无法使用 Syfmony 表单验证器对其进行验证。您需要使用简单的 PHP 验证服务器端。像这样的东西

if ($request->getMethod() == 'POST') 
{
    $username = $_POST['username'];
    if ($username == '')
    {
       // set error message here
    } 
}
于 2014-12-17T15:06:29.120 回答
1

好吧,让我说清楚。我会给你两个解决方案,第一个是最好和最合适的方法:1)生成你的EntityForm Type:bin/console make:formd:g:form命令。2)然后只需添加几行即可提交并获取错误。

 public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $form = $this->createForm(EntityType::class, $entity);
    $form->submitForm($request->request->all(), false);

    if ($request->getMethod()->isPost()) 
    {
    if ($form->isValid()) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', [
         'errors' => $form->getErrors(),
    ]);
}

第二种解决方案是将您的数据绑定到您的实体对象中,因为我们需要将数据设置到我们的对象中。

1)第一步private在您当前的类中创建一个函数来绑定所有提交的数据:

private function bindEntityValues(Product $entity, array $data) {
  foreach ($data as $key => $value){
    $funcName = 'set'+ucwords($key);
    if(method_exists($entity, $funcName)) $entity->$funcName($value);
  }
}

那么你的 cart_newAction 应该是这样的:

 public function cart_newAction(Request $request)
 {      
    $entity = new Product();
    $this->bindEntityValues(entity, $request->request->all());
    $errors= $this->get('validator')->validate($entity)

    if (count($errors) > 0) {
            echo 'Error';
        } 
        else {
            echo 'Success';             
        }
    }
    return $this->render('CartCartBundle:Cart:Add.html.twig', ['errors' => $errors]);
}

希望这能帮助你有一个清晰的愿景。

于 2018-11-06T03:03:28.900 回答
0

您必须检查是否$errors为空:

if (count($errors) > 0) {
    return $this->render('CartCartBundle:Cart:Add.html.twig', array('errors' => $errors ));
} else {
    return $this->render('CartCartBundle:Cart:Add.html.twig');
}

请参阅此处的文档。

于 2014-03-11T10:22:23.863 回答