Domanda

Vorrei visualizzare una vista Drupal senza il modello di pagina che normalmente la circonda - Voglio solo il semplice contenuto HTML dei nodi della vista.

Questa vista sarebbe inclusa in un altro sito non Drupal.

Mi aspetto di doverlo fare con una serie di visualizzazioni, quindi una soluzione che mi permetta di configurarle rapidamente e facilmente sarebbe la migliore - Preferirei non dover creare un file .tpl.php ogni volta Devo includere una vista da qualche parte.

È stato utile?

Soluzione

Stavo cercando un modo per estrarre i dati del nodo tramite Ajax e ho trovato la seguente soluzione per Drupal 6. Dopo aver implementato le modifiche seguenti, se aggiungi ajax = 1 nell'URL (ad esempio mysite.com/node/1 ? ajax = 1), otterrai solo il contenuto e nessun layout di pagina.

nel file template.php per il tuo tema:

function phptemplate_preprocess_page(&$vars) {

  if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
        $vars['template_file'] = 'page-ajax';
  }

}

quindi crea page-ajax.tpl.php nella directory del tuo tema con questo contenuto:

<?php print $content; ?>

Altri suggerimenti

Sulla base della risposta di Ufonion Labs sono stato in grado di rimuovere completamente tutto l'output HTML attorno al contenuto della pagina in Drupal 7 implementando sia hook_preprocess_page sia hook_preprocess_html nel mio template template.php, in questo modo:

function MY_THEME_preprocess_page(&$variables) {
  if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
    $variables['theme_hook_suggestions'][] = 'page__embed';
  }
}

function MY_THEME_preprocess_html(&$variables) {
  if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
    $variables['theme_hook_suggestions'][] = 'html__embed';
  }
}

Quindi ho aggiunto due modelli al mio tema: html--embed.tpl.php:

<?php print $page; ?>

e page--embed.tpl.php:

<?php print render($page['content']); ?>

Ora quando apro una pagina di nodo, come http://example.com/node/3 , vedo il pagina completa come al solito, ma quando aggiungo il parametro response_type, come http://example.com/node/3?response_type = incorpora , solo ottengo <div> con il contenuto della pagina in modo che possa essere incorporato in un'altra pagina.

So che questa domanda ha già ricevuto una risposta, ma volevo aggiungere la mia soluzione che utilizza elementi della risposta PWD (Philadelphia Web Design) e usa hook_theme_registry_alter, come suggerito da Owen. Utilizzando questa soluzione, puoi caricare il modello direttamente da un modulo personalizzato.

Per prima cosa, ho aggiunto raw.tpl.php a una cartella 'template' appena creata all'interno del mio modulo. I contenuti di raw.tpl.php sono identici alla pagina PWD-ajax.tpl.php:

<?php print $content; ?>

Successivamente, ho implementato hook_preprocess_page nel mio modulo nello stesso modo di PWD (tranne per il fatto che ho modificato il parametro $ _GET e aggiornato il riferimento al file modello:

function MY_MODULE_NAME_preprocess_page(&$vars) {
    if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) {
        $vars['template_file'] = 'raw';
    }
} 

