ページテンプレートなしのDrupalビューの表示
-
05-07-2019 - |
質問
通常はそれを囲むページテンプレートなしでDrupalビューを表示したい-ビューのノードのプレーンHTMLコンテンツのみが必要です。
このビューは、Drupal以外の別のサイトに含まれます。
多くのビューでこれを行う必要があると予想されるため、これらを迅速かつ簡単に設定できるソリューションが最適です-毎回.tpl.phpファイルを作成する必要はありませんどこかにビューを含める必要があります。
解決
ajaxを介してノードデータをプルする方法を探していて、Drupal 6の次のソリューションを思いつきました。URLにajax = 1を追加すると(mysite.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の回答に基づいて、テーマtemplate.phpでhook_preprocess_page
とhook_preprocess_html
の両方を次のように実装することで、Drupal 7のページコンテンツのすべてのHTML出力を完全に削除できました。
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; ?>
and page--embed.tpl.php
:
<?php print render($page['content']); ?>
http://example.com/node/3 などのノードページを開くと、通常どおりページを完成させますが、 http://example.com/node/3?response_typeなどのresponse_typeパラメーターを追加すると= embed 、私はのみページのコンテンツで<div>
を取得するので、別のページに埋め込むことができます。
この質問には既に回答済みですが、フィラデルフィアWebデザイン(PWD)の回答の要素を使用し、Owenが提案した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を実装して、モジュールの「templates」ディレクトリをテーマレジストリに追加しました( 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');
}
今、ビューの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.
}
乾杯!
それを行うための非常に便利な別の方法は、文字列を返さないページコールバック関数を使用してメニュー項目を追加することです。
例:
/**
* 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;
}
-更新
exit();
の代わりにreturn TRUE;
を使用することをお勧めします(コメントを参照)。
ねえ、もう一つの方法があります:
1)Views Bonus Packのダウンロードとインストール( http://drupal.org/project/views_bonus) 2)ビュー表示の作成<!> quot; Feed <!> quot;スタイル<!> quot; XML <!> quot;を使用します。 (または、ニーズに合っていると思われるもの)。 3)標準のXML出力に満足できない場合は、ビューのテンプレートを調整して変更できます。 <!> quot; theme <!> quot;を確認してください。この特定のビューの代替テンプレート名の候補を取得するための設定(したがって、今後の使用のためにデフォルトのXML出力が残っています)。
がんばって! // Johan Falk、NodeOne、スウェーデン
フィラデルフィアWebデザイン(ありがとう)といくつかのグーグル( http://drupal.org/node/の回答に基づく957250 )ここで、 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参照があります。完全にテーマのないデータを出力する方法がわからない...
Drupal 6を使用していると仮定すると、これを行う最も簡単な方法は、phptemplate_views_view_unformatted_VIEWNAME
をtemplate.php
に呼び出すことです(ビューがフォーマットされていないことを前提としています-それ以外の場合は、適切なテーマ関数を使用します) )。テーマは、このテーマ呼び出しで結果を表示し、通常どおりに結果を返す代わりに、それらを出力してNULL
を返します。これにより、HTMLが直接出力されます。
PS-この作業を確認するには、(/ admin / settings / performanceで)キャッシュをクリアしてください。
これを回避する方法はおそらくいくつかありますが、<!> quot; easiest <!> quot;独自のカスタムテーマを設定し、page.tpl.phpを空にするか、ランダムなdivにすることもできます
// page.tpl.php
<div id="page"><?php print $content ?></div>
このメソッドは基本的にnode.tpl.phpの表示(またはdrupalのフォームビューなど)を許可するだけで、コアの変更を回避したり、表示を回避するためにテーマレジストリを変更したりするのを避ける簡単な方法です。そもそもpage.tpl.php。
編集:コメントを見る
OKビューを少し試してみましたが、それが引き継いで独自の<!> quot; node.tpl.php <!> quotを構築しているようです。 (ある意味)<!> quot; page.tpl.php <!> quot;内に表示するため。一見すると、私の直感は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';
}
}
これにより、<!> quot; override_page.tpl.php <!> quot;必要なものを削除できる現在のテーマのテンプレート(上記の最初の回答として)。
いくつかのこと:
- 私が言ったように、
views_ui_list_views
が常に確認できるかどうかはわかりませんが、ビューを見ている場合は設定する必要があるようです - 必要に応じて
theme paths
配列のpage
を変更できます(drupalがpage.tpl.phpを探す場所を変更するために、名前をすべて変更するのではなく) - この特定のビューの識別子ではないように見えるため、このメソッドは<!> quot;すべてのビューが削除されます<!> quot;アプローチ。特定のビューのみでpage.tpl.phpを削除する必要がある場合は、おそらく
template_preprocess_page()
にフックすることをお勧めします。
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
:
のすべてを使わずに、表示したい特別なコンテンツタイプのコンテンツを表示する簡単な方法
次のスニペットを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
のようなテーマにprint $content
を追加しますが、表示したくないものはなく、本文に<=>を追加します。
質問を理解したら、DOCTYPEから<!> lt; / HTML <!> gt;まで、ページのすべてのHTMLを含むノードが必要です。私がすることは、これらのノードのコンテンツタイプを作成することです-<!> quot; fullhtml <!> quot;機械可読な名前として-そして、node-fullhtml.tpl.phpという名前のノードテンプレートを作成します。 HTMLサニタイズされているため、ノードのコンテンツを単にダンプすることはできません。 node.fullhtml.tpl.phpは文字通りこれだけになります:
echo htmlspecialchars_decode($content);
次に、標準のpage.tpl.phpをオーバーライドする方法が必要になります。私はあなたのできることを考えるあなたのpage.tpl.phpの上部で$ nodeのコンテンツタイプをチェックし、それがfullhtmlである場合は救済します。または、page.tpl.phpがチェックするnode-fullhtml.tpl.phpでグローバル変数を設定します。
私はDrupalの専門家ではありませんが、そういう風にやっています。カフスについて話しているので、詳細については悪魔に注意してください。
あなたはすでに行ってモジュールを作っているので、これはもう役に立たないかもしれませんが、rssフィードを公開するビューを取得するのはかなり簡単です。別のサイトに含める場合。
D7では、 menu_execute_active_handler を使用できます。
$build = menu_execute_active_handler('user', FALSE);
return render($build);
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
を使用したため、同様に更新する必要がありました。あなたがそれを探すと思うならば、再び明白です。
最初に答えたので、Webブラウザで呼び出したときにのみノードを表示できました。ただし、これの最終的な目標は、iframeを使用してdrupalノードをサードパーティのサイトに埋め込むことです。
Drupalのリリースコア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');
}
}