0

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

$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 );
}

在模块 appl 目录中的 module..module.config 中添加了策略

'strategies' => array(
    'ViewJsonStrategy',
),

不过,在 ajax 响应中,我得到了返回的模板

4

6 回答 6

2

这是一个可靠的例子:

http://akrabat.com/zend-framework-2/returning-json-from-a-zf2-controller-action/

您应该使用 JsonMoodles 发送回 Json 响应。

于 2013-02-15T10:07:48.377 回答
0

我在我的控制器中使用它:

    $view = new ViewModel(array('form'=>$my_form));
    //disable layout if request by ajax
    $view->setTerminal($request->isXmlHttpRequest());
    $view->setTemplate('path/to/phtml');
    return $view;
于 2013-05-18T10:56:16.523 回答
0

用户想知道如何只取回 html,而不是 Andrews 回复提供的 json。

我还希望返回 html,这样我就可以将它与 jquery qtip 插件一起使用,这就是我的做法。我还必须让页面优雅地降级以防 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;

}
于 2015-03-20T15:18:18.120 回答
0

看看这个模块。www.wasabilib.org 看来你对ajax 管理得很好。

如果您没有应用程序,您可以使用 Wasabilib Skeleton https://github.com/WasabiLib/wasabilib_zf2_skeleton_application。它在正确的位置配备了所有必要的资产。

如果您已经有一个应用程序,您应该克隆该模块:https ://github.com/WasabiLib/wasabilib

最低要求:jQuery、ZF2

  1. 将模块添加到 application.config.php。
  2. 在你的 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>

您可以在 phtml 中的任何其他位置放置一个元素来显示响应。

在您的控制器中使用以下方法:

public function simpleFormExampleAction(){
    $postArray = $this->getRequest()->getPost();
    $input = $postArray['written_text'];
    $response = new Response(new InnerHtml("#element_simple_form","Server     Response: ".$input));
    return $this->getResponse()->setContent($response);
}

该表单有一个类“ajax_element”,这将说明请求将使用 xmlhttp-request 完成的库。如果您不为请求元素提供 id ,它将无法工作。所以表单的 ID 为“simpleForm”。该操作是“路径/到/控制器”,就像普通请求一样。

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

第二个参数是你要在这个元素中填写的Text。

响应对象可以处理更多您可以添加的响应

$response->add($anotherResponseType);

可能的响应类型列表在这里:http ://www.wasabilib.org/application/pages/components

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

于 2015-06-16T08:34:13.803 回答
0

发送 ajax 请求和处理响应的最简单方法是 zf2 模块 WasabiLib https://github.com/WasabiLib/wasabilib_zf2_skeleton_application

您只需要将“ajax_element”添加到要引起ajax请求的元素的类属性中。它是表单提交还是链接或按钮都没有关系。访问示例页面http://www.wasabilib.org/application/pages/examples 如果您的应用程序执行大量 ajax,我推荐这个模块。

于 2015-12-14T11:52:37.723 回答
-2

这对我有用:

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"}
于 2013-02-14T04:34:43.230 回答