使用XAJAX+Smarty制作动态MSSQL访问小工具随笔
最近闲来无聊,想做一套类似于以前公司使用的WEB版动态选择列的报表系统,为了不使页面刷新就使用了XAJAX做为异步调用框架,为了以后该工具能够更好的使用则采用SMARTY做为MVC框架。
主体思想:第一阶段,想法如下
(1)进入index.php;
(2)显示当MSSQL中所有数据库;
(3)随意单选DB,显示该DB下用户表Table情况;
(4)随意单选Table显示该Table字段情况;
(5)多选Fields后点击[TableInfo]按钮显示该表指定字段信息情况;
(6)再进行其他操作。
主线如下:
DataBases(Select,Single)èTables(Select,Single)èFields(Select, Multiple)èTableInfo(Button,Submit())
但是在近二天的编码过程中遇到了很多这样或那样的问题导致很多时候停滞不前,因此做为经验进行收集写入我的空间中。
第一天,到的问题:
1、 想要知道如何在SQL2000中如何得到该服务器中所有数据库列表?
答:该问题在之后第三天在CSDN发送的问题中得到解答,
默认数据库必须为“master”,并使用
“Select * from sysdatabases;”得到服务器中所有数据库情况。
2、 想要知道如何在SQL2000中如何得到指定数据库中用户数据表列表?
答:该问题我是知道的使用“Select * from sysobjects where type = ‘U’”即可得到服务器指定数据库中用户数据表情况。
3、 XAJAX使用方法及实现情况?
答:在网上有很多讲解了XAJAX的应用文档是自称为“HonestQiao(乔楚)”写的,网上好像就这一份,其他的再没有注意到有,在读后我也小写了一份标题为“AJAX框架---XAJAX初试(非异步调用)”文章做了学习经验的保存,在之后的使用过程中慢慢的理解了XAJAX中第一个“X”的含意(XML.DOM)。
第一天, 遇到的问题
1、 对TABLE中Fields字段进行设计?
答:对TABLE对象使用工厂方法设计,单个TABLE是一个对象,一个Table对象可以提到该Table中所有的Fields,因此设计出class.mstableinfo.php文件,clsmstableinfo对象,将通过选择DB后不同表进行Table对象的实例,并将其放到tbinfo数组中,方便读取,获取出”TYPE”,”LENGTH”下标,数据结构为:
$ary_fields = objTable->GetFields();
$ary_fields[fieldname][“TYPE”]和$ary_fields[fieldname][“LENGTH”];
2、 如何保证以后设计不乱?考虑以后的扩展及页面美化问题使用SMARTY?
答:考虑到以后可能会对页面进行流转及相应调整,且想更一步加强MVC思想,使用SMARTY做为MVC框架,并建立class.smartyhandle.php文件,clssmartyhandle对象,该对象继承Smarty对象,并根据系统情况设定:信息,
$this->compile_dir = "./template_c";
$this->config_dir = "./config";
$this->template_dir = "./template";
$this->cache_dir = "./cache";
该设计只是分离VC对于M来说还是有所欠缺,想以后采用动态模块加载方式对系统进行深层的MVC分离工作,如,建立menu页面,列出相应模块,点击不同模块加载不同MVC路径的设计思路,以后再说吧。^_^
3、 如何将SMARTY与XAJAX进行合并?
答:采用了SMARTY后应该如何将XAJAX与其进行联合使用呢?最后经过研究发现,将二者进行合并,并不是一件难事,使用在index.tpl的Head处建立一个{$head}SMARTY变量,将实例化后的XAJAX对象使用getJavascript()方法将加入到Head的Script加入到Head元素中即可,一开始一直使用PrintJavaScript()的方法,但是总是不能找到对应的方法,最后找到原因,原来是XAJAX的问题,正常使用过程中,使用PrintJavaScript的时候,会自动将Script自动加入到Head中,但是如果使用SMARTY后,再使用PrintJavaScript的方法就会将取出的XAJAX的JavaScript加入到<html>元素之上,即网页外部,这时getJavascript()方法就起到了做用,将JS取出后,使用Smarty对象,将其赋值就行了,这样就将Smarty与XAJAX进行了结合,就这点我可以研究了不下于半小时呀(因为帮助文档上,根本没有写,反正我是没看着。) 以下是我的SMARTY+XAJAX合并结构情况。
<?php
$title = "TESTNG";
Require_once ….
$dbconn = new clsmsconnect(DBSERVER, DBUSER, DBPWS, DEFAULTDB);
$dbconn->GetConnect();
$databases = $dbconn->GetDatabasesRows();
function GetDatabases(){…}
function GetTablesFromDbname($dbname){…}
function GetFieldsFromTable($dbname, $tablename){…}
function ActionForm($tablename, $fields){…}
$xajax = new xajax();
// GetTableFields Function Register
$xajax->registerFunction("");
$xajax->registerFunction("GetDatabases");
$xajax->registerFunction("GetTablesFromDbname");
$xajax->registerFunction("GetFieldsFromTable");
$xajax->registerFunction("ActionForm");
$xajax->processRequests();
$printtext = $xajax->getJavascript('xajax/');
$smarty = new clssmartyhandle();
$smarty->assign("title", $title);
//$smarty->assign("tables",GetTablesHtml($tables));
$smarty->assign("headle",$printtext);
$smarty->assign("loadxajax", "xajax_GetDatabases()");
$smarty->display("index.tpl");
?>
由于Space字数要求将第二天,遇到的问题拆分开发布
1、 对XAJAX进行研究,如何将所选的Table列出该Table的字段情况如何实现?
答:一开始使用是使用php生成Select的html串再使用SMARTY将其赋值的方法进行处理。如下:
function GetTablesHtml($ary_tables){….},但是用来用去发现XAJAX中还是提供了不少的方法进行了这部分的处理。
如:addCreate,addAppend,addEvent,addRemove,addRedirect,addScript呵呵,我现在暂时就用了这几个方法了。
下面找一个我写的方法进行说明,见笑了:
首先,在之后的使用过程中发现在XAJAX中不能针对select元素不能建立option子元素,查看说明文档才发现需要对xajaxresponse进行扩展编写。
<?php
require_once("./xajax/xajaxResponse.inc.php");
// 继承xajaxResponse对象
class clsxajaxresponse extends xajaxResponse {
// 添加addAddOption方法,使用DHTML及Javascript操作将option添加到指写的select元素中,最后调用addScript方法将元素加入并建立。
function addAddOption($tselectid, $toptiontext, $toptionvalue){
$jsscript = "var objOption = new Option('".$toptiontext."','".$toptionvalue."');";
$jsscript .= "document.getElementById('".$tselectid."').options.add(objOption);";
$this->addScript($jsscript);
}
}
?>
以下讲解XAJAX中相关使用
function GetDatabases(){
// 全局化$databases变量
global $databases;
// 实例化带有addAddOption方法的自定义xajaxresponse对象
$xajaxresponse = new clsxajaxresponse();
// 将可能产生刷新的元素删除,你不想每次点击的时候都添加一个Select对象吧?
$xajaxresponse->addRemove("databases");
$xajaxresponse->addRemove("tables");
$xajaxresponse->addRemove("fields_src");
$xajaxresponse->addRemove("submit");
// 在form1中创建select元素并将其ID设为“databases”
$xajaxresponse->addCreate("form1", "select", "databases");
// 追加元素属性,不能通过addAssign将属性变化的方法进行设置噢,因为元素中还没有该属性呢
$xajaxresponse->addAppend("databases", "size", count($databases));
// 追加元素JS事件方法使用addEvent方法,因为我对JS不是太明白,有时不知道怎么用见谅了
$xajaxresponse->addEvent("databases", "onFocus", "false");
$xajaxresponse->addEvent("databases", "onChange", "xajax_GetTablesFromDbname(this.value)");
foreach ($databases as $key=>$value){
// 将Option追加到指定的Select元素中,使用自已定义的addAddOption方法噢。
$xajaxresponse->addAddOption("databases", $value, $value);
}
return $xajaxresponse->getXML();
}
2、 XAJAX中不能直接填加或不同填加的HTML元素情况?
答:
(1) Select元素中Option元素(需要自己写添加);
(2) Submit不能通过
$xajaxresponse->addCreate("form1", "input", "submit");
$xajaxresponse->addAppend("submit", "type", "submit");
的方法进行填加,(这样填加的是个Text框噢)而是使用
$xajaxresponse->addCreate("form1", "button", "submit");
$xajaxresponse-> addAppend ("submit", "value", "submit");
进行填加;
(3) 对于XAJAX所定向的函数,不能使用PHP中的header进行页面跳转,而必须使用
$xajaxresponse->addRedirect("showtableinfo.php?tbname=".$tablename);进行跳转噢。
3、 XAJAX+SMARTY如何将Select元素中多个Option值进行读取处理?
答:这个问题我在CSDN里问过了,可是始终没有人回复呀。急急~~试过了很多种方法还没有搞定,不知道如何处理,希望高手看到能直接与我联系~~