Views

Drupalバージョン: 
カテゴリ: 
モジュール: 

Viewsモジュールはdrupal.orgで最もダウンロードの多いモジュールです。GUIの管理画面でさまざまな条件を設定し、条件に合ったコンテンツのリスト表示を作成してくれるので、コンテンツをセクションに分けたり、新着記事のリストを作ったりするのに大変人気があります。CocoaSpaceでもそのような用途で利用しています。

しかし、その使用法は本当に奥が深く、より複雑な使い方もあります。また、寄贈されたモジュールの中にはViewsとの連携で動作するものも多数あります。GUIの管理画面があるとはいえ設定項目が多く、他のモジュールとの連携では非常に特殊な設定が必要なものもあります。

そんなわけで、まだまだ使いこなせていませんが、CocoaSpaceが実際に試行錯誤しながら得た情報のうち、他のユーザに役立つと思われる設定法や使用例などを、このページの下位階層にノートしていくことにします。

Viewsに関連している記事でも、他のモジュールの話題がメインの場合は、こちらの下位ページに分類されないことがあるかと思います。重複する記事もありますが、Viewsのタクソノミーページにもより多くのViews関連の記事をリストしてあります。

*CocoaSpaceではDrupal 6.xを使用しているため、Views 2の情報が中心となっています。

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

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でキャッシュをクリアしてから、実際のページで成功したか確認してください。

Viewsでタクソノミーページをオーバーライド

Drupalバージョン: 
モジュール: 

Drupalのタクソノミーページ(DRUPAL_URL/taxonomy/term/(タームID))には、Drupalのデフォルトのフロントページと同じ様式のノードのティーザーが表示されます。タイトルとサマリー、またはタイトルと本文の冒頭だけが表示される記事のリストです(記事の全文を表示することもできます)。表示法この表示法はブログなどでは一般的ですが、フォトギャラリーや商品ページのリスト/ティーザーとしてはあまり向いていませんね。そのため、Viewsモジュールを利用してフォトギャラリーノード用や商品ノード用にカスタマイズされたリストを作成されている方は多いと思います。タクソノミーページでもそれと同じリストを作成し、統一されたディスプレイにすることができます。

基本はViewsデフォルトのtaxonomy_term viewを有効にするだけ

Viewsモジュールをインストールすると、デフォルトでtaxonomy_termというviewがプリセットされています。これを利用することで、Drupalコアで用意されたタクソノミーページの表示をオーバーライドすることができます。あとはフィールドをお好みでカスタマイズするだけです。

Taxonomy Views Integratorモジュールなどを使用してタクソノミーのボキャブラリ毎やターム毎にviewを変更する場合には、デフォルトのtaxonomy_termというviewを変更せず、クローンviewを作成し、カスタマイズしていくという方法もあります。

設定のヒントなど

親タームをブレッドクラムに表示させる

Drupalのデフォルトの状態では、タクソノミーを階層構造にしている場合、親タームをブレッドクラム(パンくず)に表示します。Viewsでも同じような動作にできますが、下記のようにその設定を有効化する必要があります。

