文章管理 - D.J.的 framework在开发中的应用(关于art类) imag1
文章管理 :: Xoops 模块 :: 模块开发

D.J.的 framework在开发中的应用(关于art类)


http://xoops.org.cn/modules/newbb/viewtopic.php?topic_id=12959
原作者:文明猪
art类相关部分已经整合到xoops2.3的内核中。此文内容当属模块中高级开发者的必修课程。

在实际开发应用中,有N多的数据库读写操作,如果每个都写成sql,是巨费事的事,但我不否认,直接写sql会有些执行效率的提高,但那提高的效率在一般的网站中几乎是显现不出来的,而快速的开发、及数据库读写的安全性是我们更多的考虑的。现在的代码工作不是要你从最底层的写起,而应该更注重应用层面,所以从今天开始,我将伴随我一个新的工作的进度,将D.J.的framework实际应用写给大家,希望大家在应用xoops时能更加的快速。

D.J. framework在开发中的应用 art类

在实际开发应用中,有N多的数据库读写操作,如果每个都写成sql,是巨费事的事,但我不否认,直接写sql会有些执行效率的提高,但那提高的效率在一般的网站中几乎是显现不出来的,而快速的开发、及数据库读写的安全性是我们更多的考虑的,老板总是问你:什么时候能完成?这时候你需要运用比较好的方法。

感谢D.J.把article模块中的art类总结出来,并加上其他的很多内容形成framework贡献给大家,使开发人员在实际的应用中提高了效率。

我不是纯粹的代码编写者,但我知道现在的代码工作不是要你从最底层的写起,而应该更注重应用层面,所以从今天开始,我将伴随我一个新的工作的进度,将D.J.的framework实际应用写给大家,希望大家在应用xoops时能更加的快速。


1.创建你的数据表

art类是在xoops的object的基础上继承的,最重要的工作是对数据库的读写,因此,按正常的工作一样,你先创建你的数据表,下面的表是工作中实际应用的一个表,你可以按你的需要自己创建一个。



#商家表

CREATE TABLE newphoto_store (

  ns_id mediumint(8) unsigned NOT NULL auto_increment,#序号

  np_pid mediumint(8) not null default 0,#父商家(不为0为子商家)

  uid mediumint(8) not null default 0,#管理人

  ns_name varchar(150) default '',#商家名称

  ns_sname varchar(150) default '',#商家简称

  ns_logo varchar(250) default '',#图标

  ns_address text NULL,#商家地址

  ns_postcode varchar(250) default '',#邮政编码

  ns_phone varchar(250) default '',#联系电话

  ns_linkman varchar(250) default '',#联系人

  ns_email varchar(250) default '',#联系email

  ns_desc text NULL,#商家介绍

  ns_clicked mediumint(8) not null default 0,#点击

  ns_status tinyint(1) default '1',#是否删除

  ns_style varchar(250) default '',#主打风格

  PRIMARY KEY  (ns_id),

  KEY  (np_pid),

  KEY  (ns_status)

) TYPE=MyISAM;



好了,这是一个实际应用的表,关于各个字段的作用大家就不必关心了,这是我们正在做的一个模块中的一个表,以后我们将以此表为例子来说明art类的基本使用。

2.创建一个基础类

基础类是是为初始化及相关操作准备的,有了它,你就可以继承使用art的其他的各个类了,这个类的名称我们命名为Store。

①在模块目录下面创建一个目录名称为class

②在class下面创建php文件store.php,注意:这里的文件名称为小写英文字母,文件名和类的名字相同


 


下面是这个文件的文件内容




/*

*下面保证是被其他的文件引用

*/

if (!defined("XOOPS_ROOT_PATH")) {

 exit();

}

/*

*下面判断是由已经定义了ArtObject,如果没有就require一下

*/

if(!class_exists("ArtObject")) {

 require_once(XOOPS_ROOT_PATH."/Frameworks/art/object.php");

}

/*

*这是基础类的主题,注意类的名称第一个字母要大写

*有关初始化的都有哪些类型,可以参考kernel中的object.php

*如果想深入了解这些类型是如何被操作的,可以查看kernel中的object.php或/Frameworks/art/object.persistable.php两个文件

*/

class Store extends ArtObject

{

    function Store( $id = null )

