我的控制器中有任务run。我希望它返回JSON数据。现在,我将把我的JSON数据包装在模板HTML中。如何告诉Joomla只从控制器返回JSON数据?这是我拥有的函数:
public function run ( ) {
JFactory::getDocument()->setMimeEncoding( 'application/json' );
JResponse::setHeader('Content-Disposition','attachment;filename="progress-report-results.json"');
JRequest::setVar('tmpl','component');
$data = array(
'foo' => 'bar'
);
echo json_encode( $data );
}这将返回:
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-gb" lang="en-gb" dir="ltr">
...
</head>
<body class="contentpane">
<div id="system-message-container">
</div>
{"foo":"bar"}
</body>
</html>我想要得到:
{"foo":"bar"}发布于 2013-05-26 01:42:30
您不需要构建一个特殊的JSON视图(view.json.php;或控制器progressreports.json.php)来实现这一点。您唯一需要做的就是回显JSON字符串并关闭应用程序。
public function run( )
{
JFactory::getDocument()->setMimeEncoding( 'application/json' );
JResponse::setHeader('Content-Disposition','attachment;filename="progress-report-results.json"');
$data = array(
'foo' => 'bar'
);
echo json_encode( $data );
JFactory::getApplication()->close(); // or jexit();
}如果您希望为HTML和JSON输出(由调用者选择)提供相同的函数,则只需要一个单独的视图(或控制器)。
发布于 2013-05-25 03:31:51
现有控制器中的快速方法
您需要使用jexit()返回json数据,而不需要任何Joomla输出。
public function run ( ) {
$data = array(
'foo' => 'bar'
);
echo json_encode( $data );
jexit();
}Joomla 3.x方法
更好的替代方法是创建JSON控制器并使用JResponseJson输出JSON。文件名应具有JSON后缀。例如,如果你的控制器是一个项目,那么你的文件名可以是item.json.php,你可以添加如下所示的控制器代码。
public function run ( ) {
$data = array(
'foo' => 'bar'
);
echo new JResponseJson($data);
}输出将是如下所示的json。
{"success":true,"message":null,"messages":null,"data":["foo": "bar"]}您的ajax URL应该有json参数来触发这个json控制器。
index.php?option=com_mycomponent&task=item.run&format=json使用JResponseJson通知错误和消息。请阅读以下位置的完整文档。
发布于 2013-05-25 00:55:23
找到答案了。
我需要做一个新的控制器。在我的例子中,原来的控制器被称为progressreports.php -我创建了一个名为progressreports.raw.php的新控制器。
然后,在调用url时,添加format=raw。即
index.php?option=com_foo&task=progressreports.run&format=rawhttps://stackoverflow.com/questions/16739800
复制相似问题