web-dev-qa-db-de.com

anzeigen einer Drupal-Ansicht ohne Seitenvorlage

Ich möchte eine Drupal-Ansicht ohne die Seitenvorlage anzeigen, die sie normalerweise umgibt. Ich möchte nur den einfachen HTML-Inhalt der Ansichtsknoten.

Diese Ansicht wird in eine andere Nicht-Drupal-Site aufgenommen.

Ich erwarte, dies mit einer Reihe von Ansichten tun zu müssen. Daher wäre eine Lösung, mit der ich diese schnell und einfach einrichten kann, die beste - ich würde es vorziehen, nicht jedes Mal eine .tpl.php-Datei erstellen zu müssen, wenn ich muss irgendwo eine Ansicht einschließen.

36
ceejayoz

Ich habe nach einer Möglichkeit gesucht, Knotendaten über ajax abzurufen, und habe die folgende Lösung für Drupal 6 gefunden. Wenn Sie die folgenden Änderungen implementiert haben, fügen Sie ajax = 1 in die URL ein (z. B. mysite.com/node/1?ajax= 1) erhalten Sie nur den Inhalt und kein Seitenlayout.

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

function phptemplate_preprocess_page(&$vars) {

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

}

dann erstellen Sie page-ajax.tpl.php in Ihrem Design-Verzeichnis mit folgendem Inhalt:

<?php print $content; ?>

Basierend auf der Antwort von Ufonion Labs konnte ich die gesamte HTML-Ausgabe rund um den Seiteninhalt in Drupal 7 vollständig entfernen, indem ich hook_preprocess_page und hook_preprocess_html in meinen Themen template.php wie folgt implementiere:

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 fügte ich meinem Design zwei Vorlagen hinzu: html--embed.tpl.php:

<?php print $page; ?>

und page--embed.tpl.php:

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

Wenn ich jetzt eine Knotenseite öffne, wie zum Beispiel http://example.com/node/3 , sehe ich die gesamte Seite wie gewohnt, aber wenn ich den Parameter response_type hinzufüge, wie http: // example.com/node/3?response_type=embed , I only ruft den <div> mit dem Seiteninhalt ab, damit er in eine andere Seite eingebettet werden kann.

19
jeroen

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

Zuerst habe ich raw.tpl.php zu einem neu erstellten "template" -Ordner in meinem Modul hinzugefügt. Der Inhalt von raw.tpl.php ist identisch mit PWDs page-ajax.tpl.php:

<?php print $content; ?>

Als Nächstes habe ich hook_preprocess_page in der gleichen Weise wie PWD in meinem Modul implementiert (mit der Ausnahme, dass ich den Parameter $ _GET geändert und die Vorlagendateireferenz aktualisiert habe:

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

Schließlich habe ich hook_theme_registry_alter implementiert, um das Verzeichnis "templates" meines Moduls zur Design-Registry hinzuzufügen (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');
}

Wenn ich nun dem URL-Pfad der Ansicht? Raw = 1 hinzufüge, wird die angegebene Vorlage in meinem Modul verwendet.

7

Für andere, die diese Seite besuchen, ist dies einfach, wenn Sie nur mit Standard-Rückrufen (nicht unbedingt mit Ansichten) arbeiten. Verwenden Sie in Ihrer Rückruffunktion die Funktion "Drucken", anstatt den Code zurückzugeben, der auf der Seite dargestellt werden soll.

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

Prost!

5
rinogo

Eine andere Möglichkeit, die ich sehr praktisch finde, ist das Hinzufügen eines Menüelements mit einer Seitenrückruffunktion, die keinen 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;
}    

- Aktualisieren

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

3
Nabil Kadimi

