web-dev-qa-db-ja.com

Drupalビューを表示し、周囲にページテンプレートがない

Drupalビューを、通常それを囲むページテンプレートなしで表示したい-ビューのノードのプレーンHTMLコンテンツだけが欲しい。

このビューは、Drupal以外の別のサイトに含まれます。

私はこれをいくつかのビューで行う必要があると予想していますので、これらを迅速かつ簡単にセットアップできるソリューションが最善です-必要になるたびに.tpl.phpファイルを作成する必要がないことを望みますどこかにビューを含める。

36
ceejayoz

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>をページのコンテンツと組み合わせて、別のページに埋め込むことができます。

19
jeroen

この質問はすでに回答済みですが、フィラデルフィア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を追加すると、モジュール内の指定されたテンプレートが使用されます。

7

このページにアクセスする可能性のある他の人にとって、標準のコールバック(必ずしもビューではない)で作業している場合、これは簡単です。コールバック関数では、ページ内でレンダリングするコードを返す代わりに、 '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.
}

乾杯!

5
rinogo

これを実行するもう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();を使用することをお勧めします(コメントを参照)。

3
Nabil Kadimi

フィラデルフィア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参照があります。完全にテーマのないデータを出力する方法がわからない...

2
Ufonion Labs

ねえ、ここにそれを行う別の方法があります:

1)ビューボーナスパックをダウンロードしてインストールします( http://drupal.org/project/views_bonus )2)ビューディスプレイ「フィード」を作成し、スタイル「XML」を使用します(または、改善が必要です)。 3)標準のXML出力に満足できない場合は、ビューのテンプレートを調整して変更できます。 「テーマ」設定を確認して、この特定のビューの代替テンプレート名の候補を取得します(これにより、デフォルトのXML出力が今後も使用できるようになります)。

幸運を! // Johan Falk、NodeOne、スウェーデン

2
Itangalo

Drupal 6にいると仮定すると、これを行う最も簡単な方法は、phptemplate_views_view_unformatted_VIEWNAME 呼び戻す template.php(ビューがフォーマットされていないと仮定します-それが他のものである場合、リストは言う、適切なテーマ関数を使用します)。このテーマ呼び出しでビューの結果にテーマを設定すると、通常のように結果を返すのではなく、結果を印刷してNULLを返します。これにより、HTMLが直接出力されます。

PS-この作業を確認するには、キャッシュを(/ admin/settings/performanceで)クリアしてください。

2
Chris

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.phppage.tpl.phpのようにテーマに追加しますが、表示したくないものはなく、本文にprint $contentを追加します。

1
nerdbabe

私はDrupalモジュールが好きです。しかし、ここに別の方法があります。

テーマフォルダーのpage.tpl.phpをpage-VIEWNAME.tpl.phpという新しいファイルにコピーします。ここで、VIEWNAMEはコンピューターで読み取り可能なビューの名前です。

次に、page-VIEWNAME.tpl.phpを編集して合わせます。

1
xyzzy

http://drupal.org/project/pagearray もあり、これは一般的な解決策です...

また、@ Scott Everndenのソリューションは、クロスサイトスクリプティング(XSS)セキュリティホールです。それをしないでください。安全な方法でテキストを処理する方法についてはdrupal.orgのドキュメントを読んでください http://drupal.org/node/28984

1
greggles

これを回避する方法はおそらくいくつかありますが、「最も簡単な方法」は、独自のカスタムテーマを設定し、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を探します)それ全体)
  • この特定のビューには識別子がないように見えるため、このメソッドは「すべてのビューが削除される」アプローチである可能性があります。特定のビューのみのpage.tpl.phpを削除する必要がある場合は、おそらくtemplate_preprocess_page()にフックする方がよいでしょう。
1
Owen

あなたの質問を理解したら、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の専門家ではありませんが、それが私のやり方です。袖口から話しているので、詳細で悪魔に注意してください。

0
Jim Nelson

jeroenの答えは、それをいじった後に私に何ができるかでした。 Drupal 7サイトがあります。

  1. まず、_MY_THEME_をテーマ名に置き換えてください。はい、それは明白ですが、ほとんどの初心者はこれを見逃しています。

  2. 私は実際にfunction MY_THEME_preprocess_page(&$variables) {をすでに持っていました。関数を再作成しないでください。ただし、_}_で閉じる前に、関数の最後にこのコードを追加してください。


_if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
_
  1. 私の関数は_$vars_ではなく_$variables_を使用したため、それも更新する必要がありました。あなたがそれを探すと思うなら、再び明白です。
0
Wilhelm Stoker

私はあなたがすでに行ってモジュールを作っているので、これはもはや役に立たないかもしれませんが、RSSフィードを公開するビューを取得するのはかなり簡単です。別のサイトに含めるには。

0
Andrew

D7では menu_execute_active_handler を使用できます

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

最初の回答では、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');
 } 
}
0
Wilhelm Stoker