1. コアや寄贈モジュールを変更しない
ご存知かと思いますが、Drupalのコミュニティでは"コアを変更しないように(参照: Do not hack the core | drupal.org - http://drupal.org/node/144376)"ということが頻繁に聞かれます。Drupalコアの動作を変更するためにコアのプログラムに直接変更を加えるのではなく、カスタムモジュールやカスタムテーマなどから、豊富に用意されたhookを利用して変更を加えることが奨励されています。私はこのhookを利用したサイト構築の柔軟性こそがDrupalの最大の売りだと思っています。コアに変更を加えてしまうと、アップデートのたびにコアに加えた変更を繰り返さなければならなくなり、メンテナンスが難しくなります。変更箇所が多ければ多いほどメンテナンスが難しくなり、最悪の場合メンテナンス不可能なサイトが出来上がるかもしれません。また、コアのプログラムは多くのコミュニティメンバーによってテストされ、セキュリティ面で考慮されていますので、そこに直接変更を加えるのはよくないと言われています。
@よしまさ さん
情報共有ありがとうございます。おっしゃるとおり、年月表示に限ってということであれば、views_handler_argument_dates_various.inc内の $this->format = 'F Y'; という部分を Y年n月 に変更し、ファイルをUTF-8で保存することで日本語になりますよね。本投稿でご紹介した方法では、そのシンプルな変更を達成したいがためにいろいろと回りくどいことを好き好んでやっています(笑)。記事の作成時には「年月表示を変更するには $this->format = 'F Y'; の部分を変更したいのですが、そのためにはこのように変更するといいようです。」とか、いろいろ書いていたのですが、記事が長くなってきたのでそういう部分は省いて投稿してしまいました。分かり難くて申し訳ありません。
確かに「月別アーカイブを日本語化するのになぜこんなに手数をかけなければならないのか?」と感じる方も多いと思います。ですので念のために、なぜCocoaSpaceではいろいろと回りくどいことをしたのか、その理由を書かせていただきます。
1. コアや寄贈モジュールを変更しない
ご存知かと思いますが、Drupalのコミュニティでは"コアを変更しないように(参照: Do not hack the core | drupal.org - http://drupal.org/node/144376)"ということが頻繁に聞かれます。Drupalコアの動作を変更するためにコアのプログラムに直接変更を加えるのではなく、カスタムモジュールやカスタムテーマなどから、豊富に用意されたhookを利用して変更を加えることが奨励されています。私はこのhookを利用したサイト構築の柔軟性こそがDrupalの最大の売りだと思っています。コアに変更を加えてしまうと、アップデートのたびにコアに加えた変更を繰り返さなければならなくなり、メンテナンスが難しくなります。変更箇所が多ければ多いほどメンテナンスが難しくなり、最悪の場合メンテナンス不可能なサイトが出来上がるかもしれません。また、コアのプログラムは多くのコミュニティメンバーによってテストされ、セキュリティ面で考慮されていますので、そこに直接変更を加えるのはよくないと言われています。
上記のようなルールはViewsのようなdrupal.orgで管理されている寄贈モジュールについても当てはめて考えられることが多いようです。drupal.orgで管理されている寄贈モジュールは、drupal.orgのセキュリティチームによってテストされているようです(サードパーティのモジュールまでdrupal.orgでセキュリティのテストがされているなんて、Drupalって本当にスゴイですよね!)し、モジュールアップデート時のメンテナンスの容易さという面でも上記のルールを当てはめて考えることは妥当かと思います。寄贈モジュールのなかにはそのモジュール専用のAPIを提供しているものも多くあります。Viewsもその一つです。コアのAPIに加えて、それらのAPIを利用することで、寄贈モジュールのファイルに直接変更を加えなくても、希望通りの動作を実現できることは多いと思います。本投稿に掲載した私の下手なコードでセキュリティはどうなのかということはありますが(笑)、今後Viewsの日付アーギュメントの部分に大きな変更がなければ、アップデートのたびに修正を繰り返す必要はありません。
このような理由から、Viewsのファイルに直接変更を加えるのではなく、別のカスタムモジュールやカスタムテーマから変更を加えるのが正攻法かなと思っています。CocoaSpaceで現在までにご紹介している他のコード、スニペットも、コアや寄贈モジュールに直接変更を加える方法はありません。少々回りくどいと感じる方もいらっしゃるかと思いますが、長い目で見ると逆に"簡単な方法"だと考えています。
2. 多言語サイトでも使用できるようにしたい
CocoaSpaceではファイルに直接日本語を書き込み、UTF-8で保存という方法はなるべくなら採用しないようにしています。その代わりにDrupalのt()ファンクションを使用して日本語の翻訳を用意するようにしています。今回のViewsの変更ではt()ファンクションを使用してコードを書くということではありませんが、Drupalコアの日付には日本語翻訳がありますし、なるべくDrupalで用意された翻訳機能を利用し、それで足りない部分はViewsのAPIを使用しました。本投稿の変更を加えた後、Drupalの言語を英語に変更すると、"January 2010"というように英語の年月表示になると思います。
--- 2010年3月21日追記: サイトの言語を英語にしてちょっと確認してみました。ブロックは"January 2010"という表示になるものの、月別表示のタイトルが"2010年January"という表示になります。このままでは多言語サイトに使えませんね。 ---
おわりに:
上記のような理由があっても、やはり本投稿でご紹介した方法は手数が多いやり方ですよね(笑)。ViewsはDrupalコアよりもファイルサイズが大きいほどたくさんのコードから成り、構成もかなり複雑です。変更を加えるには手数がかかることが多いのは、そのことも理由の一つかもしれません。より簡単な方法を見つけましたら記事に加筆します。今回のような、みなさんからの情報も引き続きお待ちしています。
本文の意図を全部汲むわけではないのですが、viewsモジュールの月別表記を修正するだけであれば、modules/nodeにあるviews_handler_argument_dates_various.inc内の以下の部分を修正すればいけると思います。
56行目(バージョンによって異なるかも。Argument handler for a year plus month (CCYYMM)の部分)
$this->format = 'F Y';
↓
$this->format = 'Y年n月';
これで恐らく月別表示が日本語表記になるのではないかな、と思います。
私が開いたときこのファイルはshift-jisになっていましたので、保存するときにutf-8にすると正常に表記されました
@nono さん
どのように機能を実現したかのご報告ありがとうございました。私の知識不足で今回はお役に立てませんでしたが、これに懲りずに今後も情報共有していきましょう!
こんにちわ、nonoです。
一応落ち着きましたので、内容を報告させていただきます。
まず、フィールドをグループにして、そのグループ単位で個数を増やしていく事に関しては、CCKの次バージョンCCK3では対応可能という情報がありましたが、現時点ではまだ開発バージョンなので見送りました。
結局、Imagefield、ImageField Extendedを併用することで対応しました。
この2つのモジュールを用いて、「画像×1、テキストフィールド×任意」といったフィールドが作れますので、当初の車の「グレード」を表現できそうです。
ただ、問題点としてPDFファイルがアップロードできないという点がありましたが、Imagefieldのソースを少し触るだけで解決いたしました。
・Imagefiledの設定でアップロードファイルの種類に「pdf」を追加しました。
・アップロードファイルが「画像」であるとチェックしている箇所がありましたので、ソース上からコメントアウトしました。
→imagefield.module:200ぐらい
これで実際にPDFファイルをアップロードできるようになるのですが、画像をアップロードしたときはサムネイルが表示されるのに対し、PDFでは何も表示されずに見た目的に違和感があります。ですので、
・サムネイルを作成する際、PDFファイルだった場合は特定のサムネイルファイル(自作です)を表示する。
→imagefield.module:theme_imagefield_admin_thumbnail()
といった変更を加えて対応完了いたしました。
この度は色々とご指導頂き誠にありがとうございました。
今後も本サイトを参考にさせて頂きます。
投稿の範疇外にもかかわらず、アドバイスいただきましてありがとうございます。
1.CCKの次期バージョンについては期待しているのですが、現状devバージョンのようですので、使用は控えようかと思います。
2.「グレード」コンテンツを別に作成しておいて、メインコンテンツ作成時に「グレード」コンテンツを参照するといった形でしょうか。この場合、メインコンテンツ作成の画面上から「グレード」コンテンツを編集できたりするんでしょうかね?
一般的な手法ということであれば色々と応用が利きそうな気がしますので、ちょっと調べてみたいと思います。
ありがとうございました。
@nono さん
コメントの内容が本投稿の範疇ではなく、またImageField Extendedというモジュールを使用したことがないので、知識がなくて困ってしまいましたが、知っている範囲で2つの方法を思いつきました。
1. devバージョンですが、CCK 6.x-3.x-dev(http://drupal.org/node/484068)では、Multigroupでグループ化されたフィールドを複数作成することが可能です。
2. グレード情報専用のノードタイプ、そしてNode ReferenceとViewsを駆使して、メインのノードに関連するグレード情報をブロック表示できます。少々煩雑ですが、結構一般的な方法ですよね。
初めまして、Drupalについての参考になる情報をありがとうございます。
現在、CCKを使って、画像を含めた複数の入力フィールドをまとめて追加できるようなコンテンツタイプを作成しております。
例えば、わかりやすく車を例にしますと、
(1)メーカー
(2)車名
(3)グレード (←これをひとまとめに複数個追加)
(3-1)型番 (←テキスト)
(3-2)値段 (←数値)
(3-3)写真 (←画像、PDFファイル)
といったコンテンツタイプを実現するために、CCK、Imagefield、ImageField Extendedを使用しています。
(1)、(2)はCCKで普通にテキストフィールドを追加するだけでいいのですが、(3)をひとまとめに追加していくのにImagefieldにImageField Extendedで入力欄を追加し、値の数を無制限にしています。
問題なのは、画像ファイルだけではなくてPDFファイルもアップロードしたいのですが、そのような変更はできますでしょうか?
或いは、Imagefieldに対するImageField Extendedの様に、Filefieldに入力フィールドを追加するモジュールはあるのでしょうか?
或いは、CCKでグループを複数個作成していくモジュールはあるのでしょうか?