Question

Je voudrais afficher une vue Drupal sans le modèle de page qui l'entoure normalement - je veux juste le contenu HTML brut des nœuds de la vue.

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

Je m'attendrais à devoir le faire avec plusieurs vues. Une solution qui me permettrait 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. J'ai besoin d'inclure une vue quelque part.

Était-ce utile?

La solution

Je cherchais un moyen d'extraire les données de nœud via ajax. Je proposai la solution suivante pour Drupal 6. Après avoir implémenté les modifications ci-dessous, si vous ajoutez ajax = 1 dans l'URL (par exemple, mysite.com/node/1 ? ajax = 1), vous n'aurez que le contenu et aucune mise en page.

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

function phptemplate_preprocess_page(&$vars) {

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

}

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

<?php print $content; ?>

Autres conseils

D'après 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 de thèmes, 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 le complétez la page comme d'habitude, mais lorsque j'ajoute le paramètre response_type, tel que http://example.com/node/3?response_type = incorporer , je reçois uniquement le <div> contenu de la page afin de l’intégrer dans une autre page.

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. Avec cette solution, vous pouvez charger le modèle directement à partir d’un module personnalisé.

Tout d'abord, j'ai ajouté raw.tpl.php à un nouveau dossier "templates" 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 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, le modèle spécifié est utilisé dans mon module.

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

Salut!

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

- Mise à jour

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

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

1) Téléchargez et installez le pack bonus de Vues ( http://drupal.org/project/views_bonus) 2) Créer un affichage de vues & Quot; Feed & Quot; et utilisez le style " XML " (ou quelque chose que vous pensez correspond mieux à 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 le & Quot; thème & Quot; paramètres pour obtenir des suggestions de noms de modèles alternatifs pour cette vue spécifique (il restera donc la sortie XML par défaut pour une utilisation ultérieure).

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

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 pour afficher les pages de votre choix sans 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, dans D7, le nom_de_votre_thème doit figurer dans le nom de la fonction. 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, a toujours beaucoup de références CSS à l’emballage et au thème. Vous ne savez pas comment afficher des données totalement non considérées ...

En supposant que vous soyez dans Drupal 6, le moyen le plus simple de le faire est de passer un appel phptemplate_views_view_unformatted_VIEWNAME à template.php (en supposant que votre vue n'est pas formatée - si c'est autre chose, indiquez 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 normalement, imprimez-les et renvoyez NULL. Cela affichera directement le code HTML.

PS - assurez-vous de vider votre cache (sous / admin / settings / performance) pour voir le résultat.

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

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

cette méthode autoriserait simplement node.tpl.php à s'afficher (ou n’importe laquelle des vues de formulaire de Drupal, etc ...) et constituerait un moyen simple d’éviter de modifier le noyau ou de modifier le registre de thèmes pour éviter l’affichage. page.tpl.php en premier lieu.

modifier : voir les commentaires

ok, j'ai un peu joué avec les vues, on dirait que cela prend le dessus et construit sa propre & "node.tpl.php &"; (dans un sens) à afficher dans & "; page.tpl.php &"; à première vue, mon instinct serait accroché dans theme_registry_alter().

Lorsque vous consultez une page de vues, vous avez accès aux 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 " 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).

quelques choses:

  • comme je l'ai dit, je ne suis pas sûr si views_ui_list_views est toujours disponible, 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 modifier l'emplacement où drupal recherchera page.tpl.php, au lieu de le renommer complètement)
  • il ne semble pas y avoir d'identifiant pour cette vue spécifique, cette méthode peut donc être un & "toutes les vues seront supprimées &"; approche. si vous avez besoin de masquer le page.tpl.php pour une vue spécifique uniquement, il peut être préférable de s’attacher à template_preprocess_page().

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.

Modifiez ensuite page-VIEWNAME.tpl.php à votre convenance.

http://drupal.org/project/pagearray est une solution générale. ...

De plus, la solution de @Scott Evernden est un trou de sécurité XSS (Cross Site Scripting). Ne fais pas ça. Lisez la documentation sur drupal.org sur la gestion du texte de manière sécurisée http://drupal.org/node/ 28984

Un moyen simple d'afficher le contenu d'un type de contenu spécial que vous souhaitez afficher sans toutes les informations de page.tpl.php:
Ajoutez 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;
    }
}

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

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 - & Quot; fullhtml & Quot; en tant que nom lisible par machine - et créez ensuite un modèle de noeud 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 que ce que vous pouvez faire est en haut de votre page.tpl.php, vérifiez le type de contenu du nœud $ et redistribuez-le s'il est fullhtml. Vous pouvez également définir une variable globale dans le fichier 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 surveillez les diables dans les détails.

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

Sur D7, vous pouvez utiliser menu_execute_active_handler .

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

La réponse de jeroen a été ce qui a bien fonctionné pour moi après avoir joué avec. 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 cela manque à la plupart des débutants.

  2. En fait, j’avais déjà un function MY_THEME_preprocess_page(&$variables) {. Ne recréez pas la fonction alors, 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, je devais donc la mettre à jour également. Encore une fois évident si vous pensez le chercher.

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

Depuis la sortie de Drupal, l'iFrame Core 7.50 est bloqué par défaut pour empêcher le détournement de clics

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é ce qui suit dans template.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top