ecos资源探测器
两种类型的资源探测器
xml文件资源探测器
目录资源探测器
系统内置的资源探测器(核心)
数据库定义目录资源探测器 -base_application_datable 关注dbschema
service资源探测器 -base_application_service 关注services.xml
语言包资源探测器 -base_application_lang
缓存更新探测器 -base_application_cache_expires
位置解释
base-》app名称
application-》lib/application
datable-》datable.php文件
其余的资源探测器,都通过service的形式注册,注册点为app_content_detector (detector探测器的意思)
这里怎么实现的过会再说???
查看系统里目前已注册的资源探测器
dev:show services | grep -i app_content_detector (dev:show services 所有注册的service,grep -i app_content_detector从这些注册的service中找资源探测器)//这个命令只适合与linux
windows命令未找到,等找到会补上---------------------------------------------------???
资源探测器开放!!!
级联结构
Iterator(迭代器)接口
base_application_prototype_content 使用 Iterator 接口(implements)
位置app/base/lib/application/prototype/content.php
base_application_prototype_filepath 继承 base_application_prototype_content
base_application_prototype_xml 继承 base_application_prototype_content
filepath.php提供可以遍历目录里所有文件或目录的接口
xml.php提供可以遍历xml文件下某个节点下所有子节点的接口
例子
开发xml文件资源探测器
desktop作为例子
菜单探测器针对desktop.xml内寻找permissions下所有permission子节点
<desktop> <permissions> <permission id="shopsetting" display='true'>商店设置 </permission> <permission id="setting" display='true'>数据管理</permission> <permission id="performance" display='true'>缓存,队列,计划任务管理</permission> <permission id="users" display='true'>权限管理</permission> <permission id="other" display='true'>其他</permission> </permissions> </desktop>
建立探测器类文件(那个app下探测什么,该探测器继承与那类探测器)
<?php class desktop_application_permission extends base_application_prototype_xml{ }
位置app/desktop/lib/application/permission.php
注册成service
在service中进行注册
app/desktop/desktop.xml(配置文件)(app_conetent_detector service box id意思)
<services> ... <service id="app_content_detector"> <class>desktop_application_permission</class> </service> ... </services>
补充desktop_application_permission类
<?php class desktop_application_permission extend base_application_prototype_xml{ var $xml='desktop.xml';//指定要探测的xml资源文件,本例中会调用app/desktop/desktop.xml var $xsd='desktop_content';//指定xml对应的xsd位置,本例是app/desktop/xmlschema/content.xsd(为何不是desktop_xmlschema_content) var $path='permissions/permission';//指定xml节点 }
desktop.xml下permissions节点下所有permission子节点
current
设置当前遍历子节点的内容$current和当前元素的键$key
通过$this->iterator()->current()可以获取当前xml子节点的array数据
本例中是当前permissions/permission节点数据
<?php class desktop_application_permission extends base_application_prototype_xml{ function current(){ $this->current = $this->iterator->current(); $this->key = $this->current['id'] ; return $this; } }
install
install app_name时调用
需要重载,安装当前遍历节点的数据
<?php class desktop_application_permission extend base_application_prototype_xml{ function row(){ $row = array( 'menu_type'=>$this->content_typename(); 'app_id'=>$this->target_app->app_id ); $row['menu_title']=$this->current['value']; $row['display'] = $this->current['display']; $access_opct=array( 'show'=>$this->current['show'], 'save'=>$this->current['save'] ); $row['addon']=serialize($access_opct); $row['permission']=$this->current['id']//$this->key; return $row; } function install(){ kernel:log('Installing'.$this->content_typename().' '.$this->key()); return app:get('desktop')->model('menus')->insert($this->row()); } }
到这里就解释了资源探测器的作用了,探测资源,获取资源,操作资源
clear_by_app
资源卸载,在uninstall app_name时调用
<?php class desktop_application_permission extends base_application_prototype_xml { function clear_by_app($app_id){ if(!$app_id){ return false; } app::get('desktop')->model('menus')->delete(array( 'app_id'=>$app_id,'menu_type' => $this->content_typename())); }
update
资源更新 update app_name时调用 不需要重载(基类有这个函数)
active_by_app
active app_name时调用 不需要重载(基类有这个函数)
pause_by_app
pause app_name时调用 不需要重载(基类有这个函数)
如何开发目录型资源探测器
类似
去掉$xml和$xsd属性
去掉current()函数,基类提供的函数默认设置$key为文件名/目录名
增加filter()函数,可以只遍历$path目录下关注的文件和目录
增加getPathname(),可以取得当前节点的目录名
增加getFilename(),可以取得当前节点的文件名