Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.
  • 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('', '', '') して $moduleactions 配列に追加

  • こんな感じ $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に書き込んでいる!

hshimo
ブロックチェーン専門企業、コンセンサス・ベイス代表、志茂 博の技術メモ。 興味ある方は、日本ブロックチェーンユーザ会へ。http://crypto-tech.jp/
https://www.consensus-base.com/
consensus-base
ブロックチェーン技術の専門企業。大企業様を中心に国内有数の実証実験・開発の実績があり、様々な実装の経験・ノウハウがある。
https://www.consensus-base.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away