Drupal_モジュールを追加する

Drupalは、モジュールの集合体といっても過言ではありません。Drupalのコア、ブログや掲示板などのサービスなど、すべてモジュールと呼ばれるプログラムで構成されています。ここでご紹介するのは、既存のDrupalに新たに機能を追加する場合の拡張モジュールと、その追加方法です。

Drupalのモジュールは、Drupalが定める一定の法則に従って作れば、誰にでも作ることができます。こうして世界中で作成されたDrupalのモジュールは、Drupalの公式サイトで紹介されたり、個人が配布したりしています。(Drupalの公式モジュール検索サイト

多種多様なモジュールがありますが、これらを簡単にインストールして、自分のサイトをカスタマイズできるのがDrupalの強みでもあります。それでは、モジュールのインストールと利用までの概要をご説明します。

拡張モジュールをダウンロードする
Drupal.orgなどのモジュール検索サイトから任意の拡張モジュールをダウンロードします。ダウンロードが完了したら、ファイルを解凍してください。
モジュールをサーバーにアップロードする
解凍したファイルをサーバーの(ホームディレクトリ)/ sites/all/modules/にそのままアップロードします。
モジュールの有効化
管理セクション/サイトの構築/モジュールを開いてください。モジュールのリストの中に、先ほどアップロードしたモジュールが追加されています。有効にチェックを入れ、画面最下部の設定の保存をクリックしてください。
ユーザー権限の設定
管理セクション/ユーザーの管理/権限を開いてください。さきほど有効にしたモジュールを使用できるユーザーを設定します。必要な権限を有効にしたら、画面最下部の権限の保存をクリックしてください。

以上で、モジュールの追加は完了です。必要に応じて、日本語訳の翻訳ファイルなどを適用させ、使用してください。

Drupal_エラーページを編集する

必要なモジュール
Custom error
目的
ホームアドレス以下のURLを打ち間違えたり、存在しないページへアクセスしようとすると、404などのエラーメッセージがでます。デフォルトでは、Drupalが用意しているメッセージが自動で表示されますが、このメッセージの内容を変えたい場合はモジュールを使います。
ちなみに、エラー番号とエラー内容の意味は次の通りです。
404
アクセス権限のないページにユーザがアクセスした際に表示する
403
存在しないページにユーザがアクセスした際に表示する
使い方
  1. モジュールをいつもの要領でインストールしてください
  2. 管理セクション/サイトの環境設定の中に、Custom errorというリンクが現れます
  3. 404エラーと403エラーのページタイトルとメッセージが編集できるようになっているので、任意のメッセージを入力します。
  4. 設定の保存をします

Drupal_ページごとにページタイトルを変える

必要なモジュール
Page Title
目的
Drupalでは、ひとつのテンプレートファイルを複数のコンテンツが共有します。そのため、どのコンテンツもページのタイトルにはサイト名が入るようになっています。しかし、コンテンツの内容ごとに相応しいタイトル名をつけたほうがSEO上は有利です。ここでは、モジュールを使って、タイトル名をページごとに変更します。
使い方
  1. このモジュールを入れると、管理セクション/コンテンツの管理の中にPage Titlesというリンクが現れます。これをクリックしてください。
  2. Page Title Patternsという一覧が出てきます。

    私の場合は、フロントページにはサイト名、それ以外はページタイトルを入れたいと
    思っていたので、次のようにしました。

    • デフォルト:[pate-title]
    • Frontpage:[site-name]
  3. これは、特に指定のないページのタイトルにはページタイトルを表示して、フロントページだけはサイトネームを入れます、という設定です。page-titleとは、コンテンツの作成時につける名前なので、この場合は、ページタイトルに相応しい名前です。逆にフロントページにはコンテンツが存在しませんので、サイトネームを表示します。

Drupal_ページごとに異なるデザインにする

Drupalにはテーマ[theme]というものがあり、これを選ぶことによって、サイト全体にひとつのデザインテーマが指定されます。これにより、どのページを見ても共通のデザインが適用され、統一感のあるサイト作りが可能になっています。

しかし、ひとつのサイト内に商品の特設サイトを設けるなど、異なるデザインを適用したい場合があります。これを可能にする方法は、いくつかあります。

まず、Drupalのテーマに関する仕組みを理解するため、次の表を見てください。

テンプレートファイル 適用されるページ
page.tpl.php全てのページに適用される
page-front.tpl.phpトップページにのみ適用される
page-node-(コンテンツID).tpl.php任意のコンテンツページ(異なるデザインを表示させたいページのコンテンツIDを指定)に適用される
page-(aaa-bbb-ccc).tpl.php任意のパス「/aaa/bbb/ccc」以下で表示されるページに適用される

Drupalは、ページの表示をするために、テンプレートファイル「***.tpl.php」を探します。その優先順位が、特殊なもの>page.tpl.php(デフォルトデザイン)なのです。これら特殊なページのことを「派生ページ」といいます。

デフォルトデザインのpage.tpl.phpを元に、コードを追加し、新しいテンプレートファイルを作成したとします。これをpage.tpl.phpと同じディレクトリにアップロードすれば派生ページとして適用されます。

これらの方法とは別に、PHPでデザインを分岐させる方法があります。以下にその方法をご紹介します。

  1. まず、バックアップをきちんと取ります
  2. page.tpl.phpにPHPで分岐コードを書きます。


この分岐は、ホームディレクトリ以下、1つ目のスラッシュで区切ったところに"example"の記述があるページはexample.tpl.phpを参照する。それ以外はdefault.tpl.phpを表示する、というswitch文による分岐です。

これだけですと上記表のパス指定の派生ページでも実現可能ですが、このようなswitch文があれば、分岐の分岐、ということも可能になりますので知っておくと便利です。

Drupal_ユーザログインできなくなったら

もし、ユーザIDやパスワードを忘れてしまった場合、Drupalにログインできなくなってしまいます。一般ユーザの方は、管理者に問い合わせれば、問題ないのですが、例えば、次のような場合がやっかいです。

  1. 管理者IDとパスワードを忘れてしまった
  2. オフラインにしたまま、ログアウトしてしまった


1.の場合は、再びパスワードを設定しなおす必要があります。MySQLのuserテーブルを覗いても、パスワードは暗号化されているので、知ることが出来ないからです。次の方法でパスワードをリセットしてください。

  1. MySQLにアクセスしてください(個人サーバーかレンタルサーバーかによってアクセスの方法が違います。ここでは、レンタルサーバーの場合を仮定し、PHPMyAdminを立ち上げます。)
  2. 次のSQL文を実行してください。
    UPDATE `users` SET `pass` = MD5('<新しいパスワード>') WHERE `uid` =1 LIMIT 1;
Drupalでは、一番最初に登録したユーザーが管理者、ということになっていますので、ユーザーIDを示すuidは必ず「1」なのです。
2.は、http://example.com/userでログイン画面にアクセスできます。ここからログインしてください。

Drupal_フラッシュ(swf)がIEなどの一部のブラウザで表示されない問題


フラッシュ作成ソフトなどで作成したフラッシュをパブリッシュ(書き出し)する際に、フラッシュ呼び出し用のHTMLファイルも同時に作成できます。このコードをそのままブロックに挿入し、表示させたところ、ファイヤーフォックスやオペラなどのブラウザは正しく表示できたのに対し、IE6〜7のブラウザで表示することができませんでした。ページ全体の読み込みが途中でフリーズしたような症状でした。




<object type="application/x-shockwave-flash" data="http://example.com/themes/example/img/example.swf" width="960" height="270">

<param name="allowScriptAccess" value="sameDomain" />

<param name="wmode" value="opaque" />

<param name="bgcolor" value="#FFFFFF" />

<param name="scale" value="showall" />

<param name="quality" value="autohigh" />

<param name="align" value="l" />

<param name="allowfullscreen" value="true" />

<param name="base" value="http://example.com/themes/example/img/" />

<param name="play" value="true" />

<param name="menu" value="false" />

<param name="loop" value="true" />

<param name="flashvars" value="width=960&height=270" />

<!--<![endif]-->

<p>You are missing some Flash content that should appear here! Perhaps your browser cannot display it, or maybe it did not initialise correctly.</p>
</object>

次のコードに変更したところ、IEでも動くようになりました。(IE6〜8で動作確認済み)




<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="960" height="270">

<param name="movie" value="<span class="red">http://example.com/themes/example/img/example.swf" />

 <!--[if !IE]>-->

 <object type="application/x-shockwave-flash" data="<span class="red">http://example.com/themes/example/img/example.swf" width="960" height="270">

 <!--<![endif]-->

 <param name="FlashVars" value="value" />

 <!--[if !IE]>-->

 </object>

 <!--<![endif]-->

</object>

Drupal_共有SSLサーバー(共有証明書を経由する場合)のHTTPS設定について

本文は http://drupal.org/node/339552の内容をDrupalTipsが意訳したものす。内容に関してあいまいな部分がある場合は必ず原文を参照してください。

以下、訳です。



共有SSL証明書を使用する場合のDrupal設定方法について、私の体験を皆さんと共有したいと思います。ここでは、SSLサーバーがひとつのホストを他者と共有し、テスト環境が限られている場合を想定しています。

プロバイダーのホストのようにhttpsを使いたくても、他人の名前を直接付けることはできません。その代わり、共有SSLサーバーのプロバイダーが与える特別なURLにあなたのドメイン名を追加することで、SSLページとして自サイトを呼び出すことが出来ます。SSLサーバーは、サーバー内部にある、通常のHTTPページ(httpsではない)を経由して呼び出しているのです。
そして、呼び出しに対して、元のページを返しているのです。

あなたのDrupalサイトの主な問題は次のとおりです。

  • https要求を知らない
  • おそらく$base_urlの共有SSLアドレスへの置き換えがうまくいっていない

この情報をWEBで探したとき、あなたはこのサイトを見つけることでしょう

私は、Drupalコアのをいじることなく、settings.phpファイルの中で問題解決をしました



01: $request_type = ($_SERVER['HTTP_X_FORWARDED_HOST'] == 'ssl.proxy.org') ? 'SSL' : 'NONSSL';

02: if($request_type!="SSL"){

03: //header("Location:https://ssl.proxy.org/www.example.com");

04: $base_url = 'http://www.example.com'; // NO trailing slash!

04a: $base_url = 'http://www.example.com/some/dir'; // NO trailing slash!

05: $cookie_domain = 'www.example.com';

06: } else {

07: $base_url = 'https://ssl.proxy.org/www.example.com'; // NO trailing slash!

07a: $base_url = 'https://ssl.proxy.org/www.example.com/some/dir'; // NO trailing slash!

08: $cookie_domain = 'ssl.proxy.org';

09: $_SERVER['HTTPS']='on';

10: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI'];

10a: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI']; // Only the DNS name of the site needed here!

11: $conf = array(

12: 'reverse_proxy' => TRUE,

13: 'reverse_proxy_addresses' => array($_SERVER['REMOTE_ADDR']),
14: );

15: }


まず、コード中の「www.example.com」をあなたの共有SSL証明書があるSSLサーバーのドメイン名に置き換えてください



01: $request_type = ($_SERVER['HTTP_X_FORWARDED_HOST'] == 'ssl.proxy.org') ? 'SSL' : 'NONSSL';

ホストは、$_SERVER['HTTP_X_FORWARDED_HOST'].のなかのドメイン名を共有SSLサーバーに送っています。もし外部SSLサーバーを使用している場合で、うまく動かない場合は、$_SERVERをの記述をチェックしてみてください。(私はなにも触らずいけました)



02: if($request_type!="SSL"){

03: //header("Location:https://ssl.proxy.org/www.example.com");

04: $base_url = 'http://www.example.com'; // NO trailing slash!

04a: $base_url = 'http://www.example.com/some/dir'; // NO trailing slash!

05: $cookie_domain = 'www.example.com';

4行目と5行目はもしかしたら必要ないかもしれません。Drupalは、自動でこれを処理するかもしれないからです。しかし、念のため私はコードの中に入れて、$base_urlのURLを設定しました。

3行目は、あなたのサイトが固定の場合、コメントアウトをはずしてください。

メモ:4行目はサブフォルダ以下にSSLページが存在する場合、その位置(ディレクトリ)を示すものです



07: $base_url = 'https://ssl.proxy.org/www.example.com'; // NO trailing slash!

07a: $base_url = 'https://ssl.proxy.org/www.example.com/some/dir'; // NO trailing slash!

http://www.example.comからSSLサーバへの要求は同じURLからきたものだとDrupalに認識させなければいけません。この行は、CSSや画像、javascriptのように、URLを訂正し、元のソースを辿って結果を返します。http:ssl.proxy.org/moduke/...の最後に自分のドメイン名と置き換えるサイトのドメインSSLサーバー

メモ:7行目はサブフォルダ以下にSSLページが存在する場合、その位置(ディレクトリ)を示すものです



08: $cookie_domain = 'ssl.proxy.org';

同じドメインのURLのみをcookieが受け取るようにブラウザの設定をします、そして、$cookie_domainをSSLサーバードメインに変更する必要があります(★この行なしで私はログインすることができませんでした)



09: $_SERVER['HTTPS']='on';

https経由の要求するのなら、Secure Pagesのようなモジュールを知っておくと便利です。httpからSSLサーバーに要求するので、httpsからの要求と見せかけなければいけません。



10: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI'];

10a: $_SERVER['REQUEST_URI']='/www.example.com'. $_SERVER['REQUEST_URI']; // Only the DNS name of the site needed here!

この行なしでもフォーム以外は全てが機能しました。この原因はhttp://drupal.org/node/60222でcommon.incのハックとして提案されています。

theme_form()の最初の場所で与えられるURLが悪いのかとおもったのですが、理解するのにかなり時間がかかりました。URLを作ることにしました

URLは、request_uri()のなかで設定します

少なくとも、ホストSSLサーバーの$_SERVER['REQUEST_URI']を設定してください。そしたら私が制作しなければならなかったDrupalのURLの訂正をドメイン名???

$_SERVER['REQUEST_URI']は既に'/some/dir'に含まれている。www.example.comとwww.example.com/some/dirをここで置き換える必要はない。



11: $conf = array(

12: 'reverse_proxy' => TRUE,

13: 'reverse_proxy_addresses' => array($_SERVER['REMOTE_ADDR']),

14: );

SSLサーバーのIPアドレス設定とreverse_proxyをできるようにしなければらならない。呼び出し元のIPアドレスDrupalが記録する(SSLサーバーIPアドレスの代わりに)

ホストはIPを異なる呼び出し(おそらくloadbalancingのため)のためにIPを変化させる、私はreverse_proxy_addressesを$_SERVERに適した設定できるようにする

drupalコアをいじることなく、なにかしらのハッキングをすることなく、tpl.phpファイルとその他のものであなたは本当にやりたくないことをします。



実際に出来上がったコードは、以下のとおりです。これをsetting.phpに追記しました。赤字が変更箇所で、不要なコードは削除しています。




$request_type = ($_SERVER['HTTP_X_FORWARDED_HOST'] == 'ssl2.sixcore.ne.jp') ? 'SSL' : 'NONSSL';

if($request_type!="SSL"){


$base_url = 'http://example.jp'; // NO trailing slash!


$cookie_domain = 'example.jp';

} else {

$base_url = 'https://ssl2.sixcore.ne.jp/example.jp'; // NO trailing slash!


$cookie_domain = 'ssl2.sixcore.ne.jp';

$_SERVER['HTTPS']='on';

$_SERVER['REQUEST_URI']='/example.jp'. $_SERVER['REQUEST_URI'];


$conf = array(

'reverse_proxy' => TRUE,

'reverse_proxy_addresses' => array($_SERVER['REMOTE_ADDR']),

);

}

settings.phpには、このコードとは別にデフォルトで$base_url = 'http://www.example.com';の記述が存在します。しかし、通常はコメントアウトされているはずなので、コードがダブるということはありません。念のため、コードの前に「#」がついているかを確認するといいと思います。

トラブルシューティング

$cookie_domain = 'ssl2.sixcore.ne.jp';

この記述を最初は、

$cookie_domain = 'ssl2.sixcore.ne.jp/example.jp';

としており、投稿結果にsslでアクセスできないなどの問題にぶつかりました。しばらくここが原因と気づけず悩みましたが、ここを改善後、sslページでログインしなおしたところ、sslで投稿結果を閲覧することができました。

参考サイト