Frage

Ich mag eine Drupal-Ansicht ohne die Seitenvorlage anzuzeigen, die es normalerweise umgibt - ich mag nur den einfachen HTML-Inhalt der Knoten Ansicht

.

Diese Ansicht in einer anderen aufgenommen werden würde, nicht-Drupal-Website.

Ich erwarte, dass diese von Ansichten mit einer Zahl zu tun haben, so eine Lösung, die ich diese schnell einrichten läßt und einfach die best wäre - ich würde es vorziehen, nicht eine .tpl.php Datei jedes Mal müssen erstellen ich muss irgendwo eine Ansicht aufgenommen werden.

War es hilfreich?

Lösung

Ich war auf der Suche nach einem Weg, Knotendaten über Ajax und kam mit der folgenden Lösung für Drupal 6. Nach Durchführung der Änderungen unten zu ziehen, wenn Sie Ajax = 1 in der URL hinzufügen (zB mysite.com/node/1 ? ajax = 1), werden Sie nur den Inhalt und kein Seitenlayout erhalten.

in der template.php-Datei für Ihr Thema:

function phptemplate_preprocess_page(&$vars) {

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

}

dann seiten ajax.tpl.php im Theme-Verzeichnis mit folgendem Inhalt erstellen:

<?php print $content; ?>

Andere Tipps

Auf der Grundlage der Antwort von Ufonion Labs ich in der Lage war, um vollständig in Drupal 7 alle die HTML-Ausgabe um den Seiteninhalt zu entfernen, indem beide hook_preprocess_page und hook_preprocess_html in meine Themen Umsetzung template.php, wie folgt aus:

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

Dann habe ich zwei Vorlagen zu meinem Thema: html--embed.tpl.php:

<?php print $page; ?>

und page--embed.tpl.php:

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

Nun, wenn ich einen Knoten Seite zu öffnen, wie http://example.com/node/3 , ich sehe die komplette Seite wie gewohnt, aber wenn ich fügen Sie den response_type Parameter, wie zum Beispiel http://example.com/node/3?response_type = einbetten , I nur die <div> mit dem Seiteninhalt bekommen, so dass es in einer anderen Seite eingebettet werden kann.

Ich weiß, diese Frage wurde bereits beantwortet, aber ich wollte meine eigene Lösung hinzuzufügen, die Elemente von Philadelphia Web Design des (PWD) Antwort verwendet und verwendet hook_theme_registry_alter, wie Owen vorgeschlagen. Mit dieser Lösung können Sie die Vorlage direkt aus einem benutzerdefinierten Modul laden.

Als erstes habe ich in einen neu erstellen ‚Vorlagen‘ Ordner in meinem Modul raw.tpl.php. Der Inhalt raw.tpl.php ist identisch mit PWD Seite-ajax.tpl.php:

<?php print $content; ?>

