ELGG的开发学习

来源:互联网 发布:分布式算法导论 pdf 编辑:程序博客网 时间:2024/06/17 16:35

突发奇想,写这个博客,是因为在网站关于ELGG的框架介绍的东西太少了,而且有的也都是不痛不痒的东西,很少对学习有帮助,所以写点东西。

首先,如果你以前学习过MVC的框架,可以进行映射学习,但却又不完全一样,这里的M也就是与数据库打交道的MOUDLE你可以对应的去看ELGGENTITY,ELGGmetedata以及ELGGanntion这三个文件在engine目录下的CLASS文件里面会有。而C,也就是contorller说白了,你只需要把elgglib(class目录下),以及单独的action文件看一下就可以大致明白到底如何实现控制的,对于view需要看engine/lib中的view文件就可以明白视图到底是如何传递并且交互的.

说道这里,可能你还觉得很模糊,因为你可能照着看了一遍也没太大收获.其实是因为,你在看的时候没有注意到里面的几个重要的全局变量,这里我就列举一个最最重要的$config,可以说这个全局变量是ELGG布局中的最最核心的地方.

ELGG有着低耦合的特性,所以可以说各个文件的相互依赖性很小,仅仅是依赖着全局变量维系着交互.这里面我要说最最重要的event与hook这2大机制,ELGG之所以可以有良好的拓展性,就是因为event与HOOK,大致的原理是你如果想让某个事件添加动作,首先你要想ELGG的核中注册,告诉它我注册了这么一个事件,然后在别的地方,会相应的检测全局变量$config是否配置了这么一个事件,如果注册就到相应的地方把事件调出来,所以来才可以不断添加插件,而不影响正常核的运转.

这里我把关键文件的一些解读贴上后续的研读以及实例慢慢告知:

为了更好的理解,希望你从install那部分文件挖起,不然你可能都不知道

为何ELGG的核可以和数据库交互,以及ELGG那张数据表到底是怎么生成的.
//最近版本的Elgg用的命名空间;


autoload这个文件还是很问题,我在想注册时间以及一些自动执行是不是和这个有关系?


帮助理解的数据表单:

1.ELGGINstaller

$steps (array) ‘welcome’,
‘requirements’,
‘database’,
‘settings’,
‘admin’,
‘complete’,

$status (array) ‘config’ => FALSE,
‘database’ => FALSE,
‘settings’ => FALSE,
‘admin’ => FALSE,

isAction

autologin

方法:
bootstrapEngine() 720行 加载elgg的lib;
finishBootstraping() 752行 完成剩余加载;
bootstrapConfig() 830行 加载配置变量; CONFIG>wwwroot=this->getBaseUrl();
CONFIG>url=CONFIG->wwwroot;
$CONFIG->path = dirname(dirname(FILE)) . ‘/’;
CONFIG>viewpath=CONFIG->path . ‘views/’;
CONFIG>pluginspath=CONFIG->path . ‘mod/’;
CONFIG>context=array();CONFIG->entity_types = array(‘group’, ‘object’, ‘site’, ‘user’);

checkDataSetting() 1184行 检查数据库的配置;

createSettingsFile(params)1281params来重新生成SETTINGS的文件;

connectToDatabase() 1250行 在整个引擎可用之前链接数据库;

installDatabase() 1277行 安装全部的数据表,其中执行了,这里需要加载database,

                                 run_sql_script()来执行schema下的数据表格;       

validateSettingsVars 1339行 尚未完全明白意图;

saveSiteSettings() 1409行 初始化网站配置;

createAdminAccount() 最后面 创建用户;

2.
关于ELGGPLUGIN与Plugin并未有什么收获,需要继续精读。

plugin 与ElggPlugin
ELGGPLUGIN类中:
private package;privatemanifest;

private $path;private $pluginID;private $errorMsg = '';

觉得重要的方法是:

getManifest()返回一个ElggManifest对象;

