站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
▼
建站程序
开发
服务器
办公软件
开发教程
▼
服务器教程
软件使用教程
运营教程
热门电子书
▼
CSS教程
WordPress教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
热点词条
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
Xoops ORM对象关系映射1
”(章节)
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
===使用Frameworks库=== 在上一章讲解了如何开发数据对象,为了广泛的适应各种需求,[[XOOPS]]系统提供的数据对象机制并没有涉及实际的[[SQL]]语句,需要由模块开发者自行构造SQL语句。而从大量的模块开发实践来看,模块中所使用的大多数SQL语句都具有一些共同特征,这些共同特征被称之为ORM(Object- Relation Mapping,对象关系映射)机制。 说明:对象关系映射(Object Relational Mapping,简称ORM),是一种用于实现从对象数据到关系数据的存储映射的技术。 [[面向对象]]是从[[软件工程]]基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。(摘自zh.wikipedia.org) 在XOOPS内核的基础上,可以使用Frameworks库,Frameworks库提供广泛的模块开发所需的库函数支持,其中包括较为完善的 ORM实现,基于Frameworks库的ORM技术开发模块可以大大节约模块的开发时间,同时还能减少编写SQL语句疏忽导致的安全风险。本节将继续前述章节的实例讲解如何使用Frameworks库的ORM技术。本例的文件夹结构如下: <pre> /modules/ormframeworks /class /contact.php /images /logo.png /sql /mysql.sql /templates /ormframeworks_index.html /index.php /xoops_version.php </pre> 其中xoops_version.php的内容如下: <pre> /modules/ormframeworks/xoops_version.php <?php $modversion['name'] = "ORM对象关系映射 - Frameworks"; $modversion['version'] = 0.01; $modversion['description'] = "演示如何使用Frameworks库"; $modversion['author'] = <<<AUTHOR 胡争辉 QQ: 443089607 QQMail: hu_zhenghui@qq.com GTalk: huzhengh GMail: huzhengh@gmail.com Skype: huzhenghui" AUTHOR; $modversion['credits'] = ""; $modversion['license'] = "版权所有"; $modversion['image'] = "images/logo.png"; $modversion['dirname'] = "ormframeworks"; $modversion["hasMain"] = 1; $modversion["sqlfile"]["mysql"] = "sql/mysql.sql"; $modversion["tables"][] = "ormframeworks_contact"; $modversion["templates"][0]["file"] = "ormframeworks_index.html"; $modversion["templates"][0]["description"] = "Template for index.php"; ?> </pre> 为便于对照学习,数据结构与上例类似,mysql.sql的内容如下: <pre> /modules/ormframeworks/sql/mysql.sql CREATE TABLE `ormframeworks_contact` ( /* 详见源文件 */ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; INSERT INTO `ormframeworks_contact` (`id`, `firstname`, `lastname`, `QQ`, `QQMail`, `GTalk`, `GMail`, `Skype`) VALUES (1, '争辉', '胡', '443089607', 'hu_zhenghui@qq.com', 'huzhengh', 'huzhengh@gmail.com', 'huzhenghui'); </pre> 将数据对象更改为基于Frameworks库的ORM技术时,不会影响原有的页面,index.php文件源代码如下: <pre> /modules/ormframeworks/index.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; $contacthandler = xoops_getmodulehandler("contact", "ormframeworks"); /* @var $contacthandler OrmframeworksContactHandler */ $xoopsOption["template_main"] = "ormframeworks_index.html"; include XOOPS_ROOT_PATH."/header.php"; /* @var $xoopsTpl XoopsTpl */ $contacts = $contacthandler->getAll(); $xoopsTpl->assign_by_ref("contacts", $contacts); include XOOPS_ROOT_PATH."/footer.php"; ?> </pre> 也不会影响模板,ormframeworks_index.html文件的源代码如下: <pre> /modules/ormframeworks/templates/ormframeworks_index.html <{strip}> <table> <!-- 详见源文件 --> </table> <{/strip}> </pre> 修改范围主要涉及数据对象文件中数据访问句柄,contact.php文件的源代码如下: <pre> /modules/ormframeworks/class/contact.php <?php if (false === defined("XOOPS_ROOT_PATH")) { exit(); } if (false === defined("FRAMEWORKS_ART_FUNCTIONS_INI")) { require_once XOOPS_ROOT_PATH.'/Frameworks/art/functions.ini.php'; } load_object(); class OrmframeworksContact extends ArtObject { function OrmframeworksContact() { $this->ArtObject("ormframeworks_contact"); /* 详见源文件 */ } } class OrmframeworksContactHandler extends ArtObjectHandler { function OrmframeworksContactHandler ($db) { $this->ArtObjectHandler($db, "ormframeworks_contact", "OrmframeworksContact", "id"); return; } } ?> </pre> 首先检查是否定义了XOOPS_ROOT_PATH常量。 <pre> if (false === defined("XOOPS_ROOT_PATH")) { exit(); } </pre> 在XOOPS系统中,所有的PHP文件都应当经过mainfile.php进行安全检查。因此直接被用户访问的[[PHP]]文件应当在开始处包含 mainfile.php文件,不直接被用户访问的PHP文件应当通过检查XOOPS_ROOT_PATH常量保证已包含过mainfile.php文件。然后包含Frameworks库的初始化文件。 <pre> if (false === defined("FRAMEWORKS_ART_FUNCTIONS_INI")) { require_once XOOPS_ROOT_PATH.'/Frameworks/art/functions.ini.php'; } </pre> 基于Frameworks库的[[程序]]都应该包含Frameworks库的初始化文件。由于本文件需要使用Frameworks库的ORM类,所以调用加载ORM类的函数。 load_object(); 该函数定义在functions.ini.php文件中。 <pre> /Frameworks/art/functions.ini.php function load_object() {} </pre> 将数据对象修改为基于Frameworks库时,仅需少量的改动,首先数据对象应继承自ArtObject类。 class OrmframeworksContact extends ArtObject {} ArtObject类定义在Frameworks库的object.php文件中。 <pre> /Frameworks/art/object.php class ArtObject extends _XoopsPersistableObject {} </pre> 然后在数据对象的构造函数中初始化数据表名称。 <pre> $this->ArtObject("ormframeworks_contact"); </pre> 这样就完成了数据对象的改造,初始化字段的代码保持不变。下面改造数据访问句柄,类似的基于Frameworks库的数据访问句柄应继承自ArtObjectHandler类。 class OrmframeworksContactHandler extends ArtObjectHandler {} ArtObjectHandler类定义在Frameworks库的object.php文件中。 <pre> /Frameworks/art/object.php class ArtObjectHandler extends _XoopsPersistableObjectHandler {} </pre> 基于Frameworks库的数据访问句柄需要初始化数据库相关信息,因此定义数据访问句柄的构造函数。 function OrmframeworksContactHandler ($db) {} 其中$db参数是XOOPS系统的[[数据库]]对象,然后在数据访问句柄的构造函数中调用ArtObjectHandler类的构造函数初始化相关信息。 $this->ArtObjectHandler($db, "ormframeworks_contact", "OrmframeworksContact", "id"); ArtObjectHandler的构造函数定义在Frameworks库的object.php文件中。 <pre> /Frameworks/art/object.php function ArtObjectHandler(&$db, $table = "", $className = "", $keyName = "", $identifierName = false) {} </pre> 其中$db参数是数据库链接,$table参数是数据表的名称,$className参数是数据访问句柄对应的数据对象的类名,$keyName参数是数据表主键的名称,$identifierName参数用于getList函数。本例中$table的值是 ormframeworks_contact,$className的值是OrmframeworksContact,$keyName的值是id。通过对比可以发现,数据访问句柄并没有实现getAll函数,而在index.php中却调用了数据访问句柄的getAll函数,该函数继承自 Frameworks库的_XoopsPersistableObjectHandler类,定义如下。 <pre> /Frameworks/art/object.persistable.php function &getAll($criteria = null, $tags = null, $asObject = true) {} </pre> 在不传递参数时,getAll()函数将以数据对象的形式返回数据表中所有的数据。从本例可以看出,基于Frameworks库不再需要编写常用的数据访问函数。大大减轻了开发工作量。
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)