Anzeigen um eine Drupal-Ansicht ohne Seitenvorlage
-
05-07-2019 - |
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.
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 tunfunction 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
despage
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