    {

 $this->ArtObject();

 $this->table = "newphoto_store";//这是调用的表的名称

        $this->initVar("ns_id", XOBJ_DTYPE_INT, null, false);//初始化int型

 $this->initVar("np_pid", XOBJ_DTYPE_INT);//初始化int型

 $this->initVar("uid", XOBJ_DTYPE_INT);//初始化int型

        $this->initVar("ns_name", XOBJ_DTYPE_TXTBOX, "");//初始化txtbox型

        $this->initVar("ns_sname", XOBJ_DTYPE_TXTBOX, "");//初始化txtbox型

        $this->initVar("ns_logo", XOBJ_DTYPE_TXTBOX, "");//初始化txtbox型

        $this->initVar("ns_address", XOBJ_DTYPE_SOURCE, "");//初始化源代码型

        $this->initVar("ns_postcode", XOBJ_DTYPE_TXTBOX, "");//初始化txtbox型

        $this->initVar("ns_phone", XOBJ_DTYPE_TXTBOX, "");//初始化txtbox型

        $this->initVar("ns_linkman", XOBJ_DTYPE_TXTBOX, "");//初始化txtbox型

        $this->initVar("ns_email", XOBJ_DTYPE_EMAIL, "");//email型

        $this->initVar("ns_desc", XOBJ_DTYPE_SOURCE, "");//初始化源代码型

 $this->initVar("ns_clicked", XOBJ_DTYPE_INT);//初始化int型

 $this->initVar("ns_status", XOBJ_DTYPE_INT);//初始化int型

        $this->initVar("ns_style", XOBJ_DTYPE_TXTBOX, "");//初始化txtbox型

 }

}

/*

*初始化handler

*命名规则:模组目录名+类名+Handler ,第一个字母大写

*参数:newphoto_store是数据表名称,Store是上面类的名称,具体可以看看 object.persistable.php ,在这里大家模仿一下吧,了解的多了会花时间,呵呵

*/

class NewphotoStoreHandler extends ArtObjectHandler

{

    function NewphotoStoreHandler(&$db) {

        $this->ArtObjectHandler($db, "newphoto_store", "Store", "ns_id", "ns_sname");

    }

}

?>


3. 上次谈到创建了基础类,这次谈谈最简单的使用方法:get和getValues

get是创建一个新类,并将指定ID的数据提取出来给这个类中的参数赋值,如果ID为0,则会自动创建一个新的(以后会谈到)。

getValues是将obj中的所有key对应value提取出来,组成一个数组。看下面的代码,呵呵,有的地方是为xajax用的,在你的系统中不会正常运行,仅做演示。




include_once 'header.php';

if(empty($_GET['ns_id'])){

 redirect_header("store.list.php",3,"您没有指定商家!");

}

$store_handler =& xoops_getmodulehandler("store", "newphoto");//初始化

$store_obj = $store_handler->get($_GET['ns_id']);//得到指定ID商店的obj

$storeinfo = $store_obj ->getValues();//得到这个商店的所有值


require_once("./server/server.common.php");//调用xajax初始文件

$xoopsOption["template_main"] = "newphoto_store_view.html";


include_once XOOPS_ROOT_PATH.'/header.php';

$xoopsTpl -> assign("storeinfo",$storeinfo);//将商店的信息数组传递给模板

$xoopsTpl -> assign("xoops_module_header", $xajax->getJavascript(XOOPS_URL."/Frameworks/xajax"));//页面内容中xajax初始化

include_once XOOPS_ROOT_PATH.'/footer.php';

?>



4. 用它来写数据库啦!

前面讲了创建方式及最基本的读的方式,这次说说真正用它来对数据进行操作



插入或更新数据用insert

得到一个指定的值用getVar

此文件名称命名为store_edit.php,如果直接调用,则是一个空表单,如果用store_edit.php?ns_id=9 的方式调用,则是编辑指定的信息,提交后添加或编辑



注意:由于这部分工作已经交给其他人做了,所以,临时写的代码,非正式使用。



include_once 'header.php';
//下面调用form的各个类,Frameworks中融合了几个原先xoops22中的form类,比较实用
if(!@include_once (XOOPS_ROOT_PATH."/Frameworks/xoops22/class/xoopsformloader.php")){
 include_once XOOPS_ROOT_PATH."/class/xoopsformloader.php";
}

//判断是否是用户,不是的话就让他登录或注册,这个文件可以仅对用户开放,对匿名用户不开放
if(!is_object($xoopsUser))
{
 redirect_header(XOOPS_URL."user.php",3,_MD_FRIEND_UMUSTMEMBER);
}

