新 phpPgAdmin 插件架构 GSoC 2011
开发者
学生:Leonardo Augusto Sápiras
导师:Jehan-Guillaume de Rorthais
副导师:Andreas Scherbaum
概要
该项目将使用 Hook 模式为 phpPgAdmin 创建一个新的插件架构。
对 PostgreSQL 社区的益处
当前的 phpPgAdmin 插件架构已经过时,只有一个插件 Slony。现在,要创建一个插件,开发人员需要在 phpPgAdmin 核心内编写侵入式代码,就像 Slony 现在所做的那样,这不是很好。有了新的架构,可以开发更多无需侵入式代码的 phpPgAdmin 内部创意。
通过一个好的插件架构,新的插件将更容易创建和维护,phPgAdmin 将拥有更多用户,可能还会拥有更多开发人员和合作者。
有一些想法正在等待新的架构作为插件开发。例如
- dbdesigner 插件
- pgpooladmin 插件
- crud 插件
这个项目在一段时间前在 phpPgAdmin 邮件列表中被讨论过,在几个月前我和 Jehan-Guillaume de Rorthais 先生之间也被讨论过。去年 Jehan-Guillaume 是我的导师,所以我希望他再次成为我的导师。
可量化的结果
- 重构当前的插件架构,创建一个插件管理器来处理插件;
- 创建一个新插件,为用户提供如何创建和将插件与 PPA 核心集成的实时示例;
- 测试;
- 文档:如何为 phpPgAdmin 创建插件并将其与组件集成(操作按钮、浏览器树、路径、选项卡、导航链接、顶部链接);
- 如果有足够的时间,我会重构当前的 Slony 插件,使此功能与新的架构一起使用。
项目细节
重构当前的插件架构
在 2011 年 Google Summer of Code 的参与中,我的目标是重构当前的插件架构。
新插件将具有以下结构
-plugin |--conf/ | |--config.inc.php |--lang/ | |--recoded | | |--english.php | |--english.php | |--Makefile |--js/ |--classes/ |--images/ |--help/ |--tests/ (可选) |--themes/ (可选) |--ppa_plugin.php
如上所示,插件将拥有自己的页面、翻译和配置文件。
新的插件架构将使用 Hooks 模式 开发。这样,插件将注册它们要挂钩的事件的函数。有很多应用程序使用这个概念,比如 Drupal 开源 CMS 所做的那样。
里程碑
此架构上的插件将能够
- 在任何级别(1)的浏览器树中添加条目
- 在选项卡(2)中添加条目
- 在路径(3)中添加条目
- 在导航链接(4)中添加条目
- 在操作按钮(5)中添加条目
- 在顶部链接(6)中添加条目
插件激活
要在 phpPgAdmin 中激活新插件,需要在 PPA 配置文件 (config.inc.php) 中添加一个新变量(数组)$conf['plugins']。因此,要激活插件,用户只需在此数组中添加插件的名称。示例
/* config.inc.php */ ... $conf['plugins'][] = 'ppa_slony'; $conf['plugins'][] = 'ppa_x'; $conf['plugins'][] = 'ppa_another'; ...
插件执行
phpPgAdmin 将有一个插件管理器,顾名思义,它将管理已激活的插件。下面是一个 plugin_manager.php 可能看起来的样子
<?php class PluginManager { ... function add_plugin($obj_plugin) { $this->plugins_list[$obj_plugin->get_name()] = $obj_plugin; } function get_plugin($plugin_name) { return $this->plugins_list[$plugin_name]; } function add_plugins_functions($plugin_name, $when, $function_name) { $this->plugins_functions[$when][] = array('plugin_name' => $plugin_name, 'function_name'=> $function_name); } function execute_plugins_funtions($when) { foreach ($this->plugins_functions[$when] as $node) { $plugin_name = $node['plugin_name']; $function_name = $node['function_name']; $obj_plugin = $this->get_plugin($plugin_name); if (method_exists($obj_plugin, $function_name)) { call_user_func(array($obj_plugin, $function_name)); } } } ... } ?>
此插件管理器将在 lib.inc.php 文件中使用,实例化和注册插件及其函数,如下例所示
<?php /* lib.inc.php */ ... $obj_plugin_manager = new PluginManager(); //注册插件及其函数 foreach ($activated_plugins as $plugin) { include_once('./plugins/'.$plugin.'/plugin.php'); $obj_plugin = new $plugin($obj_plugin_manager); $obj_plugin_manager->add_plugin($obj_plugin); } ... ?>
在插件中,函数将使用一个属性注册,该属性说明它们将在 phpPgAdmin 核心中的哪里使用。下面是一个简单插件的示例
<?php ... class Plugin1 { ... function __construct($obj_plugin_manager) { $obj_plugin_manager->add_plugins_functions($this->name, 'before_trail_creation', 'create_trail_links'); $obj_plugin_manager->add_plugins_functions($this->name, 'after_show_tabs', 'show_tab_links'); } function create_trail_links() { /* 显示插件的路径链接 */ } function show_tab_links() { /* 显示插件的选项卡链接 */ } } ?>
因此,在 phpPgAdmin 的特定位置,例如创建浏览器树、路径或选项卡的函数,插件的函数将被调用,如下所示
<?php ... $obj_plugin_manager->execute_plugins_funtions('before_trail_creation'); ... $obj_plugin_manager->execute_plugins_funtions('after_show_tabs'); ... ?>
这样,插件将“告诉”phpPgAdmin 核心,它的哪些元素将在 PPA 组件中显示。
为了演示,我创建了一个 基本的功能示例。
项目时间表
在 2011 年 Google Summer of Code 期间,我将在 IRC(irc.freenode.net)频道 #phppgadmin、#postgresql 和 #gsoc 上在线,随时可以进行交流。而且,我将至少每周与导师联系一次,报告已完成的工作、下周将要完成的工作以及阻止我进行某些活动的因素。我也将在我的 博客 中记录我的活动。
如果同时开发其他项目创意,则需要联系这些应用程序的开发人员,以提供他们运行测试的版本。但这将与我的导师和 phpPgAdmin 开发人员一起确定。
可以在 Google Calendar(略有改动)中找到此时间表副本。
4 月 25 日至 5 月 22 日(社区联络期):在此期间,我将与我的导师和 phpPgAdmin 开发人员保持联系,详细说明已接受的提议。我还会与他们一起审查我的项目,看看在开始编码之前是否遗漏了什么;
5 月 23 日:我开始编码,创建新的基本插件结构,它将用作其他开发人员的示例;
5 月 27 日:与导师会面,我会向他展示基本插件架构,并开始开发插件管理器;
6 月 3 日:与导师会面。开始开发基本插件示例与选项卡和顶部链接之间的集成;
6 月 10 日:与导师会面;
6 月 17 日:与导师会面。在这一天,我将开始开发插件与路径之间的集成;
6 月 24 日:与导师会面。在这一天,我将开始开发插件与导航链接之间的集成;
7 月 1 日:与导师会面;
7 月 8 日:与导师会面。完成与导航链接的集成。开始开发与操作按钮的集成;
7 月 11 日至 15 日:创建和提交中期评估;
7 月 15 日:与导师会面;
7 月 22 日:与导师会面。开始将插件与浏览器树集成;
7 月 29 日:与导师会面;
8 月 5 日:与导师会面。完成与浏览器树的集成。开始测试并进行最终修改;
8 月 12 日:与导师会面。在这一天,我将停止编码,并开始创建最终文档;
8 月 19 日:与导师会面。审查文档;
8 月 22 日:完成文档;
8 月 22 日至 26 日:提交最终评估;
完成标准
如果新的架构插件实现了以下功能,则该项目将完成
- 使开发人员能够轻松地创建插件,并提供清晰的文档
- 使新插件能够添加到操作按钮、浏览器树、选项卡、路径、导航链接和顶部链接中
- 使插件能够在 phpPgAdmin 核心内没有侵入式代码
- 提供一种简单的方法来启用和禁用插件