CocoaSpace

Drupalでウェブサイト構築

Views2のviewを任意の位置にエンベッド

Sep 03 2009
Drupalバージョン: 
モジュール: 

Views2のviewをページの中の任意の位置に表示できたらいいですね。Panelsモジュールを使っても、こういうことはできそうですが、Panelsがなくても簡単にできてしまいます。

用途としては、例えばフロントページに任意のviewを複数表示させ、サイト内で起こっていることをユーザに効率よく伝えることなどが考えられます。テーマ側でブロックを作成しなくても、テーマのpage-front.tpl.phpやnode.tpl.phpファイルにコードを挿入するだけで同じことができてしまいます。

肝心の方法ですが、以下のページなどを参考にさせていただきました。Drupal5.xでの方法にも若干触れられているので、5.xのユーザは参考にしてください。

http://pedroposada.com/blog/embed-views-2-nodes.html (英語)

*記事の中のリンク先にもさまざまな方法があるので、そちらもチェック。

http://www.pixelclever.com/how-programmatically-insert-a-view-drupal-6 (英語)

JQuery Menuモジュールなどの作者、Aaron Hawkinsさんのサイト。

私が実際に利用している方法を書きますと、node.tpl.phpのviewを表示させたい位置に、上記のpedroposada.comを参考に以下のコード挿入しました。

<?php print views_embed_view($view_name, $display_id, $arg1, $arg2); ?>

*$view_nameをご自分のView nameに変更してください。

*2番目のパラメターの$display_idは少々わかりにくいかもしれません。上記のpixelclever.comのページで説明されているように、Viewsのエクスポートで画面で

$handler = $view->new_display('page', 'Page', 'page_1');

のようなコードを探し、括弧の中の3番目の値、つまりこの場合page_1を$display_idとして使用します。ご自分の作成されたviewに合わせて変更してください。

2009年10月20日 追記: page.tpl.php(或いはpage-[custom].tpl.php)に上記のスニペットを挿入すると、管理権限を持ったユーザにだけ表示される管理用のhover linksがマウスをホバーしなくても表示されるようになります。昨日CocoaSpaceのフロントページを変更しましたが、Viewをエンベッドしたときにようやく気づきました。admin/build/views/toolsで『Do not show hover links over views』という項目にチェックを入れれば常時表示されなくなりますが、必要なときにマウス・ホバーしてもリンクが表示されなくなってしまいます。そこでdrupal.orgで解決法を調べていたら、次のページがありました。

Post access counter removes default views.css link from header if "view post access counter" is not set. | drupal.org

Drupalがページを表示する際、CSSファイルを読み込んだ後にpage.tpl.phpを読み込むため、Viewsに必要なCSSファイルを読み込まずにページが表示されるようです。ですので、使用しているテーマのtemplate.phpにコメント#10のようなコードを加えることで解決します。

Viewsのhover linksは本来、マウスをホバーしたときにだけ表示されます。(申し訳ありません。マウスのカーソルが表示されていません。)Viewsのhover linksは本来、マウスをホバーしたときにだけ表示されます。(申し訳ありません。マウスのカーソルが表示されていません。)

必要なCSSファイルがロードされていないため、リンクが常に表示されています。必要なCSSファイルがロードされていないため、リンクが常に表示されています。

なお、同じページにエンベッドしていないViewがあれば、必要なCSSが既に読み込まれているため、この問題は発生しないようです。

2009年12月30日 追記: 上の方法より良い方法を見つけました。非常に簡単なもので、今までなぜ試してみなかったのかと思うような方法です。drupal.orgの下記のページが参考になります。

How to call VR block manually? | drupal.org

STEP 1: まず、ご使用のテーマのtemplate.phpファイルに下のコードを追加します。

function THEMENAME_preprocess_page(&$vars) {
  $vars['my_embedded_view'] = views_embed_view('view_name', 'default');
  $vars['scripts'] = drupal_get_js(); // This rebuilds the scripts variable with those added by the view
}

ご使用のテーマのtemplate.phpに既にtemplate_preprocess_page()があったら、その一番最後に追記してください。

STEP 2: 次に、page.tpl.php(或いはpage-[custom].tpl.php)のViewをエンベッドしたい場所に、

<?php print $my_embedded_view ?>

を挿入します。

STEP 3: admin/settings/performanceでキャッシュをクリアしてから、実際のページで成功したか確認してください。

コメントを追加

Powered by Drupal + Linux