2010-02-18 5 views
8

Ho un modulo di Drupal con una funzione che restituisce un testo allegato/plain,tornare uscita untemplated in Drupal dal menu funzione di callback

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

Ma restituisce la pagina nel modello page.tpl.php, tuttavia Lo voglio sbrogliato, come faccio a scavalcare il tema per farlo tornare in chiaro?

Grazie,

Tom

risposta

0

Il modulo può definire file di modello (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; 
} 
?> 

Con la creazione di un nuovo file .tpl.php per la pagina in questione. Per esempio.

pagina-module.tpl.php

pagina-module.tpl.php sarebbe solo bisogno di essere una pagina semplice, ad esempio

<?php 
print $content; 
?> 
+0

Ciao, grazie! Il file di testo non è un tipo di contenuto, è un rapporto generato da php/database quindi non sono sicuro di ottenere ciò che intendi. Tuttavia, mi sono appena reso conto che, se faccio , stampo "whateever"; e non restituisce "qualunque"; drupal non visualizza il modello di pagina.Sarei comunque interessato a sapere come ottenere drupal per applicare il modello page-plain.tpl.php a contenuto arbitrario ... – Tom

9

Ciò restituirà testo semplice

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

+1 - Questo è il modo in cui Drupal restituisce il contenuto "non collegato", ad es. risposte a js callback o file (quando i file privati ​​sono abilitati). Vedere http://api.drupal.org/api/function/file_transfer/6 per un esempio di questo nel nucleo. –

+1

Si applica una parola di avviso: quando si termina la normale elaborazione della richiesta Drupal tramite exit()/die(), * hook_exit non verrà richiamato *, quindi assicurati di non fare affidamento su ciò in questi casi. –

+0

Anche voler sapere come funziona. –

1

se si desidera creare un modello come html - barebones.tpl.php, contenente solo

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

si potrebbe agganciare quel modello a YOURTHEME_preprocess_html(), così:

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

ora, se chiami la tua pagina con la query aggiuntiva? Barebone, come drupal/foo/bar?barebones, restituirà la versione barebone.

c'è un po 'complicato per ottenere il tuo risultato. var_dump($variables['page']) per vedere dove drupal ha lasciato il tuo testo. È stato nascosto all'interno dell'array di rendering circondato da tutti i tipi di informazioni utilizzate per il rendering del testo, che non stai utilizzando. Mi chiedo se non sarebbe più efficiente stampare e uscire() all'interno di myfunction :-)

6

In alternativa è possibile utilizzare l'impostazione di 'callback di consegna' nella definizione di richiamata del menu. Ora la vostra funzione di callback pagina sarà gestito attraverso una funzione personalizzata che solo le stampe e le uscite, piuttosto che chiamare drupal_deliver_html_page(), che è quello che emette tutto il tipico markup tema, ecc

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

Penso che il 'callback di consegna' sia il modo migliore per gestirlo in drupal 7, ma invece di uscire; generalmente drupal_exit(); dovrebbe essere usato in Drupal 7: https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_exit/7 Invoca hook_exit() e altro. – Phizes

2

la soluzione migliore e più semplice è per avere la tua callback stampa il tuo html e non restituire nulla.

Per esempio,

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