- Pligg 2.0 のモジュールの動作のコード追うよ
- コードかなり古くてヒドイよ
要約: 処理の流れ
_init.php をはじめに呼ぶというルールの様子
http://pligg.example.jp/module.php?module=rss_import_do_import のようなURLを叩く
/modules/modules_init.php を呼ぶ
/modules/モジュール名/モジュール名_init.php を呼ぶ
モジュール名_init.php で module_add_action('', '', '') して $module_actions 配列に追加
こんな感じ $module_actions[$location][$the_function] = $weight;
$module_actions 追加したものを weight 順に実行
module の動き編
起点
以下のURLを管理画面から叩く
http://pligg.example.jp/module.php?module=rss_import_do_import
- module.php 内で check_action()
/modules/modules_libs.php 内
modules_libs.php には、モジュールに必要な(共通の?) funciton がclassとかでなくそのまま入っている。
function check_actions($location, &$vars)
{
global $module_actions;
$vars['location'] = $location;
if($module_actions[$location]){
uasort($module_actions[$location], 'actioncmp');
foreach ( $module_actions[$location] as $kk => $vv ) {
call_user_func_array($kk, array(&$vars));
}
}
}
global $module_actions ってなんだよ?
グローバル汚染がヒドイ。
/modules/modules_init.php
モジュールのファイル読み込みはここで。
if($modules){
// for each module...
foreach($modules as $module) {
$file=mnmmodules . $module->folder . '/' . $module->folder . '\
_init.php';
// if this module has an init file then include it
if (file_exists($file)) { include_once($file); }
}
}
どうやら _init.php をはじめに呼ぶというルールのようだ
$module_actions=array();
初期化しているだけ?
モジュール名_init.php を読む
rss_import の場合
if($moduleName == 'rss_import_do_import'){
module_add_action('module_page', 'rss_import_do_import', '');
include_once(mnmmodules . 'rss_import/rss_import_main.php');
}
module_add_action('', '', '') してる
module_add_action('', '', '') の定義
定義は、 modules_libs.php 内
module_add_action('module_page', 'rss_import_do_import', '');
は以下。
function module_add_action($location, $the_function, $variables, $weight = array ('weight' => 0) )
{
global $script_name, $module_actions, $include_in_pages, $do_not_include_in_pages;
if(is_array($include_in_pages)){
if (in_array($script_name, $include_in_pages) || in_array('all', $include_in_pages)) {
if(is_array($do_not_include_in_pages) && in_array($script_name, $do_not_include_in_pages))
return;
$module_actions[$location][$the_function] = $weight;
}
}
}
global祭り! \(^o^)/
コード追っかけるのもう嫌になる!
weight の順にfunctionを実行するために $module_actions に入れていると予想。
/modules/modules_libs.php 内で順番に実行
で、一番最初のここに戻ってきて、actioncmp で weight を比較してfunctionを順番に実行
function check_actions($location, &$vars)
{
global $module_actions;
$vars['location'] = $location;
if($module_actions[$location]){
uasort($module_actions[$location], 'actioncmp');
foreach ( $module_actions[$location] as $kk => $vv ) {
call_user_func_array($kk, array(&$vars));
}
}
}
こんな感じ…
逆に言うと、モジュールを作る場合は、モジュール名_main.php に関数書いて、それをURLの引数に入れる。
ちなみに rss_import モジュールの import時のメインの動作の関数は、smarty のテンプレート内にあるよ!! 泣きそうだね!
/rss_import/template/import_fields_center.tpl 内でRSS呼んでDBに書き込んでいる!