CGI の実装: CGI 関連クラスの継承関係
config.cgi では、@ISA (継承関係)が次のようになっています。
FML::CGI::Menu FML::Process::CGI::Kernel FML::Process::CGI::Param
thread.cgi の継承も同様で、次のようになっています。
FML::CGI::Thread FML::Process::CGI::Kernel FML::Process::CGI::Param
各 .cgi 固有のコードは FML::CGI:: の階層に置くようにしています。
固有でないコード(.cgi 群で共有するコード)は
FML::Process::CGI::Kernel に定義されています。
ここには、
プロセス全体の制御部分と、
デフォルトの CGI 固有関数「run_cgi_なんとか()」が定義されています。
必要に応じて FML::CGI:: の階層で、
これらのメソッドをオーバーロードしてください。
なお、FML::Process::CGI::Kernel の以下のメソッドは定義されているだけで、
実際には使われていません。
run_cgi_log
run_cgi_dummy
run_cgi_date
CGI の実装: config.cgi の実装
前述のように config.cgi の場合、継承関係は次のようになっています。
FML::CGI::Menu FML::Process::CGI::Kernel FML::Process::CGI::Param
以下では、config.cgi の処理をみてみましょう。
config.cgi のプロセスオブジェクト $curproc は
FML::Process::CGI::Kernel クラスです。
FML::Process::CGI::Kernel では
new()
prepare()
verify_request()
run()
finish()
が順に呼ばれます。
重要なのは run() です。run() は
$curproc->html_start(); (FML::CGI::Menu)
$curproc->_drive_cgi_by_table(); (FML::Process::CGI::Kernel)
$curproc->html_end(); (FML::CGI::Menu)
を実行します。
CGI の画面を作る実体は _drive_cgi_by_table() メソッドです。
このメソッド内から呼ばれる関数が CGI のメイン部分です。
$curproc->_drive_cgi_by_table() メソッドは、
以下の各「run_いろいろ()」メソッド群を呼び出します。
たとえばコマンドを実行するメイン部分が run_cgi_main です。これは、
cgi_execute_command (FML::Process::CGI::Kernel) を呼び出し、
FML::Command 経由で「FML::Command::Admin::コマンド」クラスを実行します。
これが、GUI からコマンドを実行するコードの本体です。
画面の表示をするには別のメソッド群が呼ばれています。
たとえば GUI から「ユーザのメールアドレスを登録する」場合、
run_cgi_menu() が入力画面の生成をおこないます。
run_cgi_menu() は cgi_execute_cgi_menu() 経由で各コマンドクラスの
「FML::Command::Admin::コマンド::cgi_menu()」を実行しています。
この場合 FML::Command::Admin::subscribe::cgi_menu()
メソッドを呼び出しています。
ちなみに、実際の登録作業をする run_cgi_main() は、
FML::Command::Admin::subscribe::process()
メソッドを呼び出しています。
他にも run_cgi_* 関数がありますが、
これらは画面の作りに関係する補助的なものたちといってよいでしょう。
次の2つのメソッドは、たいていデフォルトのものを使っています。
run_cgi_title FML::Process::CGI::Kernel クラス (タイトル表示)
run_cgi_options FML::Process::CGI::Kernel クラス (言語選択画面)
また、この .cgi 固有の画面作り関連メソッド群として次のものがあります。
run_cgi_navigator FML::CGI::Menu クラス
run_cgi_help FML::CGI::Menu クラス
run_cgi_command_help FML::CGI::Menu クラス
run_cgi_menu FML::CGI::Menu クラス
ヘルプなどはコマンドごとに違うわけですから、当たり前ですね?
ただ、メッセージが異なるとかいうだけで、モジュールが違っても、
ほぼ似たようなつくりです。