Basierend auf der Antwort von Philadelphia Web Design (Dankeschön) und ein wenig googeln ( http://drupal.org/node/957250 ) hier ist das, was für mich in Drupal 7 funktionierte, um die ausgewählten Seiten ohne anzuzeigen Vorlage:

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

anstelle von phptemplate muss in D7 der name_of_your_theme im Namen der Funktion stehen. Ich musste auch zwei Unterstriche __ in die PHP-Variable mit dem Dateinamen einfügen, aber der eigentliche Vorlagendateiname benötigt zwei Bindestriche -

inhalt der Seite - vlozeno.tpl.php:

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

Die Ausgabe hat jedoch immer noch viele Wrapping- und CSS-Referenzen. Sie sind sich nicht sicher, wie sie völlig ungedeckte Daten ausgeben sollen ...

2
Ufonion Labs

Hey, hier ist noch eine andere Möglichkeit:

1) Laden Sie das Bonus-Pack für Ansichten herunter und installieren Sie es ( http://drupal.org/project/views_bonus ) 2) Erstellen Sie eine Ansicht mit "Feed" und verwenden Sie den Stil "XML" (oder etwas, das Ihrer Meinung nach zu Ihnen passt needs better) . 3) Wenn Sie mit der XML-Standardausgabe nicht zufrieden sind, können Sie sie ändern, indem Sie die Vorlage für die Ansicht anpassen. Überprüfen Sie die "Design" -Einstellungen, um Vorschläge für alternative Vorlagennamen für diese bestimmte Ansicht zu erhalten (damit Sie die Standard-XML-Ausgabe für die zukünftige Verwendung behalten können).

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

2
Itangalo

Angenommen, Sie befinden sich in Drupal 6, ist der einfachste Weg, dies zu tun, indem Sie einen phptemplate_views_view_unformatted_VIEWNAME-Aufruf in template.php eingeben (vorausgesetzt, Ihre Ansicht ist nicht formatiert. Wenn es etwas anderes ist, sagen eine Liste, verwenden Sie die entsprechende Designfunktion). Die Ansichtsergebnisse in diesem Themenaufruf dann als Thema ausgeben, anstatt die Ergebnisse wie üblich zurückzugeben, drucken Sie sie aus und geben Sie NULL zurück. Dadurch wird der HTML-Code direkt ausgegeben. 

PS - Stellen Sie sicher, dass Sie Ihren Cache (unter/admin/settings/performance) löschen, um diese Arbeit zu sehen.

2
Chris

Eine einfache Methode zum Anzeigen von Inhalten eines speziellen Inhaltstyps, den Sie anzeigen möchten, ohne den gesamten Inhalt des page.tpl.php:
.__ Fügen Sie Ihrer template.php-Datei das folgende Snippet hinzu:

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

Fügen Sie Ihrem Design einen page-nodetype-examplecontenttype.tpl.php hinzu, wie Ihren page.tpl.php, jedoch ohne das Material, das Sie nicht anzeigen möchten, und mit print $content im Hauptteil.

1
nerdbabe

Ich mag das Drupal-Modul. Aber hier ist ein anderer Weg.

kopieren Sie page.tpl.php in Ihrem Designordner in eine neue Datei namens page-VIEWNAME.tpl.php, wobei VIEWNAME der maschinenlesbare Name der Ansicht ist.

Bearbeiten Sie dann page-VIEWNAME.tpl.php entsprechend.

1
xyzzy

Es gibt auch http://drupal.org/project/pagearray , was eine allgemeine Lösung ist ...

Die Lösung von @Scott Evernden ist eine Sicherheitslücke im Cross Site Scripting (XSS). Tu das nicht Lesen Sie die Dokumentation auf drupal.org zum sicheren Umgang mit Text http://drupal.org/node/28984

1
greggles

es gibt wahrscheinlich eine Reihe von Möglichkeiten, um dies zu erreichen. Die "einfachste" Einstellung kann jedoch sein, dass Sie nur Ihr eigenes benutzerdefiniertes Design festlegen und "page.tpl.php" leer sein müssen oder einige zufällige Divs haben

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

diese Methode würde im Wesentlichen nur das Anzeigen von node.tpl.php (oder einer der Formularansichten von drupal usw.) ermöglichen und wäre eine einfache Möglichkeit, das Modifizieren des Kerns zu vermeiden oder die Designregistrierung ändern zu müssen, um die Anzeige von page.tpl zu vermeiden .php an erster Stelle.

edit : siehe Kommentare

oK, ich habe ein bisschen mit Ansichten rumgespielt, es sieht so aus, als ob es die eigene "node.tpl.php" (in gewissem Sinne) für die Anzeige in "page.tpl.php" übernimmt. auf den ersten blick wäre mein inneres gefühl, mich in theme_registry_alter() einzuhaken.

wenn Sie sich eine Ansichtsseite ansehen, haben Sie hier Zugriff auf Informationsstapel sowie auf die Pfade/Dateien page.tpl.php. Als solches würde ich so etwas 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 es Ihnen ermöglichen, eine Vorlage "override_page.tpl.php" in Ihrem aktuellen Design zu verwenden, in der Sie alles entfernen können, was Sie möchten (als meine erste Antwort oben).

ein paar Dinge:

  • wie gesagt, nicht sicher, ob views_ui_list_views immer zur Überprüfung verfügbar ist, aber es klingt so, als müsste es eingestellt werden, wenn wir eine Ansicht betrachten
  • sie können den theme paths des page-Arrays ändern, wenn Sie möchten (um den Speicherort zu ändern, in dem drupal nach page.tpl.php sucht, anstatt es vollständig umzubenennen)
  • es scheint keine Bezeichner für diese bestimmte Ansicht zu geben, daher könnte es sich bei dieser Methode um einen Ansatz handeln, bei dem "alle Ansichten entfernt werden". Wenn Sie die page.tpl.php-Datei nur für eine bestimmte Ansicht entfernen möchten, ist das Einhängen in template_preprocess_page() möglicherweise eine bessere Idee.
1
Owen

Wenn ich Ihre Frage verstehe, möchten Sie Knoten haben, die den gesamten HTML-Code einer Seite enthalten, von DOCTYPE bis </ HTML>. Was ich tun würde, ist, einen Inhaltstyp für diese Knoten zu erstellen - "fullhtml" als seinen maschinenlesbaren Namen - und dann eine Knotenvorlage mit dem Namen "node-fullhtml.tpl.php" zu erstellen. Sie können nicht einfach den Inhalt des Knotens ausgeben, da er durch HTML bereinigt wurde. node.fullhtml.tpl.php wäre wörtlich genau das:

echo htmlspecialchars_decode($content);

Dann benötigen Sie eine Möglichkeit, die standard page.tpl.php außer Kraft zu setzen. Ich denke was Sie tun können, ist oben in Ihrer page.tpl.php den Inhaltstyp des $ -Nodes zu überprüfen und zu retten, wenn es sich um fullhtml handelt. Oder legen Sie eine globale Variable in node-fullhtml.tpl.php fest, nach der page.tpl.php suchen würde.

Ich bin kein Drupal-Experte, aber so würde ich es tun. Ich spreche von der Manschette, achten Sie also auf die Details der Teufel.

0
Jim Nelson

jeroens Antwort war, was ich nach dem Spielen damit gemacht hatte. Ich habe eine Drupal 7-Site. 

  1. Stellen Sie zunächst sicher, dass Sie MY_THEME durch Ihren Designnamen ersetzen. Ja, es ist offensichtlich, aber die meisten Neulinge vermissen dies.

  2. Ich hatte eigentlich schon eine function MY_THEME_preprocess_page(&$variables) {. Erstellen Sie die Funktion nicht neu, sondern fügen Sie diesen Code am Ende der Funktion hinzu, bevor Sie sie mit } schließen.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. Meine Funktion verwendete $vars nicht $variables, daher musste ich das auch aktualisieren. Wieder offensichtlich, wenn Sie denken, suchen Sie danach.
0
Wilhelm Stoker

Ich sehe, dass Sie bereits ein Modul erstellt haben, so dass dies möglicherweise nicht mehr hilfreich ist, aber es ist ziemlich einfach, einen RSS-Feed zu veröffentlichen, der eine einfachere Möglichkeit darstellt, auf den Inhalt zuzugreifen, insbesondere wenn Sie möchten um es auf einer anderen Seite aufzunehmen. 

0
Andrew

Auf D7 können Sie menu_execute_active_handler verwenden.

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

Meine erste Antwort erlaubte mir, den Knoten nur anzuzeigen, wenn ich ihn in einem Webbrowser aufrief. Das ultimative Ziel dabei ist jedoch, den Drupal-Knoten mittels iframe in eine Drittanbieter-Site einzubetten.

Seit der Veröffentlichung von Drupal Core 7.50 ist der iframe standardmäßig gesperrt, um Clickjacking zu verhindern

Damit nur der Knoten erfolgreich in eine Drittanbieter-Site eingebettet werden kann, müssen Sie auch die Standardeinstellung für x-frame überschreiben. Alles fing an zu funktionieren, nachdem ich in template.php folgendes hinzugefügt hatte

function MY_THEME_page_alter($page) {

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