web-dev-qa-db-fra.com

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 veux simplement 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 nécessaire inclure une vue quelque part.

36
ceejayoz

Je cherchais un moyen d'extraire les données des noeuds via ajax et j'ai proposé la solution suivante pour Drupal 6. Après avoir mis en œuvre les modifications ci-dessous, si vous ajoutez ajax = 1 dans l'URL (par exemple, mysite.com/node/1?ajax= 1), vous aurez juste le contenu et pas de mise en page.

dans le fichier template.php pour votre thème:

function phptemplate_preprocess_page(&$vars) {

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

}

puis créez page-ajax.tpl.php dans votre répertoire de thèmes avec ce contenu:

<?php print $content; ?>

Basé sur la réponse de Ufonion Labs, j'ai pu supprimer complètement tout le contenu HTML du contenu de la page dans Drupal 7 en implémentant à la fois hook_preprocess_page et hook_preprocess_html dans mon template.php themes, 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 à mon thème: html--embed.tpl.php:

<?php print $page; ?>

et page--embed.tpl.php:

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

Maintenant, lorsque j'ouvre une page de nœud, telle que http://example.com/node/3 , je vois la page complète comme d'habitude, mais lorsque j'ajoute le paramètre response_type, tel que http: // example.com/node/3?response_type=embed , I only récupère le <div> avec le contenu de la page afin de l'intégrer dans une autre page.

19
jeroen

Je sais que cette question a déjà reçu une réponse, 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é.

Tout d'abord, j'ai ajouté raw.tpl.php à un dossier 'templates' récemment créé dans mon module. Le contenu de raw.tpl.php est identique à celui de PWD page-ajax.tpl.php:

<?php print $content; ?>

Ensuite, j'ai 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 de thèmes (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, lorsque j'ajoute? Raw = 1 au chemin d'URL de la vue, il utilisera le modèle spécifié dans mon module.

7
SwarmIntelligence

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é!

5
rinogo

Une autre façon de le faire que je trouve très pratique consiste à ajouter un élément de menu avec une fonction de rappel de page qui ne renvoie pas de chaîne:

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

-- Mettre à jour

Il serait bien préférable d'utiliser exit(); au lieu de return TRUE; (voir le commentaire).

3
Nabil Kadimi

Basé sur la réponse de Philadelphia Web Design (merci) et sur Google ( http://drupal.org/node/957250 ) voici ce qui a fonctionné pour moi dans Drupal 7 modèle:

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

à la place de phptemplate, dans D7, le nom de la fonction doit être nommé. De plus, je devais mettre deux traits de soulignement __ dans la variable php avec le nom du fichier, mais le nom du fichier de modèle réel nécessite deux tirets -

contenu de la page - vlozeno.tpl.php:

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

La sortie, cependant, contient toujours beaucoup de références CSS pour les wrappers et les thèmes. Vous ne savez pas comment afficher des données totalement non fictives ...

2
Ufonion Labs

Hé, voici encore une autre façon de le faire:

1) Téléchargez et installez Views Bonus Pack ( http://drupal.org/project/views_bonus ) 2) Créez un affichage de Flux pour Views et utilisez le style "XML" 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 "thème" pour obtenir des suggestions de noms de modèles alternatifs pour cette vue spécifique (vous aurez donc encore la sortie XML par défaut pour une utilisation ultérieure).

Bonne chance! // Johan Falk, NodeOne, Suède

2
Itangalo

En supposant que vous vous trouviez dans Drupal 6, le moyen le plus simple de le faire est de placer un appel phptemplate_views_view_unformatted_VIEWNAME dans template.php (en supposant que votre vue n’est pas formatée - si c’est autre chose, une liste, utilisez la fonction de thème appropriée). Thème des résultats de la vue dans cet appel de thème, au lieu de renvoyer les résultats comme d'habitude, imprimez-les et renvoyez NULL. Cela affichera directement le code HTML. 

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

2
Chris

Un moyen simple d’afficher le contenu d’un type de contenu spécial que vous souhaitez afficher sans tout le contenu du page.tpl.php:
Ajoutez l'extrait de code suivant à votre fichier template.php:

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

Ajoutez un page-nodetype-examplecontenttype.tpl.php à votre thème, comme votre page.tpl.php, mais sans les éléments que vous ne voulez pas afficher et avec print $content dans le corps.

1
nerdbabe

J'aime le module Drupal. Mais voici une autre façon.

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

Puis modifiez page-VIEWNAME.tpl.php.

1
xyzzy

Il y a aussi http://drupal.org/project/pagearray qui est une solution générale ...

De plus, la solution de @Scott Evernden est une faille de sécurité XSS (Cross Site Scripting). Ne fais pas ça. Lisez la documentation sur drupal.org sur la façon de gérer le texte de manière sécurisée http://drupal.org/node/28984

1
greggles

il y a probablement plusieurs façons de contourner cela, cependant, le plus "facile" peut être juste de définir votre propre thème personnalisé, et d'avoir le page.tpl.php simplement vide, ou quelques divs aléatoires

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

cette méthode permet en principe simplement d'afficher node.tpl.php (ou n'importe laquelle des vues de formulaire de Drupal, etc.) et constitue un moyen simple d'éviter de modifier le noyau ou de modifier le registre de thèmes afin d'éviter d'afficher page.tpl. .php en premier lieu.

