我在服务器上使用zf2表单对象,在客户端上使用ajax代码来实现我的注册表单。 我在ajax请求中发布了表单值,没问题,表单可以使用
完成它们$form->setData($request->getPost());
在我验证表单并在服务器上执行注册后,我想将表单发送回客户端,特别是如果有错误,我可以将它们显示给用户。 我正在寻找一种使用zend或任何插件将表单对象序列化为JSON格式的标准方法,因此我可以在响应AJAX调用时发送它。 有什么想法吗?
答案 0 :(得分:3)
您可以执行的操作是在表单上运行验证,之后您将在new 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)验证,因为它更加用户友好,但这只是我会做的一些花哨的shizzle;)如果呈现ViewModel
:
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
)的默认设置!因此,在您的情况下,您不需要使用PhpRenderrer::setTemplate()
。但我只是把它交给你,这样你就可以改变它,如果你使用任何其他文件。
所以现在你将从我们的控制器,你的javascript中收到Json
。从ViewModel
检索新的Json
,然后删除旧的ViewModel
和替换。通过删除旧版本,您还可以删除绑定到viewModel
中任何元素的任何Javascript,这样您就可以在javascript中设置身体上的事件,或者将其放在Form/RegistrationForm
中的属性上。< / p>
希望这会把你推向正确的方向。