Arguments欄の『タクソノミー: Term ID (with depth』設定画面 - 赤枠の箇所にチェックを入れます。Arguments欄の『タクソノミー: Term ID (with depth』設定画面 - 赤枠の箇所にチェックを入れます。

Views UI(管理画面)のArgumentsの"タクソノミー: Term ID (with depth)"をクリックし、"Set the breadcrumb for the term parents"にチェックを入れます。

他にも設定でわかり難いところがあったら、このページに追記していきたいと思います。タクソノミーページをより良く見せる方法でもう少し手数のかかるものは、別の投稿として後日このページの下に追加していきます。

デモを見る

デモページURL: http://ubercart2.cocoaspace.uni.cc/taxonomy/term/104(閉鎖しました)

CocoaSpaceのUbercart 2.xのテスト/デモサイトで、Viewsを使用してタクソノミーページを作成してみました。デフォルトのタクソノミーページのティーザー表示よりも遥かに見栄えがよくなったと思いませんか?Ubercartモジュールを使用していなくても、CCKモジュールで作成したノードでも同じような表示を実現可能です。簡単ですので、是非試してみてください。

Viewsで表示中のタームの子タームへのリンクを作成

Drupalバージョン: 
モジュール: 

Drupalのタクソノミーは階層的な構造にすることができます。例えば下のような構造です。

ボキャブラリ: レストラン

  • 和食(タームID: 1) (投稿数: 0)
    • そば・うどん(タームID: 2) (投稿数: 71)
    • 寿司(タームID: 3) (投稿数: 30)
  • 中華(タームID: 4) (投稿数: 0)
  • イタリアン(タームID: 5) (投稿数: 0)

ブラウザで、"DRUPAL_URL/taxonomy/term/1"にアクセスした場合、『和食』というタームを付けた投稿がありませんので、"現在のところ、このカテゴリに投稿はありません。"というメッセージだけが表示され、その下位に『そば・うどん』や『寿司』といった子ターム(サブカテゴリ)があることが示されません。これでは不親切ですね。子タームへのリンクが表示されたら使いやすいサイトになると思いませんか?

現在閲覧しているタクソノミータームの子タームを表示するにはいくつもの方法があると思いますが、Views(バージョン6.x-2.x)を利用した方法を解説している下記のサイトを見つけましたのでご紹介します。

参考ページ: Using Views To Create DMOZ-Style Sub-Categories

英語なのでわかり難いと思いますので、この投稿では上記の参考ページを基に(というかほとんどそのままですが...)、設定法をご紹介したいと思います。

設定手順

STEP 1

何はともあれViewsをインストール、そして有効化。

STEP 2

ブラウザで"DRUPAL_URL/admin/build/views/add"にアクセスして"View name: taxonomy_subcats"、"View type: Term"で[Next]ボタンをクリック。

STEP 3

Relationships欄の[+]ボタンをクリックし、"タクソノミー: Parent term"にチェックを入れ、[追加]ボタンをクリック。

次の画面でそのまま[更新]ボタンをクリック。

STEP 4

Arguments欄の[+]ボタンをクリックし、"Taxonomy: Term ID"にチェックを入れ、[追加]ボタンをクリック。

次の画面の"Relationship:"という欄に、先程設定したRelationshipを設定。

そして、"Action to take if argument is not present:"という項目で、"Provide default argument"を選択し、"PHP Code"を選択。"PHP argument code:"に下のコードを挿入して[更新]ボタンをクリック。

return arg(2);

*タクソノミーページのURL、"DRUPAL_URL/taxonomy(arg(0))/term(arg(1))/タームID(arg(2))"のarg(2)の部分、すなわちをタームIDの値を返すように設定しているということです。

STEP 5

フィールド欄で[+]ボタンをクリックし、"タクソノミー: Term"にチェックを入れ、[追加]ボタンをクリック。

次の画面で、そのまま[更新]ボタンをクリック。次の画面で、"ラベル:"の"Term"というテキストを消去。

"Link this field to its taxonomy term page"にチェックを入れ、[更新]ボタンをクリック。

STEP 6

画面左上のDefaultsタブの下のセレクトリストから"ブロック"を選択し、[Add display]ボタンをクリック。

STEP 7

これでViewsの設定は終わりですので、画面下部の[保存]ボタンでこれまでの設定を保存します。これを忘れるとこれまでの設定が全く保存されませんのでご注意ください。

STEP 8

ブラウザで"DRUPAL_URL/admin/build/block"にアクセスし、"taxonomy_subcats: ブロック"の[設定]リンクをクリック。

設定画面の"ページ固有の表示設定"欄で"リストに記載したページにのみ表示する"にチェックを入れ、"ページ:"欄に下記の文字列を入力。

taxonomy/term/*

STEP 9

最後に"taxonomy_subcats: ブロック"をお好みのリージョンに表示するよう設定。

*上記の設定が面倒な方は、参考記事の下部にあるViewsからエクスポートされたコードをインポートして、そこから調整していくという手段もあります。ブラウザで"DRUPAL_URL/admin/build/views/import"にアクセスし、"Paste view code here:"というフィールドに、コードを挿入するだけですので、試してみてください。

表示例

CocoaSpaceのテスト環境で作成したものです。

右上の水色の部分が、今回ご紹介した方法で追加したサブカテゴリへのリンクです。右上の水色の部分が、今回ご紹介した方法で追加したサブカテゴリへのリンクです。

CocoaSpaceが運営する別サイト、CyberAmenityでは、スタート当初から下記のテーマをカスタマイズする方法で、類似の効果を実現してきました。よろしければご参照ください。ただし、近日サイトのリニューアルを予定していますので、テーマの刷新とともに、この記事でご紹介したViewsでの方法に切り替える予定です。

テーマをカスタマイズして子タームを表示する方法:

Drupal Taxonomy - How to add a list of clickable sub-categories | Robert Green's DIY

Viewsのタクソノミーページにタームの説明を表示

Drupalバージョン: 
モジュール: 
この記事では現時点のViewsの最新バージョン、Views 6.x-2.10を基にしています。他のバージョンでは設定法が異なる可能性がありますので、ご注意ください。

この記事で扱う『タームの説明』とは赤枠の部分のことです。この記事で扱う『タームの説明』とは赤枠の部分のことです。

Viewsでタクソノミーページを表示させると、なぜかタームの説明が表示してくれません。Taxonomy Views Integrator(TVI)(*1)モジュールをインストールするとタームの説明が表示されるようになりますが、TVIをインストールしない場合でもdrupal.orgに投稿された下記のコメントを参考に、ちょっとしたスニペットを使用することで対応可能です。もちろん、他にも方法があると思いますが...。

View page title from term description | drupal.org

英語で書いてあってわかり難いので、そこに書いてある一番簡単な方法(*2)をご紹介したいと思います。

STEP 1.

DrupalコアのPHP filterモジュールが有効になっていない場合は有効化。

STEP 2.

Views UI(管理画面)で、taxonomy_term viewのheader部分に下記のスニペットを挿入

<?php $current = taxonomy_get_term(arg(2)); ?>
<?php if ($current): ?>
  <div class="taxonomy-description">
    <?php print $current->description; ?>
  </div>
<?php endif; ?>
STEP 3.

入力書式にPHP codeを選択して保存。

*1. Taxonomy Views Integratorは、タクソノミーのボキャブラリやターム毎に異なるviewを選択できるようにするモジュールです。

*2. PHP filterモジュールを使用しない方法としては、ご使用のテーマのpage.tpl.phpに上記のスニペットを挿入したり、Viewsのテンプレートのオーバーライドについてご存知の方は、テーマのディレクトリ内にviews-view--taxonomy-term--page.tpl.phpなどを作成し、上記のスニペットを挿入したりする方法もあります。個人的にはPHP filterモジュールは好きではないので、このようなケースではテンプレート・ファイルを編集するようにしています。

Viewsでノードカウント付きのタクソノミータームのリストを作成

Drupalバージョン: 
モジュール: 

Development Seedさんのサイトのタームリストを参考に作成

『Drupalノート』のセクションにも表示している、"よく使われるタグ"というタームリストについての投稿です。このリストは、DrupalモジュールやOpen Atriumの開発などで有名なDevelopment Seedさんのブログセクションの"Tag"を参考に作成しました。というよりも、真似てみました。タグクラウドを作成するTagadelicモジュールなどに代わるものとしてやってみたいという方がいらっしゃるかもしれません。この投稿ではその方法をご紹介します。

ノード数のカウント付きのタグリストノード数のカウント付きのタグリスト

*必ずテスト環境で試してから稼働サイトに導入してください。

使用モジュール

次の2つのモジュールが必要です。バージョンは現在CocoaSpaceが使用しているものです。因みにDevelopment Seedさんで実際にTerm Node Countを使用しているかはわかりませんが、ノード数の表示を簡単に実現できそうだということで、CocoaSpaceでは同モジュールを採用しました。

これらを"DRUPAL_ROOT_PATH/sites/all/modules"ディレクトリに配置し、Drupalの管理画面(DRUPAL_URL/admin/build/modules)からViews、Views UI、Term Node Countを有効化してください。

Viewsの設定手順

ここではCocoaSpaceの"よく使われるタグ"の設定をご紹介します。Viewsを初めて使用する方でも大丈夫なようにしますので、慣れている方には冗長な説明かと思います。ご容赦ください。

Viewの追加

  • Viewsの管理画面から[追加]タブをクリック => Viewsの追加画面が開きます。
  • "View name"に"tags"と入力
  • "View type"で"Term"を選択
  • [Next]ボタンをクリック => 次の画面に移動します。

Fieldの設定

  • Field欄の[+]ボタンをクリック => 画面の少し下にフィールドを追加する項目が現れます。
  • "タクソノミー: Term Node Count"にチェックを入れる
  • [追加]ボタンをクリック
  • "ラベル"を空欄にする
  • "Exclude from display"にチェックを入れる(このフィールドはコールされるものの、表示されなくなります。)
  • [更新]ボタンをクリック
  • 再びField欄の[+]ボタンをクリック
  • "タクソノミー: Term"にチェックを入れる
  • [追加]ボタンをクリック
  • "ラベル"を空欄にする
  • "Rewrite the output of this field"にチェックを入れる
  • "テキスト"欄に次のように入力
    [html][node_count][name][/html]
  • "Link this field to its taxonomy term page"にチェックを入れる
  • [更新]ボタンをクリック

テンプレートファイルからHTMLを変更する方法もありますが、今回はこの方法でやってみましょう。テンプレートファイルからHTMLを変更する方法もありますが、今回はこの方法でやってみましょう。

*Term Node CountフィールドがTermフィールドの上になっていることを確認してください。

Sort criteriaの設定

  • Sort criteira欄の[+]ボタンをクリック
  • "タクソノミー: Term Node Count"にチェックを入れる
  • [追加]ボタンをクリック
  • "Descending"にチェックを入れる(カウントが多い順に並ぶようになります。)
  • [更新]ボタンをクリック

ブロックDisplayの追加

  • 設定画面の左側の"Defaults"タブの下のドロップダウン選択リストから"ブロック"を選択
  • [Add display]ボタンをクリック => ブロックタブが追加され、ブロックの設定画面が開きます。

Basic settingsの設定

左上の"Basic settings"欄を少し編集します。

  • "名前"の"ブロック"をクリック => 画面の少し下に追加の設定画面が表示されます。
  • (画面少し下)テキストフィールドに"Block: よく使われるタグ"と入力(現在見ているViewsの管理画面で使われる名前です)
  • [更新]ボタンをクリック
  • "タイトル"の"なし"をクリック
  • (画面少し下)[Override]ボタンをクリック(この"タイトル"がこのブロックでのみ使用されるようになります)
  • テキストフィールドに"よく使われるタグ"と入力(サイト閲覧者に表示されるブロックのタイトルとして使用されます。)
  • [更新]ボタンをクリック
  • "スタイル"の"Unformatted"をクリック
  • (画面少し下)HTML Listを選択
  • [Update default display]ボタンをクリック

Block settinsの設定

"Basic settings"の下の"Block settings"を編集します。

  • "Admin"の"なし"をクリック
  • テキストフィールドに"tags: よく使われるタグ"と入力(ブロックモジュールなどの設定画面で使われる名前です。)
  • [更新]ボタンをクリック

最後に忘れずに[保存]ボタンをクリック

最後に忘れずに画面少し下の[保存]ボタンをクリックします。[キャンセル]ボタンをクリックしないように注意してください。ここまでの設定が消えてしまいます。

CocoaSpaceの設定はこんな感じです。Filterを使ってボキャブラリ別のブロックも作成しています。CocoaSpaceの設定はこんな感じです。Filterを使ってボキャブラリ別のブロックも作成しています。

ノード数が0のものを非表示にする

ノード数のカウントが0のものを非表示にしたい場合もあるかと思います。Viewsの設定画面から、次の手順で実現可能です。

  • Filter欄の[+]ボタンをクリック
  • "タクソノミー: Term Node Count"にチェックを入れる
  • [追加]ボタンをクリック
  • "Operator"で"Is greater than"を選択し、"値"に"0"を入力
  • [更新]ボタンをクリック
  • [保存]ボタンをクリック

もちろん、この方法でカウントが0のものを非表示にする以外にも、カウントが10以上のものだけを表示することなども可能です。ご自身のサイトのニーズに合わせて設定してください。

CSSの調整

Views UIからの設定が終われば、あとはCSSでスタイリングするだけです。一応CocoaSpaceのCSSの内容を書いておきますが、ご使用のテーマによっては微調整が必要と思われます。もちろん色に関しては、ご使用のテーマに合うように変更してください。

/* Tags view */
.block .view-tags .item-list ul li {
  list-style: none;
  margin: 0;
  padding: 0;
  line-height: 1.4;
}
.view-tags .name a {
  display: block;
  border-bottom: 1px solid #edebe6;
  text-decoration: none;
  padding: 4px 0px 4px 4px;
}
.view-tags .name a:hover,
.view-tags .name a.active,
.view-tags .name a.active:hover {
  background: #f7f6f4;
}
.view-tags a span.count {
  background: #f7f6f4;
  display: block;
  float: left;
  text-align: center;
  width: 36px;
  font-weight: bold;
  border-radius: 4px;
  -webkit-border-radius: 4px;
  -moz-border-radius: 4px;
}
.view-tags .name a:hover span.count {
  background: #eae9d1;
  color: #6c5353;
}
.view-tags .name a.active span.count,
.view-tags .name a.active:hover span.count {
  background: #b4a28f;
  color: #ffffff;
}
.view-tags .name a span.term-name {
  display: block;
  margin-left: 42px;
}

Internet Explorerでa:hoverが上手くいかない場合の対処

いろいろ方法があると思いますが、お手軽なのは下のCSSを使用する方法でしょうか?いわゆるclearfixというテクニックで、CocoaSpaceが使用するAdaptiveThemeZenなど多くのテーマで見かけるものですよね。IE専用のCSSファイルを用意している方はそちらに追加するのもよいでしょう。

若干不必要なコードが入っていると思いますが、大目に見てください。

/* Easy clearing */
/* Slightly enhanced, universal clearfix hack */
.view-tags .name a:after {
  content:" ";
  clear:both;
  display:block;
  font-size:0;
  height:0;
  line-height:0;
  visibility:hidden;
  width:0;
}
.view-tags .name a {display: inline-block;}
/* start commented backslash hack \*/
* html .view-tags .name a {height:1%;}
.view-tags .name a {display:block;}
/* close commented backslash hack */

タクソノミータームのリストを作成するその他のモジュール

Viewsモジュールを使用するといろいろな設定がViews UIを通じてできるようになります。コードを書きたくない方にはなかなか良い方法だと思います。しかし、Viewsモジュール(少なくともバージョン2では)はタクソノミータームのリスト表示のサポートは限定的です。例えばタームに階層がある場合には、Taxonomy Menuモジュールなどがいいと思います。

Viewsの月別アーカイブの日本語化 & WordPressのようなURLにするカスタマイズ

Drupalバージョン: 
モジュール: 

Views 2(今回使用したのはViews 6.x-2.8)にデフォルトで設定されているarchive viewを有効にすると、WordPressやMovableTypeなどの典型的なブログCMSのように、投稿の月別アーカイブブロックをサイドバーに表示できます。特にDrupalをブログとして活用されている方にとっては重宝しそうな機能です。でも実際にarchive viewをサイドバーに表示すると、なんか変ですよね。最近の月から順に表示させたいのに古い月から表示されていたり、日本語トランスレーションを使用しているサイトでは、1月 2010というように中途半端な日本語訳になっていたりと...。

インターネットで検索していたら、ちょっと力技っぽいところもありますが、解決法がありました。CocoaSpaceの他サイトで試したところ、今のところうまくいってます。しかし、もしもここでの設定を試してみたいという方がいらっしゃいましたら、念入りにテストしてからライブサイトに採用するかを決定してください。何しろ私のような素人がやっている方法ですので、DrupalのAPIやPHPに詳しい方、より良い方法や改善すべき点などご存知でしたらコメントをお願いいたします。

ここではViews 6.x-2.8の"archive"で次のことを実現します。

  1. ブロック表示で最近の月から順に表示するように修正
  2. 1月 2010という表示を2010年1月に変更
  3. アーカイブページのURLをexample.com/archive/201001から..2010/01に変更
  4. アーカイブブロックのリンクのURLもexample.com/archive/201001から..2010/01に変更
  5. 結果的に年別のアーカイブやアーカイブのトップページも表示可能

ブロック表示で最近の月から順に表示するように修正

ブロックだけ古いほうから順に表示されています。また、1月 2010など日本語化が中途半端です。ブロックだけ古いほうから順に表示されています。また、1月 2010など日本語化が中途半端です。

まず、上の画像のようにブロック表示だけ古い年月が上位になっているのを修正します。Viewsでは通常投稿日による並び替えにSort criteriaという項目を調整すると思います。しかし、このarchiveでは既にSort Criteriaが既に降順に設定されています。実は今回のケースではArgumentsの項目を修正する必要があります。

ブロック表示のArguments -> "Action to take if argument is not present:"のラジオボタンで"Summary, sorted ascending"にチェックが入っている(これがブロック表示で古い月が上位に表示されていた原因)のを"Summary, sorted descending"に変更するだけで完了です。

1月 2010という表示を2010年1月に変更

viewsディレクトリ内のmodules/node/views_handler_argument_dates_various.incファイルに書かれている、日付のアーギュメントのhandlerをオーバーライドして、管理画面の『日付と時刻』(admin/settings/date-time)というページで設定する『日付の表示形式[カスタム](長)』の設定を利用するようにします。下のコードは、『日付の表示形式[カスタム](長)』が"Y年n月"(クォーテーションは含まない)で始まるように設定してあることを前提に書いています。

CocoaSpaceでは、日付の表示形式[カスタム](長)をこのように設定しました。CocoaSpaceでは、日付の表示形式[カスタム](長)をこのように設定しました。

参考ページ:
Link to "faces" in OG's members count column in Views should be configurable | drupal.org

まず、views_handler_argument_dates_various.incファイルの代わりとなるhandlerを作成します。ご自分のモジュールのディレクトリ内にincludesディレクトリを作成し、そのincludesディレクトリ内にMODULENAME_handler_argument_dates_various.incというファイルを作成し、下のコードを書き入れます。MODULENAMEのところはご自分のモジュール名に変更してください。

*カスタムモジュールの作成法は『シンプルなカスタムモジュールの作成』をご参照ください。

includes/MODULENAME_handler_argument_dates_various.inc

<?php
/**
 * Argument handler for a year (CCYY)
 */
class MODULENAME_handler_argument_node_created_year extends views_handler_argument_date {
  /**
   * Constructor implementation
   */
  function construct() {
    parent::construct();
    $this->arg_format = 'Y';
    $this->formula = views_date_sql_extract('YEAR', "***table***.$this->real_field");
  }

  /**
   * Provide a link to the next level of the view
   */
  function summary_name($data) {
    global $language;
    $created = $data->{$this->name_alias};
    if ($language->language == 'ja') {
      return substr(format_date(strtotime($created. "05". "15"), 'large'), 0, 7);
    }
    else {
      return strftime("%Y", strtotime($created. "05". "15"));
    }
  }
}

/**
 * Argument handler for a year plus month (CCYYMM)
 */
class MODULENAME_handler_argument_node_created_year_month extends views_handler_argument_date {
  /**
   * Constructor implementation
   */
  function construct() {
    parent::construct();
    $this->format = 'F Y';
    $this->arg_format = 'Ym';
    $this->formula = views_date_sql_format($this->arg_format, "***table***.$this->real_field");
  }

  /**
   * Provide a link to the next level of the view
   */
  function summary_name($data) {
    global $language;
    $created = $data->{$this->name_alias};
    $month = strftime("%m", strtotime($created. "05"));
    if ($language->language == 'ja') {
      if (preg_match('/^0/', $month)) {
    return substr(format_date(strtotime($created . "15"), 'large'), 0, 11);
      }
      else {
    return substr(format_date(strtotime($created . "15"), 'large'), 0, 12);
      }
    }
    else {
      return format_date(strtotime($created . "15"), 'custom', $this->format, 0);
    }
  }

  /**
   * Provide a link to the next level of the view
   */
  function title() {
    return format_date(strtotime($this->argument . "15"), 'custom', $this->format, 0);
  }
}
このコードは私が乏しい知識で書いたものですので、間違いをご指摘いただければ幸いです。

次に、MODULENAME.moduleファイルに下のコードを追加します。これで今回利用するViewsのAPIが利用可能となります。

MODULENAME.module

/**
* Implementation of hook_views_api().
*/
function MODULENAME_views_api() {
  return array(
    'api' => 2,
  );
}

更に、モジュールのディレクトリ(.info、.moduleファイルなどと同じ階層)にMODULENAME_views.incというファイルを作成します。ここでhook_views_handlers()に先程作成した代わりとなるカスタムhandlerを登録し、hook_views_data_alter()でViewsに今回作成したhandlerのほうを参照してもらうようにします。

MODULENAME_views.inc

<?php
// $Id$

/**
* @file
* Defines Custom Views data and plugins.
*
*/

/**
* Implementation of hook_views_handlers() to register all of the basic handlers
* views uses.
*/
function MODULENAME_views_handlers() {
  return array(
    'info' => array(
      'path' => drupal_get_path('module', 'MODULENAME') .'/includes',
    ),
    'handlers' => array(
      'MODULENAME_handler_argument_node_created_year' => array(
    'file' => 'MODULENAME_handler_argument_dates_various.inc',
    'parent' => 'views_handler_argument_date',
      ),
      'MODULENAME_handler_argument_node_created_year_month' => array(
    'file' => 'MODULENAME_handler_argument_dates_various.inc',
    'parent' => 'views_handler_argument_date',
      ),
    ),
  );
}


/**
* Implementation of hook_views_data_alter().
*/
function MODULENAME_views_data_alter(&$data) {
  $data['node']['created_year']['argument']['handler'] = 'MODULENAME_handler_argument_node_created_year';
  $data['node']['created_year_month']['argument']['handler'] = 'MODULENAME_handler_argument_node_created_year_month';
}

念のためにモジュールディレクトリ内のファイルのアップロード場所を図で確認してください。

カスタムモジュールのディレクトリ内のファイルの位置カスタムモジュールのディレクトリ内のファイルの位置

キャッシュをクリアしてから、archiveブロックを確認してください。2010年1月という表示になりましたか?

アーカイブページのURLをexample.com/archive/201001から..2010/01に変更

これは好みの問題かも知れませんが、archiveの月別表示のURLを201001から2010/01というWordPressなどで見慣れたURLに変更するための変更を加えたいと思います。次のページが参考になりました。

参考ページ:
Creating a WordPress like Archive with Drupal | Tessa Bakker

admin/build/views/edit/archiveに移動し、Page表示のタブをクリックしてArgumentsの部分を以下のように設定します。上記のページを参考に自分の好みの日本語表示に変更しました。

STEP 1. Node: Created year + month の除去

STEP 2. Node: Created year を追加

ページviewのArguments: Created yearの設定ページviewのArguments: Created yearの設定

  • 2-1. Title: アーカイブ: %1年
  • 2-2. Action to take if argument is not present: Summary, sorted descending

STEP 3. ノード: Created month を追加

ページviewのArguments: Created monthの設定ページviewのArguments: Created monthの設定

  • 3-1. Title: アーカイブ: %1年%2
  • 3-2. Breadcrumb: %1年
  • 3-3. Action to take if argument is not present: Summary, sorted descending

上記の変更でarchive/2010/01などの月別のアーカイブだけではなく、archive/2010などの年別のアーカイブも表示できるようになります。この設定ではデフォルトのarchive/201001からarchive/2010/01というようにスラッシュが1つ余計に入っています。ところがブロック表示のリンクは依然としてarchive/201001のフォーマットです。上記の参考サイトのコードを参考に、スラッシュが一つ余計に入るように操作します。

アーカイブブロックのリンクのURLもexample.com/archive/201001から..2010/01に変更

このURLの操作がarchiveのブロックだけに適用され、その他のviewにまで影響を与えないように、function THEMENAME_preprocess_views_view_summary()ではなく、より的を絞ったfunction THEMENAME_preprocess_views_view_summary__archive__block()を使用したいところです。しかし、これを使用するにはviews-view-summary--archive--block.tpl.phpというテンプレートが存在していなければなりません。CocoaSpaceではviews/theme/views-view-summary.tpl.phpを、使用するテーマのディレクトリ(sites/all/themes/THEMENAMEなど)にコピーして、views-view-summary--archive--block.tpl.phpという名前に変更して対応しました。ここまで準備が整ったら、テーマのtemplate.phpに以下のコードを書き込みます。

template.php

/**
 * Change block view url's into WP-look-a-like url's
 * Original code: 
Creating a WordPress like Archive with Drupal | Tessa Bakker
 * @param object $vars
 * @return void
 */
function THEMENAME_preprocess_views_view_summary__archive__block(&$vars) {
  foreach($vars['rows'] as $row) {
    if(is_numeric(substr($row->url, -6, 6))) {
      $row->url = substr($row->url, 0, strlen($row->url) - 2).'/'.substr($row->url, -2, 2);
    }
  }
}

キャッシュをクリアして、アーカイブがどう変わったかを確認してください。狙いどおりに変更が反映されていますか?

月別アーカイブを表示するその他のモジュール

本投稿でご紹介したような設定が面倒という方には、他の選択肢もあります。興味のある方はお調べになってください。

Monthly Archive by Node Type
このモジュールはTokenモジュールを使用して、管理画面で[yyyy]年[m]月と設定するだけでアーカイブのリンクを日本語化できるようです。詳しく調べていませんが、一見したところ設定は簡単なものの、年別のアーカイブなどはできず、デフォルトではブレッドクラムも表示しないようです。

Archive
こちらもよく調べてはいませんが、年別アーカイブが表示できるようです。