LoginSignup
0
0

More than 5 years have passed since last update.

Pligg 2.0 モジュールの動き: コードリーディング

Last updated at Posted at 2013-08-03
  • 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に書き込んでいる!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0