39

通常はそれを囲むページ テンプレートなしで Drupal ビューを表示したいと思います。ビューのノードのプレーンな HTML コンテンツだけが必要です。

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

多数のビューでこれを行う必要があると予想されるため、これらを迅速かつ簡単に設定できるソリューションが最適です。必要なたびに .tpl.php ファイルを作成する必要はありません。ビューをどこかに含めます。

4

17 に答える 17

51

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; ?>
于 2009-03-04T05:31:43.887 に答える
21

Ufonion Labs の回答に基づいて、Drupal 7 のページ コンテンツ周辺のすべての HTML 出力を完全に削除することができましhook_preprocess_pagehook_preprocess_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; ?>

page--embed.tpl.php:

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

http://example.com/node/3などのノード ページを開くと、通常どおり完全なページが表示されますが、http://example.com/node/などの response_type パラメータを追加すると、 3?response_type=embed、別のページに埋め込むことができるように、ページのコンテンツのみを取得します。<div>

于 2011-12-06T08:17:45.603 に答える
7

この質問はすでに回答されていることは知っていますが、Owen が提案したように、Philadelphia Web Design (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-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 を追加すると、モジュール内で指定されたテンプレートが使用されます。

于 2012-08-10T20:01:23.580 に答える
6

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

乾杯!

于 2009-06-11T00:49:58.627 に答える
3

私が非常に便利だと思う別の方法は、文字列を返さないページコールバック関数を使用してメニュー項目を追加することです。

例:

/**
 * 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;
}    

- アップデート

It would be much better to use exit(); instead of return TRUE; (see comment).

于 2012-01-11T16:39:21.280 に答える
2

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

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

于 2008-10-29T23:15:02.100 に答える
2

Philadelphia Web Design (感謝) の回答といくつかのグーグル ( 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 参照があります。まったくテーマのないデータを出力する方法がわからない...

于 2011-02-07T18:28:03.270 に答える
2

ねえ、これはそれを行うさらに別の方法です:

1) ビュー ボーナス パック ( http://drupal.org/project/views_bonus ) をダウンロードしてインストールします。3) 標準の XML 出力に満足できない場合は、ビューのテンプレートを調整して変更できます。「テーマ」設定を確認して、この特定のビューの代替テンプレート名の候補を取得します (将来の使用のためにデフォルトの XML 出力が残されます)。

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

于 2010-03-15T20:05:33.940 に答える
1

のすべてのものなしで表示したい特別なコンテンツタイプのコンテンツを表示する簡単な方法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あなたのようにテーマに a を追加しますpage.tpl.phpが、表示したくないものはなくprint $content、本文に入れます。

于 2010-01-14T17:02:27.523 に答える
1

おそらくこれにはいくつかの方法がありますが、「最も簡単な」方法は、独自のカスタムテーマを設定し、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常にチェックできるかどうかはわかりませんが、ビューを見ている場合は設定する必要があるようです
  • 必要に応じてtheme pathspage配列の を変更できます (名前を完全に変更するのではなく、drupal が page.tpl.php を検索する場所を変更するため)。
  • この特定のビューには識別子がないように見えるため、この方法は「すべてのビューが削除される」アプローチである可能性があります。特定のビューだけのために page.tpl.php を削除する必要がある場合は、おそらくフックtemplate_preprocess_page()する方がよいでしょう。
于 2008-10-29T19:11:39.500 に答える
1

一般的なソリューションであるhttp://drupal.org/project/pagearrayもあります...

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

于 2009-04-23T01:16:28.090 に答える
1

Drupal モジュールが気に入っています。しかし、ここに別の方法があります。

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

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

于 2008-12-03T20:16:05.900 に答える
0

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

于 2009-01-10T08:32:40.163 に答える
0

あなたの質問が理解できれば、DOCTYPE から </HTML> まで、ページのすべての HTML を含むノードが必要です。私なら、これらのノードのコンテンツ タイプを作成し (機械可読な名前として「fullhtml」)、node-fullhtml.tpl.php という名前のノード テンプレートを作成します。ノードのコンテンツは HTML でサニタイズされているため、そのままダンプすることはできません。node.fullhtml.tpl.php は、文字通り次のようになります。

echo htmlspecialchars_decode($content);

次に、標準の page.tpl.php をオーバーライドする方法が必要になります。あなたができることはあなたのページの上部にあると思います.tpl.phpは$nodeのコンテンツタイプをチェックし、それがfullhtmlであれば救済します。または、page.tpl.php がチェックするグローバル変数を node-fullhtml.tpl.php に設定します。

私は Drupal の専門家ではありませんが、それが私のやり方です。私はカフスから離れて話しているので、詳細に悪魔がいることに気をつけてください.

于 2008-10-29T19:27:20.780 に答える