37 votes

afficher une vue Drupal sans modèle de page

Je souhaite afficher une vue Drupal sans le modèle de page qui l'entoure normalement. Je souhaite simplement afficher le contenu HTML brut des nœuds de la vue.

Cette vue serait incluse dans un autre site, non-Drupal.

Je m'attends à devoir faire cela avec un certain nombre de vues, donc une solution qui me permette de les configurer rapidement et facilement serait la meilleure solution. Je préférerais ne pas avoir à créer un fichier .tpl.php à chaque fois que j'en ai besoin. inclure une vue quelque part.

20voto

jeroen Points 1098

Basé sur la réponse de Ufonion Labs j'ai été en mesure d'éliminer complètement le code HTML de sortie autour de la page contenu dans Drupal 7 par la mise en œuvre de deux hook_preprocess_page et hook_preprocess_html dans mes thèmes template.php, comme ceci:

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

Ensuite, j'ai ajouté deux modèles pour mon thème: html--embed.tpl.php:

<?php print $page; ?>

et page--embed.tpl.php:

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

Maintenant quand j'ouvre une page de noeud, tels que http://example.com/node/3j'ai vu que la page complète comme d'habitude, mais lorsque j'ajoute le response_type paramètre, tels que http://example.com/node/3?response_type=embed, je seulement obtenir l' <div> avec le contenu de la page de sorte qu'il peut être intégré dans une autre page.

7voto

Je sais que cette question a déjà été posée, mais je voulais ajouter ma propre solution qui utilise des éléments de Philadelphie Web Design (PWD) réponse et utilise hook_theme_registry_alter, comme suggéré par Owen. Grâce à cette solution, vous pouvez charger le modèle directement à partir d'un module personnalisé.

Tout d'abord, j'ai ajouté raw.tpl.php vers un nouveau "templates" dossier à l'intérieur de mon module. Le contenu de raw.tpl.php sont identiques à la DDT de l'page-ajax.tpl.php:

<?php print $content; ?>

Ensuite, j'ai mis en place hook_preprocess_page dans mon module de la même manière que PWD (sauf que j'ai modifié le $_GET paramètre et mis à jour le fichier de modèle de référence:

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

Enfin, j'ai mis en place hook_theme_registry_alter pour ajouter mon module de "templates" annuaire sur le thème de registre (basé sur 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');
}

Maintenant, quand je l'ajouter ?raw=1 à l'affichage du chemin d'accès d'URL, il utilisera le modèle spécifié à l'intérieur de mon module.

6voto

rinogo Points 1566

Pour les autres utilisateurs susceptibles d'accéder à cette page, si vous travaillez uniquement avec des rappels standard (pas nécessairement des vues), c'est simple. Dans votre fonction de rappel, au lieu de renvoyer le code à restituer dans la page, utilisez la fonction 'print'.

Par exemple:

 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.
}
 

À votre santé!

2voto

Chris Points 63

En supposant que vous êtes dans Drupal 6, la meilleure façon de le faire est de mettre un phptemplate_views_view_unformatted_VIEWNAME appel en template.php (ce qui suppose que votre vue n'est pas formaté - si c'est autre chose, une liste dire, utiliser le thème de la fonction). Thème de l'affichage des résultats dans ce thème de l'appel, puis, au lieu de renvoyer les résultats comme vous le feriez normalement, les imprimer et renvoyer NULL. Ceci affichera le code HTML directement.

PS - assurez-vous de vider votre cache (dans /admin/settings/performance) pour voir ce travail.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X