Php 如何在Zend Framework 2中使用ajax?

Php 如何在Zend Framework 2中使用ajax?,php,zend-framework2,Php,Zend Framework2,我正在尝试一个小的ajax应用程序,我只想从我的控制器操作返回一个hello world字符串。 它正在返回Hello world,但与此同时,它也在返回我的模板文件。。 我尝试在controlelr的操作中使用以下代码禁用模板 $this->_helper->layout()->disableLayout(); $this->_helper->viewRenderer->setNoRender( true ); 但这会返回这个错误 SCREAM: Erro

我正在尝试一个小的ajax应用程序,我只想从我的控制器操作返回一个hello world字符串。 它正在返回Hello world,但与此同时,它也在返回我的模板文件。。 我尝试在controlelr的操作中使用以下代码禁用模板

$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender( true );
但这会返回这个错误

SCREAM: Error suppression ignored for
( ! ) Notice: Undefined property: Survey\Controller\SurveyController::$_helper in C:\wamp\www\zend\module\Survey\src\Survey\Controller\SurveyController.php on line 55

SCREAM: Error suppression ignored for
( ! ) Fatal error: Call to a member function layout() on a non-object in C:\wamp\www\zend\module\Survey\src\Survey\Controller\SurveyController.php on line 55
Call Stack
我该如何解决这个问题

编辑

我修改了控制器,使它看起来像这样

public function registerAction()
{
    $result = new JsonModel(array(
        'some_parameter' => 'some value',
        'success'=>true,
    ));

    return( $result );
}
在module appl目录中的module..module.config中添加了策略

'strategies' => array(
    'ViewJsonStrategy',
),
不过,在ajax响应中,我得到了返回的模板

这对我来说很有用:

public function ajaxAction(){
    $data = array(
        'var1' => 'var1Value',
        'var2' => 'var2Value',
    );

    $response = $this->getResponse();
    $response->setStatusCode(200);
    $response->setContent(json_encode($data));

    $headers = $response->getHeaders();
    $headers->addHeaderLine('Content-Type', 'application/json');

    return $response;
}
输出:

{"var1":"var1Value","var2":"var2Value"}

下面是一个很好的例子:


您应该使用JsonMoodels发回Json响应。

我在控制器中使用这个:

    $view = new ViewModel(array('form'=>$my_form));
    //disable layout if request by ajax
    $view->setTerminal($request->isXmlHttpRequest());
    $view->setTemplate('path/to/phtml');
    return $view;

用户想知道如何只获取html,而不是Andrews reply提供的json

我还希望返回html,这样我就可以将它与jQueryQTIP插件一起使用,我就是这样做的。 我还必须使页面在javascript失败的情况下优雅地降级,例如页面输出应该在布局模板中正确呈现

    /**
 * Tourist Summary action
 *
 * @return ViewModel
 */
public function touristSummaryAction()
{
    // Get the Id 
    $id = $this->params()->fromRoute('id', '');

    // Get the data from somewhere
    $data = array() ;

    // Get the html from the phtml
    $view = new ViewModel(
        array(
            'id' => $id ,
            'data' => $data ,
        )
    );

    //disable layout if request by ajax
    $view->setTerminal($this->getRequest()->isXmlHttpRequest());
    return $view;

}

看看这个模块。www.wasabilib.org 您似乎认为它可以很好地管理ajax

如果没有应用程序,可以使用Wasabilib框架。它在正确的位置配备了所有必要的资产

如果您已有应用程序,则应克隆模块:

最低要求:jQuery、ZF2

  • 将模块添加到application.config.php
  • 在layout.phtml的头部包含jquery之后的wasabilib.min.js
  • 它的工作原理 在.phtml文件中,您有这样一个表单:

    <form id="simpleForm" class="ajax_element" action="simpleFormExample" method="POST">
    <input type="text" name="written_text">
    <input type="submit" value="try it">
    </form>
    
    表单有一个类“ajax_element”,这将告诉库该请求将通过xmlhttp请求完成如果不给请求元素提供id,它将无法工作。因此表单的ID为“simpleForm”。与普通请求一样,操作是“路径/到/控制器”

    在控制器操作中,一个新的WasabiLib\Ajax\Response对象被实例化。 InnerHtml类用于将html或普通文本替换、前置和追加到选择器。 在这种情况下,选择器是一个ID“element\u simple\u form”。InnerHtml类的第一个参数是选择器确保您编写了#yourElementId或.yourClassSelector。对于ID和“#”以及类选择器”

    第二个参数是要填充此元素的文本

    响应对象可以处理更多的响应,您可以使用这些响应添加响应

    $response->add($anotherResponseType);
    
    此处列出了可能的响应类型:


    该模块的构建旨在以一种非常简单的方式处理ajax请求和响应。一旦理解了行为,您就可以处理几乎所有实际的ajax需求

    发送ajax请求和处理响应的最简单方法是zf2模块WASABLIB

    您只需要将“ajax\u元素”添加到要引起ajax请求的元素的class属性中。不管它是表单提交还是链接或按钮。访问示例页面
    如果您的应用程序大量使用ajax,我建议使用此模块。

    layout()不是函数。它应该是:$this->\u helper->layout->disableLayout();另外,您是否正在引导布局助手?返回
    ViewModel
    并执行
    setTerminal(true)
    。此外,还有一个
    JsonModel
    ,以备将来需要。您想从控制器返回字符串,完全绕过视图还是禁用布局?我想,对于ajax,您将需要Json响应。然后看看JsonModel和json呈现器策略$this->u helper->layout()->disableLayout();和$this->_helper->viewRenderer->setNoRender(true);是ZF1方法。对于ZF2,您应该返回类似@Xerkus notes的Json模型。阅读这里:这不是在zf2中实现的方法。应该使用jsonModel和json渲染器策略。请在此处的链接中添加要点,然后给出链接的参考。
    $response->add($anotherResponseType);