突发奇想,写这个博客,是因为在网站关于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)1281行通过设置 params来重新生成SETTINGS的文件;
connectToDatabase() 1250行 在整个引擎可用之前链接数据库;
installDatabase() 1277行 安装全部的数据表,其中执行了,这里需要加载database,
run_sql_script()来执行schema下的数据表格;
validateSettingsVars 1339行 尚未完全明白意图;
saveSiteSettings() 1409行 初始化网站配置;
createAdminAccount() 最后面 创建用户;
2.
关于ELGGPLUGIN与Plugin并未有什么收获,需要继续精读。
plugin 与ElggPlugin
ELGGPLUGIN类中:
private
package;private
manifest;
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事件下的处理函数
这里注意将 event视为第二命名空间,而将 object_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,array array, 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行 //检车当前视图是否有效;