hookの実例

Drupalを使いこなすために重要な要素の一つは、フックを理解することです。Drupalにはコア拡張モジュールにたくさんのフックが用意されています。モジュールを作成したり、Drupalの動作をちょっと変更したいときには、このフックを呼び出します。しかしフックの数が多すぎて、どのタイミングでどのフックを呼び出すべきか迷ってしまうことも多々あります。そこで、スレに出てきたhookの使い方の実例や、hookを話題にしたレスを抜き出してみました。過去スレを"hook"で検索しただけなので、見落しているものがあるかもしれません。

ユーザ編集画面の項目を削除する(hook_form_alter, 6.x)

http://www10.atwiki.jp/drupal/pub/log/1245598345.html#R444

444 名前:nobodyさん:2009/07 /10(金) 15:03:53 ID:???
    user/24/editのような編集画面にある
    「言語の設定」、「コンタクトの設定」をユーザーに見せたくないのですがこれを
    削除するのはどうするのでしょう?
    user-profile.tpl.phpは編集画面じゃなくてuser/24のプロフィール画面のようですし

446 名前:nobodyさん:2009/07 /10(金) 20:05:04 ID:???
    >>444
    テーマよりモジュールでやった方がいいと思う
    hook_form_alter()でunset($form['locale'], $form['contact'])

    function mymodule_form_alter(&$form, $form_state, $form_id) {
    if ($form_id != 'user_edit' && $form_id != 'user_profile_form') {
    return;
    }
    if (!user_access('administer users')) {
    unset($form['locale'], $form['contact']);
    }
    }

    こんな感じ? 

448 名前:nobodyさん:2009/07 /11(土) 07:17:38 ID:???
    >>446
    自前のモジュール作ればそういうことが出来るのですね
    unsetとか知らなかったので勉強になります。ありがとうございました。 

なるべく早い段階で変数を初期化したい(hook_init, 6.x)

http://www10.atwiki.jp/drupal/pub/log/1245598345.html#R760

760 名前:nobodyさん:2009/08 /03(月) 17:01:16 ID:???
    staticな変数値をどこかに書いておきたいんだけど、どこがいいって
    のはあるでしょか。読み込み順で動作が変わるのであれば、
    ブートストラップフェーズの近くで動作するようなところに置いておいた
    方がいいのかなぁ・・・。

    CCKデータと連動させる、独自テーブルの構成表のarrayを置いておき
    たいだけなのです。重い処理になるので、必要なデータだけ、CCK構成の
    データじゃなくて独自のテーブルに一行一コンテンツで保存しておきたい、
    んで、この処理が各イベントフックで使われるので、共有の配列どこかに
    置いておきたいなー、と。 

763 名前:nobodyさん:2009/08 /03(月) 19:40:58 ID:???
    >>760
    普通はhook_initでいいと思うけど、それより前にしたいなら
    モジュールファイルの上の方にグローバルで書いとけばいいんじゃない?
    もしくはその変数を使うモジュール側でinclude_onceするか。

764 名前:nobodyさん:2009/08 /04(火) 00:21:51 ID:???
    >>763
    サンクス!
    init のフックつけたモジュールに、グローバルで入れてみる! 

ユーザ用コンタクトを無効にする(hook_form_alter, 6.x)

http://www10.atwiki.jp/drupal/pub/log/1250415957.html#R287

287 名前:nobodyさん:2009/08 /30(日) 20:16:27 ID:???
    コンタクトモジュールなんですけど
    サイト用コンタクトのみ使用して
    ユーザー用コンタクトは使用できないように設定したいのですが

    何か追加モジュール使えば設定可能ですか?

288 名前:nobodyさん:2009/08 /30(日) 21:14:36 ID:???
    >>287
    コンタクトフォームの環境設定(admin/build/contact/settings)で
    パーソナルコンタクトフォームのチェックを外す。これだけだと
    ユーザが自分で有効にできてしまうので、hook_form_alterで
    unset($form['contact'])する。

    webformあたりでサイト用フォームだけ作った方が簡単かも。

289 名前:nobodyさん:2009/08 /31(月) 00:48:14 ID:???
    >>288
    そうやれば良いのか
    分からないからユーザーのはCSSで消してた 

フィールドに独自のバリデータを設定したい(hook_validate, 6.x)

http://www10.atwiki.jp/drupal/pub/log/1250415957.html#R290

290 名前:nobodyさん:2009/08 /31(月) 11:48:48 ID:???
    D6でCCKを使って郵便番号のフィールドを作っています
    yubin1とyubin2というフィールドを「整数」で作ってそれぞれ3桁と4桁にしたいのですが
    フィールド設定に最小値・最大値というのはあっても桁数の設定は無いので「整数」ではなく「テキスト」で作るべきなのでしょうか?(「テキスト」だと桁数も幅も設定できる) 

293 名前:nobodyさん:2009/08 /31(月) 12:28:32 ID:???
    モジュールで hook_validate イベントの処理を作って、
    そこに書く方法もあるよ。その場合、ほかの content-type
    の validate イベントも拾ってくるから、処理の最初で
    type を拾って必要なもののみ検証するようにする必要が
    あるけど。

294 名前:nobodyさん:2009/08 /31(月) 13:51:28 ID:???
    Drupal本見たらhook_validateの使い方が書いてあったのでそっち参考にやってみます
    ありがとうございました 

