Skip to main content

ブロックの表示/非表示を制御するコードはどこで呼び出されるのか?

Posted in

ログイン中のユーザーに特定のブロックが表示されないようにする方法で書いたブロック表示を制御するコードですが、どこでどう呼び出されているのか、ちょっと気になって調べてみた。

まず、コードの保存先だが、ページのリストか PHP コードかに関係なく blocks というデータベーステーブルの pages 列に保存される。blocks テーブルは、サイトで定義されている各ブロックの情報を管理するためのテーブル。
mysql で show create table するとこんなふう。

CREATE TABLE `blocks` (
  `module` varchar(64) NOT NULL default '',
  `delta` varchar(32) NOT NULL default '0',
  `theme` varchar(255) NOT NULL default '',
  `status` tinyint(4) NOT NULL default '0',
  `weight` tinyint(4) NOT NULL default '0',
  `region` varchar(64) NOT NULL default 'left',
  `custom` tinyint(4) NOT NULL default '0',
  `throttle` tinyint(4) NOT NULL default '0',
  `visibility` tinyint(4) NOT NULL default '0',
  `pages` text NOT NULL,
  `title` varchar(64) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8

で、このテーブルからブロックのデータを読み出して、実際に表示するブロックのリストを生成するのがmodules/block/block.module の block_list という関数。ブロックごとに pages 列を読み取り、そのブロックを現在のページに表示するのかどうかのフラグを設定している。
"PHP モード" を指定していた場合、この中で次のコードが呼び出される。(678 行目)

$page_match = drupal_eval($block->pages);

drupal_eval 関数は includes/common.inc で定義されており、要は引数文字列を PHP コードとして eval した結果を返す。引数の $block->pages には、上のテーブルから読み取った行の pages 列の値がセットされている。なるほど、[ページ] ボックスに入力したコードはここで実行されているわけか。

ということは、このコンテキストで使えるグローバル変数なら、[ページ] ボックスに書くコードでも使えるわけだな。
それならばと、実際にデバッガ上で動かし、eval の直前でブレークして Variables 見てみたら、こんなふう。
(スーパーグローバル配列以外の部分を切り取り)

変数一覧

$user 以外はあまり使わないかもしれないけど、まあ、いつか何かの役に立つかもしれないということで。
というか、このへんの情報はどこかにまとまった資料があってもよさそうな、ありそうな。