Drupalビューを、通常それを囲むページテンプレートなしで表示したい-ビューのノードのプレーンHTMLコンテンツだけが欲しい。
このビューは、Drupal以外の別のサイトに含まれます。
私はこれをいくつかのビューで行う必要があると予想していますので、これらを迅速かつ簡単にセットアップできるソリューションが最善です-必要になるたびに.tpl.phpファイルを作成する必要がないことを望みますどこかにビューを含める。
Ajaxを介してノードデータをプルする方法を探していて、Drupal 6。 .com/node/1?ajax = 1)、ページレイアウトではなくコンテンツのみを取得します。
あなたのテーマのtemplate.phpファイルで:
function phptemplate_preprocess_page(&$vars) {
if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
$vars['template_file'] = 'page-ajax';
}
}
次に、このコンテンツを含むテーマディレクトリにpage-ajax.tpl.phpを作成します。
<?php print $content; ?>
Ufonion Labsの回答に基づいて、Drupal 7の両方でhook_preprocess_page
およびhook_preprocess_html
私のテーマのtemplate.phpで、このように:
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';
}
}
次に、2つのテンプレートをテーマに追加しました:html--embed.tpl.php
:
<?php print $page; ?>
およびpage--embed.tpl.php
:
<?php print render($page['content']); ?>
http://example.com/node/3 などのノードページを開くと、通常どおり完全なページが表示されますが、response_typeパラメータを追加すると、 http://example.com/node/3?response_type=embed 、Ionlyなど<div>
をページのコンテンツと組み合わせて、別のページに埋め込むことができます。
この質問はすでに回答済みですが、フィラデルフィアWebデザイン(PWD)の回答の要素を使用し、オーウェンが提案したhook_theme_registry_alterを使用する独自のソリューションを追加したいと思いました。このソリューションを使用すると、カスタムモジュールから直接テンプレートをロードできます。
まず、モジュール内に新しく作成された「テンプレート」フォルダーにraw.tpl.phpを追加しました。 raw.tpl.phpの内容は、PWDのpage-ajax.tpl.phpと同じです。
<?php print $content; ?>
次に、PWDと同じ方法で自分のモジュールにhook_preprocess_pageを実装しました(ただし、$ _ GETパラメーターを変更し、テンプレートファイル参照を更新しました:
function MY_MODULE_NAME_preprocess_page(&$vars) {
if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) {
$vars['template_file'] = 'raw';
}
}
最後に、hook_theme_registry_alterを実装して、モジュールの「テンプレート」ディレクトリをテーマレジストリに追加しました( http://drupal.org/node/1105922#comment-42657 に基づく):
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');
}
ここで、ビューのURLパスに?raw = 1を追加すると、モジュール内の指定されたテンプレートが使用されます。
このページにアクセスする可能性のある他の人にとって、標準のコールバック(必ずしもビューではない)で作業している場合、これは簡単です。コールバック関数では、ページ内でレンダリングするコードを返す代わりに、 'print'関数を使用します。
例えば:
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.
}
乾杯!
これを実行するもう1つの方法は、文字列を返さないページコールバック関数を含むメニュー項目を追加することです。
例:
_/**
* 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;
}
_
-アップデート
_return TRUE;
_の代わりにexit();
を使用することをお勧めします(コメントを参照)。
フィラデルフィアWebデザインの回答(ありがとう)といくつかのグーグル( http://drupal.org/node/95725 )に基づいて、ここでDrupal 7を選択すると、選択したページがテンプレートなしで表示されます。
function pixture_reloaded_preprocess_page(&$vars)
{
if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) {
$vars['theme_hook_suggestions'][] = 'page__vlozeno';
}
}
phptemplateの代わりに、D7では、関数の名前にname_of_your_themeを含める必要があります。また、php変数にファイル名を含む2つのアンダースコア__を配置する必要がありましたが、実際のテンプレートファイル名には2つのダッシュが必要です-
ページのコンテンツ--vlozeno.tpl.php:
<?php print render($page['content']); ?>
ただし、出力にはまだ多くのラッピングとテーマのCSS参照があります。完全にテーマのないデータを出力する方法がわからない...
ねえ、ここにそれを行う別の方法があります:
1)ビューボーナスパックをダウンロードしてインストールします( http://drupal.org/project/views_bonus )2)ビューディスプレイ「フィード」を作成し、スタイル「XML」を使用します(または、改善が必要です)。 3)標準のXML出力に満足できない場合は、ビューのテンプレートを調整して変更できます。 「テーマ」設定を確認して、この特定のビューの代替テンプレート名の候補を取得します(これにより、デフォルトのXML出力が今後も使用できるようになります)。
幸運を! // Johan Falk、NodeOne、スウェーデン
Drupal 6にいると仮定すると、これを行う最も簡単な方法は、phptemplate_views_view_unformatted_VIEWNAME
呼び戻す template.php
(ビューがフォーマットされていないと仮定します-それが他のものである場合、リストは言う、適切なテーマ関数を使用します)。このテーマ呼び出しでビューの結果にテーマを設定すると、通常のように結果を返すのではなく、結果を印刷してNULL
を返します。これにより、HTMLが直接出力されます。
PS-この作業を確認するには、キャッシュを(/ admin/settings/performanceで)クリアしてください。
page.tpl.php
のすべてのものなしで表示したい特別なコンテンツタイプのコンテンツを表示する簡単な方法:
次のスニペットをtemplate.php
ファイルに追加します:
function mytheme_preprocess_page(&$vars) {
if ($vars['node'] && arg(2) != 'edit') {
$vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
}
}
page-nodetype-examplecontenttype.tpl.php
をpage.tpl.php
のようにテーマに追加しますが、表示したくないものはなく、本文にprint $content
を追加します。
私はDrupalモジュールが好きです。しかし、ここに別の方法があります。
テーマフォルダーのpage.tpl.phpをpage-VIEWNAME.tpl.phpという新しいファイルにコピーします。ここで、VIEWNAMEはコンピューターで読み取り可能なビューの名前です。
次に、page-VIEWNAME.tpl.phpを編集して合わせます。
http://drupal.org/project/pagearray もあり、これは一般的な解決策です...
また、@ Scott Everndenのソリューションは、クロスサイトスクリプティング(XSS)セキュリティホールです。それをしないでください。安全な方法でテキストを処理する方法についてはdrupal.orgのドキュメントを読んでください http://drupal.org/node/28984
これを回避する方法はおそらくいくつかありますが、「最も簡単な方法」は、独自のカスタムテーマを設定し、page.tpl.phpを空にするか、ランダムなdivにすることです。
_// page.tpl.php
<div id="page"><?php print $content ?></div>
_
このメソッドは基本的に、node.tpl.php(またはdrupalのフォームビューなど)の表示を許可するだけで、コアの変更を回避したり、テーマレジストリを変更してpage.tplの表示を回避したりする簡単な方法です。そもそも.php。
編集:コメントを参照
わかりました。少しビューをいじってみました。「page.tpl.php」内に表示するために、ある意味「node.tpl.php」を引き継いで構築しているようです。一見すると、私の直感はtheme_registry_alter()
にフックすることです。
ビューページを表示しているときは、ここにある情報の山や、page.tpl.phpのパス/ファイルにアクセスできます。そのため、私は次のようなことをします:
_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';
}
}
_
これにより、現在のテーマで「override_page.tpl.php」テンプレートを使用して、必要なものをすべて削除できるようになります(上記の最初の回答のように)。
いくつかのこと:
views_ui_list_views
_が常にチェックできるかどうかはわかりませんが、ビューを見ている場合は設定する必要があるようですpage
配列の_theme paths
_を変更できます(場所の場所を変更する場合drupalは、名前を変更する代わりに、page.tpl.phpを探します)それ全体)template_preprocess_page()
にフックする方がよいでしょう。あなたの質問を理解したら、DOCTYPEから</ HTML>までのページのすべてのHTMLを含むノードが必要です。私がやろうとしていることは、それらのノードのコンテンツタイプを作成し(マシンが読み取り可能な名前として "fullhtml")、次にnode-fullhtml.tpl.phpという名前のノードテンプレートを作成することです。 HTMLサニタイズされているため、ノードのコンテンツを単にダンプすることはできません。 node.fullhtml.tpl.phpは文字通りこれだけです:
echo htmlspecialchars_decode($content);
次に、標準のpage.tpl.phpをオーバーライドする方法が必要になります。 I thinkできることは、page.tpl.phpの上部で$ nodeのコンテンツタイプを確認し、それがfullhtmlであるかどうかを確認します。または、page.tpl.phpがチェックするnode-fullhtml.tpl.phpにグローバル変数を設定します。
私はDrupalの専門家ではありませんが、それが私のやり方です。袖口から話しているので、詳細で悪魔に注意してください。
jeroenの答えは、それをいじった後に私に何ができるかでした。 Drupal 7サイトがあります。
まず、_MY_THEME
_をテーマ名に置き換えてください。はい、それは明白ですが、ほとんどの初心者はこれを見逃しています。
私は実際にfunction MY_THEME_preprocess_page(&$variables) {
をすでに持っていました。関数を再作成しないでください。ただし、_}
_で閉じる前に、関数の最後にこのコードを追加してください。
_if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
$variables['theme_hook_suggestions'][] = 'page__embed';
}
_
$vars
_ではなく_$variables
_を使用したため、それも更新する必要がありました。あなたがそれを探すと思うなら、再び明白です。私はあなたがすでに行ってモジュールを作っているので、これはもはや役に立たないかもしれませんが、RSSフィードを公開するビューを取得するのはかなり簡単です。別のサイトに含めるには。
D7では menu_execute_active_handler を使用できます
$build = menu_execute_active_handler('user', FALSE);
return render($build);
最初の回答では、Webブラウザーで呼び出したときにのみノードを表示できました。ただし、これの最終的な目標は、drupalノードをサードパーティのサイトにiframeを使用して埋め込むことです。
Drupal Core 7.50 iframeのリリース以降、デフォルトでクリックジャッキングを防止するためにブロックされます
ノードのみをサードパーティのサイトに正常に埋め込むには、xフレームのデフォルト設定を上書きする必要もあります。 template.phpに以下を追加した後、すべてが機能し始めました
function MY_THEME_page_alter($page) {
if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
header_remove('X-Frame-Options');
}
}