Php 如何在Zend Framework 2中使用ajax?
我正在尝试一个小的ajax应用程序,我只想从我的控制器操作返回一个hello world字符串。 它正在返回Hello world,但与此同时,它也在返回我的模板文件。。 我尝试在controlelr的操作中使用以下代码禁用模板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
$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
<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);