Ajax 如何将ZF2表单对象序列化为JSON?
我在服务器上使用zf2表单对象,在客户端使用ajax代码来实现我的注册表单。 我在ajax请求中发布表单值,没有问题,表单可以很好地处理它们Ajax 如何将ZF2表单对象序列化为JSON?,ajax,json,forms,zend-framework2,Ajax,Json,Forms,Zend Framework2,我在服务器上使用zf2表单对象,在客户端使用ajax代码来实现我的注册表单。 我在ajax请求中发布表单值,没有问题,表单可以很好地处理它们 $form->setData($request->getPost()); 在我验证表单并在服务器上执行注册之后,我想将表单发送回客户端,特别是在有错误的情况下,这样我就可以将它们显示给用户。 我正在寻找一种使用zend或任何插件将表单对象序列化为JSON格式的标准方法,以便在响应AJAX调用时发送它。 有什么想法吗?您可以做的是在表单上运行验
$form->setData($request->getPost());
在我验证表单并在服务器上执行注册之后,我想将表单发送回客户端,特别是在有错误的情况下,这样我就可以将它们显示给用户。
我正在寻找一种使用zend或任何插件将表单对象序列化为JSON格式的标准方法,以便在响应AJAX调用时发送它。
有什么想法吗?您可以做的是在表单上运行验证,然后在
新JsonModel
中返回表单
下面是一个如何处理控制器的小示例:
class RegistrationController extends AbstractActionController
{
public function RegisterAction()
{
$form = new RegisterForm();
$form->setInputFilter(new RegisterInputFilter());
if ($this->getRequest()->isPost()) {
$form->setData($this->getRequest()->getPost());
if($form->isValid()) {
// Handle your registration as the form is valid!
// return to some path after registration is complete.
// Show user he registered succesfully, etc. ;)
}
// Checks if the request is from JavaScript
if($this->getRequest()->isXmlHttpRequest()) {
return new JsonModel(array('registerForm' => $form));
}
}
return new ViewModel(array('registerForm' => $form));
}
}
请注意,表单对象包含所有无效输入,包括验证后的消息
我将采用另一种方法,只是再次完全渲染ViewModel
,这样您可以更轻松地显示验证消息。另一方面,您可以添加客户端(Javascript)验证,因为它对用户更加友好,但这只是我会做的一些花哨的事;)如果渲染视图模型
:
use Zend\View\Renderer\PhpRenderer;
if($this->getRequest()->isXmlHttpRequest()) {
$renderer = new PhpRenderer;
$registerViewModel = new ViewMOdel();
$registerViewModel->setTemplate('view/register.phtml');
return new JsonModel(array('registerViewModel' => $renderer->render($registerViewModel));
}
请注意,如果不将模板设置为您的viewModel
,则ZF2将获得您所处操作的默认值(view/moduleName/registration/register.phtml
)!因此,在您的情况下,不需要使用phprenderr::setTemplate()
。但我只是把它交给你,这样你就可以在使用其他文件时更改它
现在,您将在javascript中从我们的控制器接收Json
。从Json
检索新的ViewModel
,删除旧的ViewModel
并用新的替换它。通过删除旧的,您也可以删除绑定到viewModel
中任何元素的任何Javascript,因此您可以在Javascript中设置主体上的事件,或者在Form/RegistrationForm
中的属性上设置事件
希望这能把你推向正确的方向