Als nächstes I umgesetzt hook_preprocess_page in meinem Modul in der gleichen Weise wie PWD (außer, dass ich die $ _GET Parameter geändert und die Vorlagendatei Referenz aktualisiert:

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

Schließlich habe ich umgesetzt hook_theme_registry_alter meine Moduls ‚Vorlagen‘ Verzeichnis zum Thema Registry (basierend auf 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');
}

Nun, wenn ich hinzufügen? Raw = 1 an die URL-Pfad ist die Ansicht, es wird die angegebene Vorlage in meinem Modul verwenden.

Für andere, die diese Seite schlagen können, wenn Sie nur mit Standard-Rückrufe arbeiten (nicht unbedingt Ansichten), das ist einfach. In Ihrer Callback-Funktion, anstatt den Code der Rücksendung innerhalb der Seite zu machen, verwenden Sie die Funktion ‚Drucken‘.

Zum Beispiel:

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!

Eine andere Möglichkeit, es zu tun, was ich sehr praktisch finde, ist ein Menüpunkt mit einer Seite Callback-Funktion hinzuzufügen, die nicht einen String zurückgibt:

Beispiel:

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

- Update

Es wäre viel besser, exit(); statt return TRUE; zu verwenden (siehe Kommentar).

Hey, hier ist noch eine weitere Möglichkeit, es zu tun:

1) Download und Ansichten Bonus Pack ( http://drupal.org/project/views_bonus) 2) Erstellen Sie eine Ansicht Anzeige „Vorschub“ und Verwendung Stil „XML“ (oder etwas, das Sie denken, paßt besser auf Ihre Bedürfnisse). 3) Wenn Sie nicht mit der Standard-XML-Ausgabe zufrieden ist, können Sie es ändern, indem Sie die Vorlage für die Ansicht anpassen. Überprüfen Sie die „Thema“ Einstellungen Vorschläge für alternative Vorlagennamen erhalten für diese spezielle Ansicht (so werden Sie immer noch die Standard-XML-Ausgabe für die zukünftige Verwendung gelassen haben).

Viel Glück! // Johan Falk, NodeOne, Schweden

Basierend auf Antwort von Philadelphia Web Design (vielen Dank) und einigen googeln ( http://drupal.org/node/ 957.250 ) hier ist das, was für mich gearbeitet in Drupal 7 erhalten gewählten Seiten ohne die Vorlage angezeigt:

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

statt phptemplate, in D7 hat dort die name_of_your_theme im Namen der Funktion sein. Außerdem hatte ich zwei Unterstrichen setzen __ in dem PHP-Variable mit dem Dateinamen, aber die tatsächlichen Vorlage Dateinamen muss zwei Striche -

Inhalt der Seite - vlozeno.tpl.php:

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

Der Ausgang hat jedoch noch viel Verpackung und Thema CSS Referenzen einsehen. Nicht sicher, wie total unthemed Daten zur Ausgabe ...

Sie sind in Drupal 6 Angenommen, der einfachste Weg, dies zu tun, ist ein phptemplate_views_view_unformatted_VIEWNAME Anruf in template.php setzt (geht davon aus Ihrer Sicht ist unformatiert - wenn es ist etwas anderes, eine Liste sagen, verwenden Sie die entsprechende Thema Funktion). Thema der Ansicht, die Ergebnisse in diesem Thema Anruf dann anstelle der Rücksendung der Ergebnisse wie gewohnt, sie druckt und das Rück NULL. Dies wird Ausgabe des HTML-Code direkt.

PS -. Sicherstellen, dass Ihr Cache löschen (bei / admin / setting / Leistung), um diese Arbeit zu sehen

gibt es wahrscheinlich eine Reihe von Möglichkeiten, um dies ist, jedoch die „einfachste“ können Sie Ihre eigenen benutzerdefinierten Designs einfach einstellen und die page.tpl.php mit nur leer sein, oder einigen zufälligen divs

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

Dieses Verfahren würde im Grunde erlaubt nur node.tpl.php (oder eine der Drupals Form Ansichten, etc ...) zu zeigen, und würde eine einfache Möglichkeit, seinen Kern zu vermeiden oder zu modifizieren oder mit dem Thema Registry ändern zu vermeiden Anzeige page.tpl.php an erster Stelle.

Bearbeiten : siehe Kommentar

ok Ich spielte mit Blick auf ein bisschen, es sieht aus wie es übernimmt und baut es eigene „node.tpl.php“ ist (in gewissem Sinne) für die Anzeige im „page.tpl.php“. auf den ersten Blick würde mein Bauchgefühl sein, in theme_registry_alter() einzuhaken.

, wenn Sie bei einer Ansicht Seite suchen, haben Sie Zugriff auf Haufen von Informationen hier, sowie die page.tpl.php Pfade / Dateien.

: als solche würde ich so etwas wie tun
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';        
  }
}

Dies sollte Ihnen ermöglichen, eine „override_page.tpl.php“ Vorlage in Ihrem aktuellen Thema zu verwenden, in dem Sie alles entfernen können Sie (wie meine erste Antwort oben) werden soll.

ein paar Dinge:

  • wie gesagt, nicht sicher, ob views_ui_list_views immer verfügbar ist gegen zu überprüfen, aber es klingt wie es gesetzt werden sollte, wenn wir in einer Ansicht
  • freuen
  • können Sie die theme paths des page Array ändern, wenn Sie bevorzugen (die Position, wo Drupal für page.tpl.php aussehen wird sich ändern, statt sie ganz Umbenennung)
  • scheint sich keine Bezeichner für diese bestimmte Ansicht zu sein, so dass diese Methode ein „alle Ansichten abgestreift werden“ Ansatz könnte sein. wenn Sie die page.tpl.php für eine bestimmte Ansicht nur abzustreifen müssen, vielleicht in template_preprocess_page() Einhaken könnte eine bessere Idee.

