wecenter 학습 노트 - 플러그인 메커니즘

5871 단어
이 글은 wecenter 학습 노트의 일부분이다
플러그인 메커니즘
wecenter는 초급 플러그인 모델을 가지고 있지만 아쉽게도 제3자가 이 메커니즘을 바탕으로 플러그인을 개발하지 않았고 공식 사이트에서 제출한 도 2차 개발 방식일 뿐 플러그인을 바탕으로 개발한 것이 아니다.
현재 플러그인
프로젝트에 두 개의 플러그인 내장
  • aws_external
  • aws_offical_external

  • 몇 개의utility 함수를 제공하였다
    플러그인 구조
    일반적인 플러그인 구조는 다음과 같습니다.
    모든 플러그인은plugins의 디렉터리이고 디렉터리의 config.php 은 플러그인의 메타데이터 정보입니다
    $aws_plugin = array(
        'title' => 'External for Anwsion',  //     
        'version' => 20130107,  //     
        'description' => 'Anwsion       ',  //     
        'requirements' => '20120706',   //    Build   
        
        'contents' => array(
            //            (setup)
            'setups' => array(
                array(
                'app' => 'app',
                'controller' => 'controller',
                'include' => 'aws_plungin_controller.php'
                )
            ),
        
            //      Action      (         )
            'actions' => array(
                array(
                'app' => 'app',
                'controller' => 'controller',
                'action' => 'action',
                'template' => 'template.tpl',
                'include' => 'aws_plungin_controller.php'
                )
            ),
            
            //    Model,   $this->model('name')   
            'model' => array(
                'class_name' => 'aws_offical_external_class',   // Model name,   _class   
                'include' => 'aws_offical_external.php',    //         
            ),
        ),
    );
    

    구성에는 주로 다음 정보가 포함됩니다.
  • 초기화 코드
  • action
  • model

  • 플러그인의 메타데이터 로드
    적용 시작 시 플러그인 관리자 로드(core plugins)
    aws_app.inc.app#init
    117 self::$plugins = load_class('core_plugins');
    

    모든 플러그인 디렉토리를 검색하고 메타데이터를 로드합니다.
    aws_app.inc.app#load_plugins()
    $dir_handle = opendir($this->plugins_path);
    
    while (($file = readdir($dir_handle)) !== false)
    {
        if ($file != '.' AND $file != '..' AND is_dir($this->plugins_path . $file))
        {
            $config_file = $this->plugins_path . $file . '/config.php';
    
            if (file_exists($config_file))
            {
                $aws_plugin = false;
    
                require_once($config_file);
    
                if (is_array($aws_plugin) AND G_VERSION_BUILD >= $aws_plugin['requirements'])
                {
                    if ($aws_plugin['contents']['model'])
                    {
                        $this->plugins_model[$aws_plugin['contents']['model']['class_name']] = $this->plugins_path . $file . '/' . $aws_plugin['contents']['model']['include'];
                    }
    
                    if ($aws_plugin['contents']['setups'])
                    {
                        foreach ($aws_plugin['contents']['setups'] AS $key => $data)
                        {
                            if ($data['app'] AND $data['controller'] AND $data['include'])
                            {
                                $this->plugins_table[$data['app']][$data['controller']]['setup'][] = array(
                                    'file' => $this->plugins_path . $file . '/' . $data['include'],
                                );
                            }
                        }
                    }
    
                    if ($aws_plugin['contents']['actions'])
                    {
                        foreach ($aws_plugin['contents']['actions'] AS $key => $data)
                        {
                            if ($data['app'] AND $data['controller'] AND $data['include'])
                            {
                                $this->plugins_table[$data['app']][$data['controller']][$data['action']][] = array(
                                    'file' => $this->plugins_path . $file . '/' . $data['include'],
                                    'template' => $data['template']
                                );
                            }
                        }
                    }
    
                    $this->plugins[$file] = $aws_plugin;
                }
            }
        }
    }
    
    closedir($dir_handle);
    

    캐시에 메타데이터 쓰기
    플러그인 로드
    Controller의 초기화 함수는 매개 변수에 따라 대응하는 플러그인을 불러옵니다
    aws_controller.inc.php#__construct
    //     
    if ($plugins = AWS_APP::plugins()->parse($_GET['app'], $_GET['c'], 'setup'))
    {
        foreach ($plugins as $plugin_file)
        {
            include $plugin_file;
        }
    }
    

    템플릿 렌더링 시 플러그인 불러오기
    system/class/cls_template.inc.php#output
    if ($plugins = AWS_APP::plugins()->parse($_GET['app'], $_GET['c'], $_GET['act'], str_replace(self::$template_ext, '', $template_filename)))
    {
        foreach ($plugins AS $plugin_file)
        {
            include_once $plugin_file;
        }
    }
    

    이 밖에 정시 작업도 플러그인을 불러일으킨다
    app/crond/main.php#run_action
    if ($plugins = AWS_APP::plugins()->parse('crond', 'main', $call_action))
    {
        foreach ($plugins AS $plugin_file)
        {
            include($plugin_file);
        }
    }
    

    플러그인 사용 방법
    Autoload는 Plugin에서 모델 클래스를 불러오는 것을 처리하기 때문에 모든 모델 클래스의 사용 방식은 다르지 않습니다.예:
    $this->model('aws_external')->format_js_question_ul_output($_GET['ul_class'],$_GET['is_recommend']));
    

    자동 도입 메커니즘 및 Autoload← o→Cache의 실현 원리

    좋은 웹페이지 즐겨찾기