//我习惯将_GET和_POST的值给原先的变量
$ns_id = 0;//预置商家ID为0如果有_GET或_POST它会被重新赋值
$op = '';//同上意思

if ( isset( $_GET ) ){
 foreach ( $_GET as $k => $v ) {
  ${$k} = $v;
 }
}
if ( isset( $_POST ) ){
 foreach ( $_POST as $k => $v ) {
  ${$k} = $v;
 }
}

$store_handler =& xoops_getmodulehandler("store", "newphoto");//初始化
$store_obj = $store_handler->get($ns_id);//得到指定ID商店的obj,如果$ns_id是0则会create一个空的
//下面做各权限的判断,让这个商店信息只能商店的管理者和网站的管理者能修改编辑
$thisstoradmin = $store_obj->getVar('uid');//是得到这个商店的uid字段的值,如果是新的应该是0
if(!$xoopsUser->isAdmin() && empty($thisstoradmin){
 redirect_header("index.php",3,"你不是这个商店的管理者,也不是管理员,你没有权力编辑它!");
}

//如果是保存就进行下面的操作
if(!empty($_POST['op']) && $_POST['op']=='save'){
//这里对POST的数据循环给store_obj赋值,如果obj中没有,也无所谓,但有可能有点安全隐患,我没有试验,
  foreach($_POST as $k=>$v){
   $store_obj->setVar($k, $v);
  }
  //$groupobj->setVar('g_updatedate', time());这是一个其他的地方的语句,放在这里告诉大家如果有特殊的字段,可以在这里重新赋值
  //赋值完毕了,下面就写数据库了,如果$ns_id不为0就更新,如果为0就插入新的,返回新$ns_id
  $new_id = $store_handler->insert($store_obj);

  if($new_id){
   //成功
   $url = "store_view.php.php?ns_id=".$new_id ;
   $msg = "商店信息几经被保存";
  }else{
   //失败
   $url = "index.php";
   $msg = "商店信息保存错误,如果多次出现这种情况,请与我们联系,我们表示万分感谢";
  }
  redirect_header($url,3,$msg);
}
include_once XOOPS_ROOT_PATH.'/header.php';
//下面使用了getvars,并将其循环将字段名和字段值对应起来
foreach($store_obj->getvars() as $k=>$v){
 ${$k}= $v['value'];
}
$formtitle = $ns_id?"编辑商店信息":"添加商店信息";//对提交表格的头做个变换
//开始使用我最喜欢的xoops类组
$form = new XoopsThemeForm($formtitle, "storeform", "store_edit.php");
$form->setExtra("enctype='multipart/form-data'");
//把已经有的ns_id值作为hidden传递,它有可能是0也可能不是
$ns_id_hidden = new XoopsFormHidden("ns_id", $ns_id);
$form->addElement($ns_id_hidden);

$ns_name_text = new XoopsFormText("商店名称", "ns_name", 50, 255,$ns_name);
$form->addElement($ns_name_text,true);
$ns_sname_text = new XoopsFormText("商店简称", "ns_sname", 50, 255,$ns_sname);
$form->addElement($ns_sname_text,true);
//下面略去代码N行,不凑篇幅了
……
……
//先对op来个空值
$op_hidden     = new XoopsFormHidden("op", '');
$form->addElement($op_hidden);
//下面添加了一个确定按钮,点击之后给op赋值,之所以用这用方法,因为也可以调用预览、删除等其他的操作
$preview_submit = new XoopsFormButton("", "submitit", "确定", "submit");
$preview_submit->setExtra( "onclick='this.form.elements.op.value=\"save\"'");
$form->addElement( $preview_submit );
$form->display();

include_once XOOPS_ROOT_PATH.'/footer.php';
?>


<< Xoopslifetype功能简介(图文) XOOPS风格修改简易教程 >>
跟踪网址
  • 文章地址: http://xoops.org.cn/modules/article/view.article.php/c15/80
  • 跟踪地址: http://xoops.org.cn/modules/article/trackback.php/80
API: 工具箱 短消息 Email PDF 书签 打印 | RSS | RDF | ATOM
Copyright© shawnf69 & XOOPS CHINA
网友个人意见,不代表本站立场。对于发言内容,由发表者自负责任。
发表者 树状展开