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


- 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とかでなくそのまま入っている。

```php
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

モジュールのファイル読み込みはここで。

```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 の場合

```php
        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', '');

は以下。

```php
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を順番に実行

```php
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に書き込んでいる!