从菜单回调函数返回drupal中的untemplated输出

时间:2010-02-18 02:42:57

标签: drupal drupal-6

我有一个drupal模块,其函数返回附件text / plain,

function mymodule_menu() {
$items = array();
$items[MY_PATH] = array(
'title' => 'some page',
'page callback' => 'myfunction',
'type' => MENU_CALLBACK,
);
}

function myfunction()
{
drupal_set_header('Content-Type: text/plain');
return "some text";
}

但是它返回了page.tpl.php模板中的页面,但是我希望它没有被模仿,我如何覆盖主题以使其返回纯文本?

谢谢,

汤姆

5 个答案:

答案 0 :(得分:9)

这将返回纯文本

function myfunction() {
  drupal_set_header('Content-Type: text/plain');
  print "some text";
  exit(0);
}

答案 1 :(得分:7)

或者,您可以使用菜单回调定义中的“投放回调”设置。现在你的页面回调函数将通过一个只打印和退出的自定义函数运行,而不是调用drupal_deliver_html_page(),这是输出所有典型主题标记等的。

function mymodule_menu() {
  $items = array();
  $items['MY_PATH'] = array(
    'title' => 'some page',
    'page callback' => 'myfunction',
    'type' => MENU_CALLBACK,
    'delivery callback' => 'mymodule_deliver_page',
  );
  return $items;
}

function mymodule_deliver_page($page_callback_result) {
  print $page_callback_result;
  exit(0);
}

答案 2 :(得分:2)

最好也是最简单的解决方案就是让你的回调打印你的html并且不返回任何内容。

例如,

// Hooks menu to insert new url for drupal
function MYMODULE_menu() {
  $items = array();
  $items['member-stats.php'] = array(
    'page callback' => '_MYMODULE_menu_callback',
    'access callback' => TRUE,
  );
  return $items;
}

// Callback prints and doesn't return anything
function _MYMODULE_menu_callback() {
  print "Hello, world";
}

答案 3 :(得分:1)

如果您要创建像html这样的模板 - barebones.tpl.php,只包含

<?php
    drupal_set_header('Content-Type: text/plain');
    print $barebones;
?>

您可以将该模板挂钩到YOURTHEME_preprocess_html(),如下所示:

function YOURTHEME_preprocess_html(&$variables) {
    if (array_key_exists('barebones',$_REQUEST)) {
        $variables['barebones'] = $variables['page']['foo']['bar'];
        $variables['theme_hook_suggestions'][] = 'html__barebones';
    }
}

现在,如果您使用其他查询来调用您的页面?准分子,例如drupal/foo/bar?barebones,它将返回准系统版本。

在获得结果方面有点棘手。 var_dump($variables['page'])查看drupal离开文本的位置。它被隐藏在渲染数组中,周围是用于渲染文本的所有信息,您没有使用它。让我想知道在myfunction内打印它和退出()是否更有效率: - )

答案 4 :(得分:0)

您的模块可以定义模板文件(reference):

<?php
function mymodul_preprocess_page(&$variables) {
     foreach ($variables['template_files'] as $file) {
     $template_files[] = $file;
     if ($file == 'page-node') {
        $template_files[] = 'page-'. $variables['node']->type;  
     }
    }
   $variables['template_files'] = $template_files;
}
?>

通过为相关页面创建新的.tpl.php文件。 E.g。

页面module.tpl.php

page-module.tpl.php只需要是一个简单的页面,例如

<?php
print $content;
?>