Infine, ho implementato hook_theme_registry_alter per aggiungere la directory dei "modelli" del mio modulo al registro dei temi (basato su http: // drupal .org / node / 1105922 # comment-4265700 ):

function MY_MODULE_NAME_theme_registry_alter(&$theme_registry) {
   $modulepath = drupal_get_path('module','MY_MODULE_NAME');
   array_unshift($theme_registry['page']['theme paths'], $modulepath.'/templates');
}

Ora, quando aggiungo? raw = 1 al percorso URL della vista, utilizzerà il modello specificato all'interno del mio modulo.

Per gli altri che potrebbero colpire questa pagina, se stai solo lavorando con callback standard (non necessariamente visualizzazioni), questo è facile. Nella tua funzione di callback, invece di restituire il codice da renderizzare all'interno della pagina, usa la funzione 'stampa'.

Ad esempio:

function mymodule_do_ajax($node)
{
    $rval = <<<RVAL
        <table>
            <th>
                <td>Data</td>
                <td>Data</td>
                <td>Data</td>
            </th>
            <tr>
                <td>Cool</td>
                <td>Cool</td>
                <td>Cool</td>
            </tr>
        </table>
RVAL;

    //return $rval; Nope!  Will render via the templating engine.
    print $rval; //Much better.  No wrapper.
}

Cheers!

Un altro modo per farlo che trovo molto utile è aggiungere una voce di menu con una funzione di callback di pagina che non restituisce una stringa:

Esempio:

/**
 * Implementation of hook_menu.
 */
function test_menu(){
  $items['test'] = array (
    /* [...] */ 
    'page callback' => 'test_callback',
    /* [...] */ 
  );
  return $items;
}

function test_callback() {
  // echo or print whatever you want
  // embed views if you want
  // DO NOT RETURN A STRING
  return TRUE;
}    

- Aggiorna

Sarebbe molto meglio usare exit(); invece di return TRUE; (vedi commento).

Ehi, ecco un altro modo per farlo:

1) Scarica e installa il pacchetto bonus Views ( http://drupal.org/project/views_bonus) 2) Creare un display Views & Quot; Feed & Quot; e usa lo stile " XML " (o qualcosa che pensi si adatti meglio alle tue esigenze). 3) Se non sei soddisfatto dell'output XML standard, puoi modificarlo regolando il modello per la vista. Controlla & Quot; tema & Quot; impostazioni per ottenere suggerimenti per nomi di modelli alternativi per questa vista specifica (quindi avrai ancora l'output XML predefinito per un uso futuro).

Buona fortuna! // Johan Falk, NodeOne, Svezia

Basato sulla risposta di Philadelphia Web Design (grazie) e su alcuni googling ( http://drupal.org/node/ 957250 ) ecco cosa ha funzionato per me in Drupal 7 per visualizzare le pagine scelte senza il modello:

function pixture_reloaded_preprocess_page(&$vars)
{
  if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) {
        $vars['theme_hook_suggestions'][] = 'page__vlozeno';
  }   
}

invece di phptemplate, in D7 deve esserci il nome_del_tuo nel nome della funzione. Inoltre, ho dovuto inserire due caratteri di sottolineatura __ nella variabile php con il nome del file, ma il nome del file modello effettivo richiede due trattini -

contenuto della pagina - vlozeno.tpl.php:

<?php print render($page['content']); ?>

L'output, tuttavia, ha ancora molti riferimenti CSS e di wrapping del tema. Non sono sicuro di come generare dati totalmente non temuti ...

Supponendo che tu sia in Drupal 6, il modo più semplice per farlo è quello di effettuare una phptemplate_views_view_unformatted_VIEWNAME chiamata in template.php (presuppone che la tua vista non sia formattata - se è qualcos'altro, un elenco dice, usa la funzione tema appropriata ). Il tema della vista risulta quindi in questa chiamata a tema, invece di restituire i risultati come faresti normalmente, stampali e restituisci NULL. Questo genererà direttamente l'HTML.

PS: assicurati di svuotare la cache (in / admin / settings / performance) per vedere come funziona.

ci sono probabilmente diversi modi per aggirare questo, tuttavia, il " il più semplice " potrebbe essere solo impostare il tuo tema personalizzato e avere page.tpl.php semplicemente vuoto o alcuni div casuali

// page.tpl.php
<div id="page"><?php print $content ?></div>

questo metodo in pratica consentirebbe solo a node.tpl.php di mostrare (o una qualsiasi delle viste del modulo di drupal, ecc ...) e sarebbe un modo semplice per evitare di modificare il core, o dovendo alterare il registro dei temi per evitare la visualizzazione page.tpl.php in primo luogo.

modifica : vedi commenti

ok ho giocato un po 'con le viste, sembra che prenda il sopravvento e costruisca il proprio " node.tpl.php " (in un certo senso) per la visualizzazione in " page.tpl.php " ;. a prima vista, il mio istinto sarebbe quello di agganciarmi a theme_registry_alter().

quando guardi una pagina di visualizzazioni, hai accesso a pile di informazioni qui, così come ai percorsi / file page.tpl.php. come tale farei qualcosa del tipo:

function modulejustforalteration_theme_registry_alter(&$variables) {
  if (isset($variables['views_ui_list_views']) ) {
  // not sure if that's the best index to test for "views" but i imagine it'll work
  // as well as others
    $variables['page']['template'] = 'override_page';        
  }
}

questo dovrebbe permetterti di usare un " override_page.tpl.php " modello nel tema corrente in cui è possibile rimuovere tutto ciò che si desidera (come la mia prima risposta sopra).

alcune cose:

  • come ho detto, non sono sicuro che views_ui_list_views sia sempre disponibile per il confronto, ma sembra che dovrebbe essere impostato se stiamo guardando una vista
  • puoi modificare theme paths l'array page se preferisci (per cambiare la posizione in cui drupal cercherà page.tpl.php, invece di rinominarlo del tutto)
  • non sembra esserci alcun identificatore per questa vista specifica, quindi questo metodo potrebbe essere un " tutte le viste saranno rimosse " approccio. se hai bisogno di eliminare il page.tpl.php solo per una vista specifica, forse agganciare template_preprocess_page() potrebbe essere un'idea migliore.

Mi piace il modulo Drupal. BUt, ecco un altro modo.

copia page.tpl.php nella cartella del tuo tema in un nuovo file chiamato page-VIEWNAME.tpl.php, dove VIEWNAME è il nome della vista leggibile dalla macchina.

Quindi modifica page-VIEWNAME.tpl.php per adattarlo.

Esiste anche http://drupal.org/project/pagearray che è una soluzione generale ...

Inoltre, la soluzione di @Scott Evernden è una falla di sicurezza cross site scripting (XSS). Non farlo. Leggi la documentazione su drupal.org su come gestire il testo in modo sicuro http://drupal.org/node/ 28984

Un modo semplice per visualizzare il contenuto di un tipo di contenuto speciale che si desidera visualizzare senza tutti gli elementi di page.tpl.php:
Aggiungi il seguente frammento al tuo template.php file:

function mytheme_preprocess_page(&$vars) {
  if ($vars['node'] && arg(2) != 'edit') {
      $vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
    }
}

Aggiungi un page-nodetype-examplecontenttype.tpl.php al tuo tema, come il tuo print $content ma senza le cose che non vuoi visualizzare e con <=> nel corpo.

Se capisco la tua domanda, vuoi avere nodi che contengono tutto l'HTML per una pagina, da DOCTYPE a < / HTML > ;. Quello che vorrei fare è creare un tipo di contenuto per quei nodi - & Quot; fullhtml & Quot; come nome leggibile da una macchina - e quindi creare un modello di nodo per esso chiamato node-fullhtml.tpl.php. Non puoi semplicemente scaricare i contenuti del nodo, poiché sono stati disinfettati in HTML. node.fullhtml.tpl.php sarebbe letteralmente proprio questo:

echo htmlspecialchars_decode($content);

Quindi avrai bisogno di un modo per sovrascrivere lo standard page.tpl.php. Penso che ciò che potresti fare sia nella parte superiore della tua pagina.tpl.php controlla il tipo di contenuto di $ node e salva se è fullhtml. Oppure, imposta una variabile globale in node-fullhtml.tpl.php che page.tpl.php dovrebbe verificare.

Non sono un esperto di Drupal, ma è così che lo farei. Sto parlando al polso, quindi fai attenzione ai diavoli nei dettagli.

Vedo che sei già andato e hai creato un modulo, quindi questo potrebbe non essere più d'aiuto, ma è abbastanza facile ottenere una vista per esporre un feed rss, che potrebbe essere un modo più semplice per accedere al contenuto, in particolare se vuoi includerlo in un altro sito.

Su D7 puoi utilizzare menu_execute_active_handler

$build = menu_execute_active_handler('user', FALSE);
return render($build);

la risposta di jeroen è stata quella che ha fatto per me dopo averci giocato. Ho un sito Drupal 7.

  1. Prima di tutto assicurati di sostituire MY_THEME con il nome del tuo tema. Sì, è ovvio, ma la maggior parte dei neofiti manca questo.

  2. In realtà avevo già un function MY_THEME_preprocess_page(&$variables) {. Quindi non ricreare la funzione, ma aggiungi questo codice alla fine della funzione prima di chiuderla con }.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. La mia funzione ha utilizzato $vars non $variables, quindi ho dovuto aggiornare anche quello. Ancora una volta ovvio se pensi di cercarlo.

La mia prima risposta mi ha permesso di visualizzare il nodo solo quando l'ho richiamato in un browser web. Tuttavia, l'obiettivo finale di questo è incorporare il nodo drupal in un sito di terze parti usando iframe.

Dal rilascio di Drupal L'Irame Core 7.50 è bloccato di default per impedire il clickjacking

Per far sì che solo il nodo si integri correttamente in un sito di terze parti, è necessario sostituire anche l'impostazione predefinita x-frame. Tutto ha iniziato a funzionare dopo aver aggiunto quanto segue in template.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top