edit : voir les commentaires

ok, j'ai un peu joué avec les vues, on dirait que cela prend le dessus et construit son propre "node.tpl.php" (dans un sens) pour l'affichage dans "page.tpl.php". à première vue, mon instinct serait de me connecter à theme_registry_alter().

lorsque vous consultez une page de vues, vous avez accès à des piles d'informations ici, ainsi qu'aux chemins/fichiers page.tpl.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';        
  }
}

cela devrait vous permettre d'utiliser un modèle "override_page.tpl.php" dans votre thème actuel dans lequel vous pouvez supprimer tout ce que vous voulez (comme ma première réponse ci-dessus).

quelques choses:

  • comme je l'ai dit, je ne suis pas sûr que views_ui_list_views soit toujours disponible pour vérifier, mais il semble que cela devrait être défini si nous regardons une vue
  • vous pouvez modifier le theme paths du tableau page si vous préférez (pour changer l'emplacement où drupal recherchera page.tpl.php, au lieu de le renommer complètement)
  • il ne semble pas exister d'identificateur pour cette vue spécifique; cette méthode peut donc être une approche "toutes les vues seront supprimées". Si vous avez besoin de supprimer le fichier page.tpl.php pour une vue spécifique uniquement, vous pouvez peut-être s’engager dans template_preprocess_page().
1
Owen

Si j'ai bien compris votre question, vous souhaitez que les nœuds contiennent tout le code HTML d'une page, de DOCTYPE à </ HTML>. Ce que je voudrais faire est de créer un type de contenu pour ces nœuds - "fullhtml" en tant que nom lisible par machine, puis de créer un modèle de nœud pour ce nœud appelé node-fullhtml.tpl.php. Vous ne pouvez pas simplement vider le contenu du nœud, car ils ont été nettoyés au format HTML. node.fullhtml.tpl.php serait littéralement ceci:

echo htmlspecialchars_decode($content);

Ensuite, vous aurez besoin d'un moyen de remplacer le standard page.tpl.php. Je pense ce que vous pouvez faire est en haut de votre page.tpl.php, vérifiez le type de contenu du nœud $, et libérez-le s'il est fullhtml. Ou bien, définissez une variable globale dans node-fullhtml.tpl.php que paginerait page.tpl.php.

Je ne suis pas un expert de Drupal, mais c'est comme ça que je le ferais. Je parle au pied levé, alors faites attention aux diables dans les détails.

0
Jim Nelson

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

  1. Tout d’abord, assurez-vous de remplacer MY_THEME par votre nom de thème. Oui, c’est évident, mais la plupart des débutants ne l’ont pas compris.

  2. En fait, j'avais déjà une function MY_THEME_preprocess_page(&$variables) {. Ne recréez pas alors la fonction mais ajoutez ce code à la fin de la fonction avant de la fermer avec }.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. Ma fonction utilisait $vars pas $variables, donc je devais la mettre à jour également. Encore une fois évident si vous pensez le chercher.
0
Wilhelm Stoker

Je vois que vous êtes déjà parti et que vous avez créé un module. Cela ne vous aidera peut-être plus, mais il est assez facile d'obtenir un affichage pour afficher un flux RSS, ce qui peut être un moyen plus facile d'obtenir le contenu, en particulier si vous le souhaitez. pour l'inclure sur un site différent. 

0
Andrew

Sur D7, vous pouvez utiliser menu_execute_active_handler

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

Ma première réponse m'a permis d'afficher le nœud uniquement lorsque je l'ai appelé dans un navigateur Web. Cependant, l'objectif ultime est d'incorporer le nœud drupal dans un site tiers à l'aide d'iframe.

Depuis la sortie de Drupal Core 7.50, iframe est par défaut bloqué pour empêcher le détournement de clic

Pour que seul le nœud soit correctement intégré dans un site tiers, vous devez également remplacer le paramètre par défaut de x-frame. Tout a commencé à fonctionner après avoir ajouté les éléments suivants dans template.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
0
Wilhelm Stoker