Ich mag das Drupal-Modul. Aber hier ist eine andere Art und Weise.

Kopie page.tpl.php in Ihrem Theme-Ordner in eine neue Datei namens page-VIEWNAME.tpl.php, wo VIEWNAME ist die maschinen readible Namen der Ansicht.

Dann Editierseite-VIEWNAME.tpl.php entsprechen.

Es wird auch http://drupal.org/project/pagearray , die eine allgemeine Lösung ...

Auch ist @ Scott Evernden-Lösung eine Cross-Site-Scripting (XSS) Sicherheitslücke. Tun Sie das nicht. Lesen Sie die Dokumentation auf drupal.org darüber, wie Text to Handle in einer sicheren Art und Weise http://drupal.org/node/ 28984

Eine einfache Art und Weise Sie Inhalt eines speziellen Inhaltstyp anzeigen möchten, ohne all die Sachen des page.tpl.php anzuzeigen:
Fügen Sie den folgenden Code-Schnipsel in Ihre template.php-Datei:

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

Fügen Sie einen page-nodetype-examplecontenttype.tpl.php zu Ihrem Thema, wie Ihr page.tpl.php aber ohne das Material, das Sie nicht wollen, print $content im Körper zeigen und mit.

Wenn ich Ihre Frage verstehen, wollen Sie Knoten haben, die für eine Seite alle HTML enthalten, von DOCTYPE . Was ich tun würde, ist eine Inhaltstyp für diesen Knoten erstellen - „fullhtml“ als maschinenlesbarer Name - und dann einen Knoten Vorlage erstellen für sie Knoten-fullhtml.tpl.php genannt. Sie können nicht nur den Inhalt des Knoten-Dump, da sie habe HTML-hygienisiert. node.fullhtml.tpl.php würde buchstäblich nur dies:

echo htmlspecialchars_decode($content);

Dann müssen Sie einen Weg, um den Standard page.tpl.php außer Kraft zu setzen. I denken , was Sie tun können, an der Spitze Ihres page.tpl.php ist überprüfen Sie die Art des Inhalts des $ Knoten, und aus der Patsche helfen, wenn es fullhtml ist. Oder stellen Sie eine globale Variable in dem Knoten fullhtml.tpl.php, die für überprüfen würde page.tpl.php.

Ich bin kein Drupal-Experte, aber das ist, wie ich es tun würde. Ich spreche aus dem Stehgreif, so achten Sie auf Teufel im Detail.

Ich sehe, du hast schon wieder weg und machte sich ein Modul, so kann dies nicht mehr helfen, aber es ist ziemlich einfach, eine Ansicht zu bekommen einen RSS-Feed zu belichten, die einen einfacheren Weg, um auf den Inhalt sein könnte, vor allem wenn Sie es auf einem anderen Standort zu schließen.

Auf D7 können Sie verwenden menu_execute_active_handler

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

Jeroen Antwort war, was für mich getan hat, nachdem sie mit ihm spielen. Ich habe eine Drupal 7 Website.

  1. Stellen Sie zunächst sicher, dass Sie MY_THEME mit Ihrem Thema Namen ersetzen. Ja, es ist offensichtlich, aber die meisten Neulinge dies verpassen.

  2. Ich hatte eigentlich schon eine function MY_THEME_preprocess_page(&$variables) {. Setzen Sie die Funktion dann nicht neu, aber diesen Code am Ende der Funktion hinzufügen, bevor Sie es mit } schließen.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. Meine Funktion $vars nicht $variables, also musste ich das auch aktualisieren. Auch hier offensichtlich, wenn man sucht sie denken.

Meine erste antwortete mir erlaubt, nur die Knoten angezeigt, wenn ich es nach oben in einem Web-Browser aufgerufen. Allerdings ist das ultimative Ziel dieser ist der Drupal-Knoten in einer 3rd-Party-Website mit iframe einbinden.

Seit der Veröffentlichung von Drupal -Core 7.50 iframe ist standardmäßig zu verhindern blockiert Clickjacking

Um nur der Knoten, um erfolgreich in einer 3rd-Party-Website einbetten Sie auch die x-Frame-Standardeinstellung außer Kraft setzen müssen. Alles begann zu arbeiten, nachdem ich folgende in template.php

hinzugefügt
function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top