【问题标题】:How to change Joomla component's view default format?如何更改 Joomla 组件的视图默认格式?
【发布时间】:2015-06-16 13:09:56
【问题描述】:

我有一个自定义的 Joomla 3.4.1 组件,它有一个以 JSON 格式(来自 views/myview/view.json.php 文件)或 HTML(来自 views/myview/view.html.php 文件)显示数据的视图) 格式。有没有办法将默认视图的格式从 HTML 更改为 JSON,以便

http://example.com/component/mycomponent/myview

返回 JSON 数据而不是 HTML 而:

http://example.com/component/mycomponent/myview?format=html

仍然返回视图的 HTML 模板?

编辑:

据我所知是这个路由器:

function TouristGuideParseRoute($segments) {
  $count = count($segments);
  $parameters = array();
  if ($count > 0) {
    $parameters['view'] = $segments[0];
  }
  if ($count > 1) {
    $parameters['task'] = $segments[1];
  }
  if ($count > 2) {
    $parameters['id'] = $segments[2];
  }
  if ($count > 3) {
    $parameters['format'] = $segments[3];
  }

  if (($parameters['view'] == 'api') && empty($parameters['format'])) {
    $application = JFactory::getApplication();
    $input = $application->input;
    $parameters['format'] = $input->getString('format', 'json');
  }
  return $parameters;
}

即使 URL 包含 ?format=html 也会显示 JSON 格式,因为在此路由器中 $application->input 为空(可能稍后在 Joomla 请求处理链中填充),因此 $input->getString('format','json') 始终返回 json

【问题讨论】:

  • 您可以直接将您的json数据回显到视图模板的php文件中。
  • 我知道但这并不能解决问题,当默认格式为 HTML 时,Joomla 页面框架(在 HTML 中)会自动附加到响应中。此外,由于 HTML 格式是默认的,我如何检查是否在没有指定格式的情况下请求了视图? JFactory::getApplication()->input->get('format')中有'html'。

标签: php model-view-controller joomla joomla3.0 joomla-extensions


【解决方案1】:

在您的控制器中,像这样手动设置默认格式 (Joomla 3)

$input = JFactory::getDocument()->input;
$format = $input->get('format','json','STR');
$view = $this->getView($view_name, $format);
$view->display($tpl);

希望这能有所帮助。

【讨论】:

  • 几乎!尽管这似乎在某种意义上有效,即使用正确的视图文件来呈现模板,但 Joomla 仍然在响应周围添加页面 HTML 内容。我试图用谷歌搜索“joomla 强制原始输出”,但没有像 w3facility.org/question/joomla-force-raw-output 中的建议那样强制原始 JSON 输出。
【解决方案2】:

如果您的自定义组件有一个路由器(正如我从您的示例网址中假设的那样),您可以将默认设置为 JSON。

在您要设置的 PARSE 函数中...

$vars['format'] = 'json';

Joomla Docs 上查看此半最新教程。 然后/或做类似...

$jinput = JFactory::getApplication()->input;
$outputFormat = $jinput->getString('format', 'json');
$vars['format'] = ($outputFormat == 'json') ? 'json' : 'html';`

请注意,我正在使用中间变量并根据默认值(第 2 行)检查它,以便它被限制为两个特定选项(用户不能输入 ?format=blahblah 并让路由器搞砸 $vars['format'] = 'blahblah' .

【讨论】:

  • 感谢您的回复。不幸的是,这迫使 JSON 格式无法将其设置回 HTML。有关详细信息,请参阅问题编辑。
  • 这会强制默认为 JSON,但您可以通过将 ?format=html 添加到 url 来覆盖它(第一行获取输入对象,第二行获取 format 请求变量设置为 json 如果不存在,第 3 行是安全的,确保路由器中仅应用 json 或 html 的值)。
  • 很抱歉,因为我已经用?format=html 编写了覆盖格式在这种情况下不起作用,因为JFactory::getApplication()->input 在路由器函数中由于某种原因是空的,即使URL 包含该参数。
猜你喜欢
  • 2015-04-03
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2017-01-28
  • 2017-08-28
  • 2022-10-13
  • 2012-06-26
相关资源
最近更新 更多