Drupalを使いこなすために重要な要素の一つは、フックを理解することです。Drupalにはコアや拡張モジュールにたくさんのフックが用意されています。モジュールを作成したり、Drupalの動作をちょっと変更したいときには、このフックを呼び出します。しかしフックの数が多すぎて、どのタイミングでどのフックを呼び出すべきか迷ってしまうことも多々あります。そこで、スレに出てきたhookの使い方の実例や、hookを話題にしたレスを抜き出してみました。過去スレを"hook"で検索しただけなので、見落しているものがあるかもしれません。
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とか知らなかったので勉強になります。ありがとうございました。
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 のフックつけたモジュールに、グローバルで入れてみる!
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で消してた
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の使い方が書いてあったのでそっち参考にやってみます
ありがとうございました
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さん、サンクスです。
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ってとこか
参考になったトンクス
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入れてあげれば勝手に設定してくれるよ!
ただし、エイリアス欄の内容は上書きされちゃうけど。
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ありがとう!