如何将ZF2表单对象序列化为JSON?

时间:2014-07-27 13:40:01

标签: ajax json forms zend-framework2

我在服务器上使用zf2表单对象,在客户端上使用ajax代码来实现我的注册表单。 我在ajax请求中发布了表单值,没问题,表单可以使用

完成它们
$form->setData($request->getPost());

在我验证表单并在服务器上执行注册后,我想将表单发送回客户端,特别是如果有错误,我可以将它们显示给用户。 我正在寻找一种使用zend或任何插件将表单对象序列化为JSON格式的标准方法,因此我可以在响应AJAX调用时发送它。 有什么想法吗?

1 个答案:

答案 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>

希望这会把你推向正确的方向。