loadした配列に値を追加したい(hook_nodeapi, 6.x)

http://www10.atwiki.jp/drupal/pub/log/1250415957.html#R225

225 名前:nobodyさん:2009/08 /27(木) 19:14:30 ID:gDlr5dO4
    ところで・・・・
    _load で select した後に、node に、一行一コンテンツと
    ならない値をつけてあげたいんだけど。node のメンバを
    _load 直後のイベントで増やしてあげることできないでしょか。 

228 名前:nobodyさん:2009/08 /27(木) 21:12:58 ID:???
    >>225
    hook_nodeapiかhook_load。でも質問が意味不明。 

232 名前:nobodyさん:2009/08 /27(木) 23:41:54 ID:???
    >>228
    すいません、node に、DBの列にない値の枠を作ってあげたいんです。

233 名前:nobodyさん:2009/08 /28(金) 00:32:23 ID:???
    >>232 hook_loadでいいんじゃね?
    使い方は http://api.drupal.org/api/function/node_example_load/6 

393 名前:nobodyさん:2009/09 /10(木) 14:01:46 ID:???
    >>225ですが、やっと node に好きな値を突っ込む方法がわかりましたので自己レス。

    upload モジュールのコードを参考にすると、hook_nodeapi の load イベントで、
    return値['メンバ']として空値を返しています。すると、node['メンバ']という node 値が
    追加されるようで。

    node_load では、upload に倣って、type ごとのテーブル内容を呼び出すのみにする
    ということにしました。

    >>228さん、>>233さん、サンクスです。

hookの概要説明

http://www10.atwiki.jp/drupal/pub/log/1250415957.html#R425

425 名前:nobodyさん:2009/09 /12(土) 23:23:28 ID:???
    >>399
    >>もう一つは、node 、 form 、 view 、theme を軸にした
    >>フレームワークとして使う方法。

    この方法についてできればもうちょっと詳しく教えて

426 名前:nobodyさん:2009/09 /12(土) 23:39:42 ID:???
    >>425
    俺の知ってる範囲の話ね。うそ多いかもしれんが勘弁してw

    DrupalでモジュールというPHPスクリプトを作って、それを自分のサイトに登録すると、
    hook というDrupal本体のモジュールを連動させる仕組みが動き出す。

    hook は他のプラットホームでいうイベント処理。例えば、コンテンツ(node)を呼び出す
    とき、表示するとき。入力画面(form)を表示するとき、url が呼び出された
    (menu/rewrite処理)ときなど。

    Drupal では、主要な hook ごとに、そのときの処理を自分で書き換えるのに便利な
    ライブラリが揃っている。例えば、node を呼び出す・保存するときには、node_xxxx
    って一覧の関数があるし、form を表示するときには、テンプレートの制御下で汎用の
    入力欄を設定するためのform API と呼ばれる仕組みが揃っている。form API では、
    主要な入力タグの代わりになる定型文が使えるし、自分で新しいタイプの入力欄
    (例えば2桁と10桁の組み合わせ会員番号)を追加したい場合は、 widget という hook
    をつかえば実現できるようになってる。

    要するに、Drupal の標準機能のどこからに割り込み処理を書くことで、Drupalの各機能
    をカスタマイズしたり新機能を追加したりできるわけ。


427 名前:nobodyさん:2009/09 /13(日) 00:27:20 ID:???
    >>426
    なるほど、hookをいじるのがMVCでのC
    view、themeをいじるのがVってとこか
    参考になったトンクス 

ノードにpathを設定(hook_nodeapi, 6.x)

http://www10.atwiki.jp/drupal/pub/log/1250415957.html#R562

562 名前:nobodyさん:2009/10 /15(木) 01:33:59 ID:???
    この時間まで path モジュールと格闘してたのでtips。

    URLエイリアスをPHPスクリプトで自動設定したい場合は、
    hook_nodeapi の presave イベントで、$node->path に
    好きなURL入れてあげれば勝手に設定してくれるよ!

    ただし、エイリアス欄の内容は上書きされちゃうけど。 

追加したプロフィール入力欄を無効にしたい(hook_form_alter, 6.x)

http://pc11.2ch.net/test/read.cgi/php/1264987120/145-151

145 :nobodyさん:2010/02/11(木) 20:50:23 ID:???
    ぶった切りますが独自に増やしたプロフィール入力欄を
    ユーザーが後から変更できなくするモジュールはないでしょうか
    content_profile を使ってみましたがnodeとして記録されるので呼び出しにくいです。
    ほかのところで独自に増やしちゃった値をuser_loadをしている関係で
    なんとかユーザidから配列をひっ張り出せる状態にしておきたいのです。 

150 :nobodyさん:2010/02/11(木) 21:56:19 ID:???
    >>145
    function modulename_form_alter(&$form, $form_state, $form_id) {
    if ($form_id == 'user_profile_form' && !user_access('administer users')) {
    $form['Category1']['profile_field1']['#attributes']['disabled'] = 'disabled';
    $form['Category1']['profile_field2']['#attributes']['disabled'] = 'disabled';
    }
    }

151 :145:2010/02/11(木) 22:16:36 ID:???
    作るしかないって事ですね
    試してきます>>150ありがとう! 

タグ:

+ タグ編集
  • タグ:
最終更新:2010年02月13日 12:13