affichage D'une vue Drupal sans modèle de page
je voudrais afficher une vue Drupal sans le modèle de page qui l'entoure normalement - je veux juste le contenu HTML simple des noeuds de la vue.
cette vue serait incluse dans un autre site non Drupal.
j'attends d'avoir à faire avec un certain nombre de vues, donc une solution qui me permet de définir rapidement et facilement serait le meilleur - je préférerais ne pas avoir à en créer un .tpl.fichier php chaque fois que j'ai besoin d'inclure une vue quelque part.
17 réponses
je cherchais un moyen de tirer des données de noeud via ajax et j'ai trouvé la solution suivante pour Drupal 6. Après avoir implémenté les modifications ci-dessous, si vous ajoutez ajax=1 dans L'URL (par ex. mysite.com/node/1?ajax=1), vous obtiendrez juste le contenu et pas de mise en page.
dans le modèle.fichier php pour votre thème:
function phptemplate_preprocess_page(&$vars) {
if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
$vars['template_file'] = 'page-ajax';
}
}
puis créer page-ajax.tpl.php dans votre répertoire de thème avec ce contenu:
<?php print $content; ?>
basé sur la réponse de Ufonion Labs j'ai été capable de supprimer complètement toute la sortie HTML autour du contenu de la page dans Drupal 7 en implémentant les deux hook_preprocess_page
et hook_preprocess_html
dans mon modèle de thèmes.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';
}
}
puis j'ai ajouté deux gabarits à 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/3, je vois la page complète comme d'habitude, mais lorsque j'ajoute le response_type paramètre, tel que http://example.com/node/3?response_type=embed, j'ai get <div>
avec le contenu de la page pour qu'il puisse être intégré dans une autre page.
je sais que cette question a déjà été répondue, mais je voulais ajouter ma propre solution qui utilise des éléments de la réponse de Philadelphia Web Design (PWD) 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é.
D'abord, j'ai ajouté raw.tpl.php vers un nouveau dossier' templates ' à l'intérieur de mon module. Le contenu de raw.tpl.php sont identiques à la page-ajax de PWD.tpl.php:
<?php print $content; ?>
Suivant, I implémenté hook_preprocess_page dans mon module de la même manière que PWD (sauf que j'ai modifié le paramètre $_GET et mis à jour la référence du fichier de modèle:
function MY_MODULE_NAME_preprocess_page(&$vars) {
if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) {
$vars['template_file'] = 'raw';
}
}
enfin, j'ai implémenté hook_theme_registry_alter pour ajouter le répertoire 'templates' de mon module au registre thématique (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 est-ce que j'ajoute ?raw=1 au chemin de L'URL de la vue, il utilisera le modèle spécifié dans mon module.
pour les autres qui peuvent frapper cette page, si vous travaillez avec des callbacks standards (pas nécessairement des vues), c'est facile. Dans votre fonction de rappel, au lieu de retourner le code à rendre 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.
}
Cheers!
une autre façon de le faire que je trouve très pratique est d'ajouter un élément de menu avec une fonction de rappel de page qui ne renvoie pas de chaîne de caractères:
Exemple:
/**
* 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;
}
-- mise à Jour
Il serait beaucoup mieux d'utiliser exit();
au lieu de return TRUE;
(voir le commentaire).
Hey, voici encore une autre manière de faire:
1) Télécharger et installer Views Bonus Pack (http://drupal.org/project/views_bonus) 2) Créez un affichage de vues "Feed" et utilisez le style "XML" (ou quelque chose que vous pensez mieux adapté à vos besoins). 3) Si vous n'êtes pas satisfait de la sortie XML standard, vous pouvez la modifier en ajustant le modèle pour la vue. Vérifiez les paramètres "theme" pour obtenir des suggestions de noms de template alternatifs pour cette vue spécifique (donc vous ont la sortie XML par défaut gauche pour une utilisation future).
Bonne chance! // Johan Falk, NodeOne, Sweden
Basé sur la réponse de Philadelphie Web Design (merci) et quelques recherches sur google (http://drupal.org/node/957250) voici ce qui a fonctionné pour moi dans Drupal 7 pour obtenir choisi les pages qui s'affichent sans le modèle:
function pixture_reloaded_preprocess_page(&$vars)
{
if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) {
$vars['theme_hook_suggestions'][] = 'page__vlozeno';
}
}
au lieu de phptemplate, en D7 il doit y avoir le nom_of_your_theme dans le nom de la fonction. En outre, j'ai dû mettre deux underscores _ _ _ dans la variable php avec le nom du fichier, mais le nom du fichier template actuel a besoin de deux Dashs --
contenu de la page--vlozeno.tpl.php:
<?php print render($page['content']); ?>
la sortie, cependant, a encore beaucoup d'emballage et de références CSS de theme. Je ne sais pas comment produire des données totalement non-themed...
en supposant que vous êtes dans Drupal 6, la meilleure façon de faire ceci est de mettre un phptemplate_views_view_unformatted_VIEWNAME
appel template.php
(suppose que votre vue n'est pas formatée - si c'est autre chose, une liste dit, Utilisez la fonction thème appropriée). Thème le résultat de la vue dans cet appel de thème alors, au lieu de retourner les résultats comme vous le feriez normalement, imprimez - les et retournez NULL
. Cela affichera le HTML directement.
PS - assurez-vous de vider votre cache (dans /admin/settings/performance) pour voir ce travail.
il y a probablement un certain nombre de façons de contourner cela, cependant, le "plus facile" peut être juste définir votre propre thème personnalisé, et avoir la page.tpl.php juste être vide, ou du hasard divs
// page.tpl.php
<div id="page"><?php print $content ?></div>
cette méthode n'autoriserait que le noeud.tpl.php à afficher (ou l'une des vues de forme de drupal, etc...) et serait un moyen facile d'éviter de modifier core, ou d'avoir à modifier le registre de thème pour éviter d'afficher la page.tpl.php en premier lieu.
modifier: voir les commentaires
ok j'ai joué avec des vues un peu, on dirait qu'il prend le contrôle et construit son propre "noeud.tpl.php" (dans un sens) pour l'affichage dans la page".tpl.php". le premier coup d'œil, mon instinct serait de raccorder theme_registry_alter()
.
lorsque vous regardez une page de vues, vous avez accès à des tas d'informations ici, ainsi qu'à la page.tpl.chemins/fichiers php. en tant que tel, je ferais quelque chose comme:
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';
}
}
ceci devrait vous permettre d'utiliser un "override_page.tpl.php" modèle dans votre thème actuel dans lequel vous pouvez supprimer tout ce que vous voulez (comme ma première réponse ci-dessus).
peu de choses:
- comme je l'ai dit, pas sûr si
views_ui_list_views
est toujours disponible pour vérifier, mais il semble qu'il devrait être réglé si nous regardons une vue - vous pouvez modifier le
theme paths
page
tableau si vous préférez (pour changer l'endroit où drupal cherchera page.tpl.php, au lieu de le renommer tout) - il ne semble pas y avoir d'identificateurs pour cette vue spécifique, donc cette méthode pourrait être une approche "toutes les vues seront dépouillées". si vous avez besoin de bande de la page.tpl.php pour une vue spécifique seulement, peut-être accroché dans
template_preprocess_page()
peut-être une meilleure idée.
Il y a aussi http://drupal.org/project/pagearray qui est une solution générale...
de plus, la solution de @Scott Evernden est un trou de sécurité cross site scripting (XSS). Ne pas le faire. Lire la documentation sur drupal.org sur la façon de gérer le texte de façon sécuritairehttp://drupal.org/node/28984
une façon simple d'afficher le contenu d'un type de contenu spécial que vous souhaitez afficher sans tous les éléments du page.tpl.php
:
Ajouter l'extrait de code suivant à votre template.php
fichier:
function mytheme_preprocess_page(&$vars) {
if ($vars['node'] && arg(2) != 'edit') {
$vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
}
}
Ajouter un page-nodetype-examplecontenttype.tpl.php
pour votre thème, comme votre page.tpl.php
mais sans les choses que vous ne voulez pas afficher et avec print $content
dans le corps.
si je comprends votre question, vous voulez avoir des noeuds qui contiennent tout le HTML pour une page, de DOCTYPE à