возвращение необработанного вывода в drupal из функции обратного вызова меню - PullRequest
8 голосов
/ 18 февраля 2010

У меня есть модуль drupal с функцией, которая возвращает текст вложения / обычный,

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, однако я хочу, чтобы она была без шаблонов, как мне переопределить тему, чтобы она возвращала простой текст?

Спасибо

Tom

Ответы [ 5 ]

9 голосов
/ 18 февраля 2010

Это вернет обычный текст

function myfunction() {
  drupal_set_header('Content-Type: text/plain');
  print "some text";
  exit(0);
}
7 голосов
/ 22 августа 2013

В качестве альтернативы вы можете использовать настройку «обратного вызова доставки» в вашем определении обратного вызова меню.Теперь функция обратного вызова вашей страницы будет запускаться через пользовательскую функцию, которая просто печатает и завершает работу, вместо вызова 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 голосов
/ 18 февраля 2015

Лучшее и самое простое решение - просто напечатать обратный вызов 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";
}
1 голос
/ 02 августа 2013

, если вы создадите такой шаблон, как 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';
    }
}

Теперь, если вы называете свою страницу дополнительным запросом - barebones, как drupal/foo/bar?barebones, она вернет версию barebones.

Сложно вернуть ваш результат. var_dump($variables['page']) чтобы увидеть, где друпал оставил ваш текст. Он был спрятан внутри массива рендеринга, окруженного всей информацией, используемой для рендеринга текста, который вы не используете. Заставляю меня задуматься, не будет ли эффективнее просто распечатать его и выйти () внутри myfunction: -)

0 голосов
/ 18 февраля 2010

Ваш модуль может определять файлы шаблона ( ссылка ):

<?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 для рассматриваемой страницы. Э.Г.

страниц module.tpl.php

page-module.tpl.php должен быть простой страницей, например

<?php
print $content;
?>
...