2010-02-18 22 views
8

Tengo un módulo de Drupal con una función que devuelve un texto adjunto/plain,regresar de salida sin molde en Drupal desde la función de devolución de llamada del menú

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"; 
} 

Pero devuelve la página en la plantilla page.tpl.php, Lo quiero sin editar, ¿cómo anulo el tema para que devuelva texto sin formato?

Gracias,

Tom

Respuesta

0

Su módulo puede definir archivos de plantilla (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; 
} 
?> 

Al crear un nuevo archivo tpl.php de la página en cuestión. P.ej.

página-module.tpl.php

página-module.tpl.php solamente tendría que ser una simple página, por ejemplo,

<?php 
print $content; 
?> 
+0

Hola, gracias! El archivo de texto no es un tipo de contenido, es un informe generado desde php/base de datos, así que no estoy seguro de entender lo que quieres decir. Sin embargo, me acabo de dar cuenta de que si hago imprimo "cualquiera que sea"; y no return "whatever"; drupal no muestra la plantilla de página.Todavía estaría interesado en saber cómo obtendría Drupal para aplicar la plantilla page-plain.tpl.php a contenido arbitrario ... – Tom

9

Esto devolverá texto plano

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

+1 - Esta es la forma en que Drupal devuelve el contenido "no modificado", p. respuestas a callbacks o archivos js (cuando los archivos privados están habilitados). Consulte http://api.drupal.org/api/function/file_transfer/6 para ver un ejemplo de esto en el núcleo. –

+1

Se aplica una advertencia: al finalizar el proceso normal de solicitud de Drupal a través de exit()/die(), * hook_exit no se invocará *, así que asegúrese de no confiar en eso en estos casos. –

+0

También quiero saber cómo funciona esto. –

1

si quieres crear una plantilla como html - barebones.tpl.php, que contiene solo

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

se podría enganchar esa plantilla a YOURTHEME_preprocess_html(), así:

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

ahora, si llama a su página con la consulta adicional? Barebones, como drupal/foo/bar?barebones, devolverá la versión de barebones.

hay un truco para recuperar su resultado. var_dump($variables['page']) para ver dónde drupal dejó su texto. Se ha metido dentro de la matriz de renderizado rodeado de todo tipo de información utilizada para representar el texto, que no está utilizando. Me pregunto si no sería más eficiente simplemente imprimirlo y salir() dentro de myfunction :-)

6

Como alternativa, puede usar la configuración de "devolución de llamada de entrega" en la definición de devolución de llamada del menú. Ahora su función de devolución de la página se llevará a cabo a través de una función personalizada que sólo impresiones y salidas, en lugar de llamar drupal_deliver_html_page(), que es la que da salida a todo el tema típico de marcado, etc.

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); 
} 
+0

Creo que la 'devolución de llamada de entrega' es la mejor manera de manejar esto en drupal 7, pero en lugar de salir; generalmente drupal_exit(); debe usarse en Drupal 7: https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_exit/7 Esto invoca hook_exit() y más. – Phizes

2

El mejor y más sencilla solución es simplemente para que su devolución de llamada imprima su html y no devuelva nada.

Por ejemplo,

// 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"; 
 
}

Cuestiones relacionadas