3.user

4.elgglib(可以说是最重要的一个库,核心库);

elgg_regist_classes() 43行 加载全部的类文件;

elgg_regist_class() 60行 加载单一的类文件;

elgg_register_library() 81行 注册一个php的库;

elgg_load_library() 101行 加载一个数据库;

elgg_regist_external_file() 一大堆加载注册外部文件; 从296到434;

sanitise_filepath() 498行 清理文件路径,确保以/开头,并且以/结尾.

system_messages(message=null,register = “success”, $count = false)

                            546行

system_message() 605行 将系统消息存放在下一页;

elgg_register_event_handler(event,object_type,callback,priority);

                            681行           将事件注册在全局变量中:

全局变量存储事件的方式:CONFIG>events[event][type][priority] = $callback,通过以回调函数的

方式命名,每当触发事件,即通过回调函数执行。这样全局只需要不断检索全局变量中的event即可找到

对应的事件是否注册以及如何执行;

elgg_register_event_handler() 722行 将相应的回调函数从全局中注销;

elgg_trigger_event(event,object_type, $object = null)

                              766行           调用所有注册到event事件下的处理函数

这里注意将eventobject_type视为第一命名空间。


Elgg events should only be triggered by core.

Plugin authors should use trigger_elgg_plugin_hook() instead。


                       call_user_func_array($callback,$args);                        这个函数很关键,这里将调用$callback,并且以$args为参数传递。

elgg_register_plugin_hook_handler(hook,type, callback,priority = 500)

                          存储原理基本上和event差不多,但是有细微差别这里hook好像可以                          改变参数以及终止运行;hook handler返回false不会改变执行的序列。                          Plugin hooks are sometimes used to gather lists from plugins.  This is

usually done by pushing elements into an array passed in $params.

elgg_unregister_plugin_hook_handler() ; //与event基本对应;

elgg_trigger_plugin_hook() ; //调用全部的插件钩子;

elgg_trigger_plugin_hook(hook,type, params=null,returnvalue = null);

                                     //调用全部的绑定的钩子函数

elgg_log()与elgg_dump()之间的关系:

       首先看elgg_dump($value, $to_screen = TRUE, $level = 'NOTICE')      //记录或者呈现数值                                        1181行                                                             如果$to_screen被设置为true则value可以被显示到屏幕上;              elgg_log()                                        除非$config->debug允许,不会发送消息。               

1243行有个函数未读感觉不是很重要:

current_page_url() 1312行 //获得当前页面的URL;

elgg_http_build_url(array parts,html_encode = TRUE)

                        1376行           //根据$parts参数,构建url;                  

elgg_add_action_tokens_to_url(url,html_encode = FALSE)

                        1411行          //使用此函数将动作令牌添加到url中的get参数;      

elgg_http_url_is_identical(url1,url2, $ignore_params = array(‘offset’, ‘limit’))

                        1505行           //用于检测两个URL是否功能相同!

elgg_extract(key,arrayarray, default=null,strict = true)

                                          //检查$array[$key]是否存在,存在则返回其值,                                          //否则返回$default

_elgg_shutdown_hook() 1775行 //

elgg_js_page_handler($page) 1804行 //搜索js目录下的view,
//outputs them with special
//headers for caching control.

elgg_cacheable_view_page_handler(page,type)

                          1878行                

**************:
后面关于walled一些API没有看!!!


晚上7.00-10.00阅读完view文件并且widget与wall也要搞懂

关于view文件API的阅读:

$CURRENT_SYSTEM_VIEWTYPE //全局变量决定当前视图的类型;

elgg_set_viewtype() 73行 //设置当前的视图类型,还有清空的功效;

elgg_get_viewtype() 97行 //获取当前视图类型;

elgg_register_viewtype() 125行 //通过config配置视图类型;

elgg_is_valid_view_type() 148行 //检车当前视图是否有效;

1 0