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.

36
demandé sur ceejayoz 2008-10-29 21:57:54

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; ?>
49
répondu 2009-03-04 05:31:43

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.

19
répondu jeroen 2011-12-06 08:17:45

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.

7
répondu SwarmIntelligence 2012-08-10 20:01:23

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!

5
répondu rinogo 2009-06-11 00:49:58

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

3
répondu Nabil Kadimi 2013-10-11 18:09:27

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

2
répondu Itangalo 2010-03-15 20:05:33

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

2
répondu Ufonion Labs 2011-02-07 18:28:03

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.

2
répondu Chris 2012-08-15 17:32:40

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 pathspage 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.
1
répondu Owen 2008-10-29 20:30:37

j'aime le module Drupal. Mais, voici un autre moyen.

une copie de la page.tpl.php dans votre dossier de thème Vers un nouveau fichier appelé page-VIEWNAME.tpl.php, où VIEWNAME est le nom lisible par la machine de la vue.

puis éditer page-VIEWNAME.tpl.php pour convenir.

1
répondu 2008-12-03 20:16:05

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

1
répondu greggles 2009-04-23 01:16:28

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.

1
répondu nerdbabe 2012-01-23 06:21:22

si je comprends votre question, vous voulez avoir des noeuds qui contiennent tout le HTML pour une page, de DOCTYPE à . Ce que je ferais est de créer un type de contenu pour ces noeuds -- "fullhtml" comme son nom lisible par la machine -- et puis de créer un modèle de noeud pour lui appelé noeud-fullhtml.tpl.php. Vous ne pouvez pas simplement vider le contenu du noeud, car ils ont été assainis par HTML. nœud.fullhtml.tpl.php serait littéralement juste ceci:

echo htmlspecialchars_decode($content);

alors vous aurez besoin d'un moyen pour outrepasser le page standard.tpl.php. J' penser ce que vous pouvez faire est en haut de votre page.tpl.php vérifiez le type de contenu du noeud$, et sautez si c'est fullhtml. Ou, définissez une variable globale dans node-fullhtml.tpl.php cette page.tpl.php serait de vérifier pour.

Je ne suis pas un expert Drupal, mais c'est comme ça que je le ferais. Je parle en improvisant, alors attention pour les diables dans les détails.

0
répondu Jim Nelson 2008-10-30 00:35:27

je vois que vous êtes déjà parti et vous avez fait un module, donc cela ne peut plus aider, mais il est assez facile d'obtenir une vue pour exposer un flux rss, ce qui pourrait être un moyen plus facile d'obtenir le contenu, surtout si vous voulez l'inclure sur un autre site.

0
répondu Andrew 2009-01-10 08:32:40

sur D7 vous pouvez utiliser menu_execute_active_handler

$build = menu_execute_active_handler('user', FALSE);
return render($build);
0
répondu Alan Bondarchuk 2014-08-27 02:30:53

la réponse de jeroen était ce qui a fait pour moi après avoir joué avec. J'ai un site Drupal 7 site.

  1. tout d'Abord assurez-vous de remplacer MY_THEME avec votre nom de thème. Oui, c'est évident, mais cela manque à la plupart des débutants.

  2. j'ai effectivement déjà eu un function MY_THEME_preprocess_page(&$variables) {. Ne pas recréer la fonction, mais d'ajouter ce code à la fin de la fonction avant de le fermer avec }.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. mon fonction utilisée $vars$variables, donc j'ai dû mettre à jour ça aussi. Encore une fois évident si vous pensez le chercher.
0
répondu Wilhelm Stoker 2018-08-01 08:12:18

Ma première répondu m'a permis de n'afficher que le nœud lorsque je l'ai appelé dans un navigateur web. Cependant le but ultime de ceci est d'intégrer le noeud drupal dans un site tiers en utilisant iframe.

Depuis la sortie de Drupal Core 7.50 iframe est par défaut bloqué afin d'empêcher le détournement de clics

pour obtenir seulement le noeud pour s'intégrer avec succès dans un site tiers, vous devez aussi Outrepasser le paramètre par défaut de X-frame. Tout a commencé à travailler après je a ajouté ce qui suit dans le modèle.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
0
répondu Wilhelm Stoker 2018-08-02 10:15:20