Xajax中文手册(第一版)

原文:http://xajax.sourceforge.net/英文原版:Copyright © 2005 J. Max Wilson简体中文翻译:HonestQiao(乔楚)/2005-12-7 17:23/(第一版)

  • 什么是xajax?
  • xajax如何工作?
  • 为什么我要使用xajax代替其他PHP的Ajax库?
  • 如何在我的PHP脚本之中使用xajax?
  • 如何异步更新内容?
  • 如何异步处理表单数据?
  • 如何给xajax增加定制功能?
  • 我能在私有或者收费产品之中使用xajax吗?

什么是xajax?Xajax是一个开源的 PHP 类库 它能够让你黏合HTML、CSS、JavaScript和PHP,轻而易举的开发功能强大、基于WEB的AJAX应用软件. 使用xajax开发的应用软件,无需重新调入页面,就能够异步调用服务器端的PHP函数和更新内容.xajax 如何工作?你 的应用软件需要异步调用的PHP函数, xajax的PHP对象都生成了对应的封装好了的JavaScript函数. 当被调用时,封装的函数使用JavaScript的XMLHttpRequest对象与服务器异步通讯,调用xajax对象对应的PHP函数. 调用结束后, PHP函数由xajax返回一个xajax的XML响应传递给应用程序. XML响应包含了特定的指令和数据,他们可以被xajax的JavaScript消息分析器解析,并且被用于更新你的应用程序的内容.为什么我要使用xajax代替其他PHP的ajax库?你应该选择一个最是和你的项目需要的库.xajax 提供了以下的功能, 它们使得ajax富有特色而又功能强大:

Xajax特殊的 XML 响应 / javascript 消息分析系统 帮助你做到, 自动的处理函数返回的数据,按照PHP函数返回的指令更新内容或者状态. 因为xajax作了这些工作Because xajax does the work, 你不需要写javascript的回调处理函数.

Xajax反对将代码和数据紧密地杂糅在一起的主张, 并且保持xajax的代码从与他代码分离. 因为它是对象构造的, 你可以加上自己定制的功能给xajax去扩展xajaxResponse 类和使用addScript方法.
xajax 可以工作在 Firefox, Mozilla, 大部分基于 Mozilla 的浏览器, Internet Explorer, 和 Safari.

除了更新元素的值和内含的HTML内容(innerHTML), xajax 还能用于更新样式(styles), css 类, 多选和单选按钮选择,甚至可以更新任何元素的属性.

xajax 支持使用一维或者多维数组、关联数组(哈希数组) 作为xajax函数的参数从javascript传送给PHP. 反之Additionally, 如果你传送一个javascript的对象给xajax函数,PHP函数将接受一个描叙对象属性的关联数组(哈希数组).

xajax 提供了一种简单的异步表单处理方式. 使用 xajax.getFormValues() javascript 方法, 你可以轻而易举的在表单之中提交一个描绘值的数组作为参数传送到xajax异步处理函数:xajax_processForm(xajax.getFormValues(‘formId’);它可以处理复杂的input 元素名称 ,例如 "checkbox[][]" 或者 "name[first]" 产生的多维或者关联数组(哈希数组), 就是普通提交表单那样使用PHP的$_GET数组

使用xajax你可以动态的发送附加的javascript作为请求的响应到你的应用软件中运行,而这就和动态的更新元素的属性一样方便.

Xajax会自动比较PHP函数返回的数据与你已经标记需要修改的元素属性. 只有当新的数据确实可以改变现有的属性,属性才会真的被更新. 这将可消除程序在一定时间间隔内更新与当前内容相同或者不同的内容而出现的明显的闪烁.

每一个通过xajax简单注册的函数都可以有不同的请求方式. 所有的函数默认使用POST方式,除非你明确的指定使用GET方式. 如果使用GET请求,你必须非常明确的考虑它确实是你所需要的

如果没有指定URI,xajax将设法自动确定脚本的URI. Xajax的自动确定算法经过了充分的验证,确保在大部分HTTPS或者未知端口的HTTP服务器上也可以正常的工作.

Xajax使用UTF8编码所有的请求和响应,以确保支持绝大部分的字符和语言. Xajax已经成功测试了多种不同的UNICODE字符,包括Spanish, Russian, Arabic, and Hebrew

几乎所有xajax生成的javascript都可以通过动态的外部javascript包含到你的web程序之中. 当你在浏览器之中查看程序的源代码时,不会有JavaScript的函数定义混杂在HTML标记之中.

Xajax可以使用在Smarty模板系统之中,仅仅需要创建一个smarty变量就可以包含xajax的javascript:$smarty->assign(‘xajax_javascript’, $xajax->getJavascript());然后你可以使用在header模版之中使用{$xajax_javascript}从而把xajax应用到你的站点.如何在我的PHP脚本之中使用xajax?Xajax的设计是如此的富有特色,以至于不管是已有的web程序还是新的项目,它都能够被极其简单的部署和应用. 仅仅需要七步,你就可以在几乎任何PHP脚本之中加入xajax的强大功能:

  1. 包含xajax类库:

require_once("xajax.inc.php");

  1. 实例化xajax 对象:

$xajax = new xajax();

  1. 注册你需要通过xajax调用的PHP函数的名称:

$xajax->registerFunction("myFunction");

  1. 编写注册的PHP函数,并且在函数之中使用xajaxResponse 对象返回XML指令:

function myFunction($arg){   // 对$arg做一些基本处理例如从数据库检索数据   // 然后把结果赋值给变量,例如$newContent     // 实例化xajaxResponse 对象   $objResponse = new xajaxResponse();     // 添加指令到响应之中,用于指派   //指定元素(例如id="SomeElementId")的innerHTML属性的新的内容   $objResponse->addAssign("SomeElementId","innerHTML", $newContent);     //返回xajaxResponse 对象生成的XML响应   return $objResponse->getXML();}

  1. 在你的脚本输出任何信息之前,调用xajax用于接管请求:

$xajax->processRequests();

  1. 在页面的 <head></head> 标签之间, 告诉xajax生成所必需的JavaScript:

<?php $xajax->printJavascript(); ?>

  1. 在程序中,从JavaScript事件或者函数调用前面注册的函数:

<div id="SomeElementId"></div><button onclick="xajax_myFunction(SomeArgument);">就这么简单. xajax 会处理其他所有的事情. 你所要做的主要工作就是编写PHP函数,然后从函数之中返回xajax的XML响应。而后者通过xajaxResponse类可以非常简单的生成.如何异步更新内容?Xajax 最富有特色的功能或许就是xajaxResponse类. 其他的Ajax库需要你自己编写JavaScript的回调句柄去处理一个异步请求返回的数据并更新内容. xajax, 从另外一个角度来说, 允许你使用PHP简单的控制内容. xajaxResponse 让你在PHP函数之中创建XML指令返回给你的程序. XML将被xajax的消息分析器解析,指令将告诉xajax如何更新程序的内容和状态. xajaxResponse类目前提供了以下指令:

addAssign($sTargetId,$sAttribute,$sData)
给命名为$sTargetId的元素的$sAttribute属性赋值$sData
$objResponse->addAssign("contentDiv","innerHTML","Some Text");
$objResponse->addAssign("checkBox1","checked","true");

addAppend($sTargetId,$sAttribute,$sData)
给命名为$sTargetId的元素的$sAttribute属性追加值$sData
$objResponse->addAppend("contentDiv","innerHTML","Some Text");

addPrepend($sTargetId,$sAttribute,$sData)
预备给命名为$sTargetId的元素的$sAttribute属性赋值$sData
$objResponse->addPrepend("contentDiv","innerHTML","Some Text");

addReplace($sTargetId,$sAttribute,$sSearch,$sData)
替换命名为$sTargetId的元素的$sAttribute属性的值之中的$sSearch为$sData
$objResponse->addReplace("contentDiv","innerHTML","text","<strong>text</strong>");

addClear($sTargetId,$sAttribute)

清空命名为$sTargetId的元素的$sAttribute属性的值
$objResponse->addClear("Input1","value");

addCreate($sParentId, $sTagname, $sId, $sType)

在已经存在的命名为$sParentId的元素下添加一个名叫$sTagName的子元素,并且把他的id赋值为$sId,可选的类型赋值为 $sType.
$objResponse->addCreate("form1","input", "pass", "password");

addRemove($sElementId)
从你的程序之中移除命名为$sElementId的元素
$objResponse->addRemove("div1");

addAlert($sMsg)
显示一个内容为 $sMsg 的警告框(JavaScript的Alert)
$objResponse->addAlert("This is some text");

addScript($sJS)
执行JavaScript代码 $sJS (演示代码原文有误)
$objResponse->addScript("var txt = prompt(‘get some text’);");

一 个独立的XML响应可能包含多个指令, 他们将按照加入响应的顺序执行. 让我们用一个用户在你的程序之中点击按钮为例来进行说明. Onclick事件调用PHP函数对应的javascript封装.这个封装通过XMLHttpRequest发送异步请求到服务器给xajax调用 PHP函数. PHP函数做了一次数据库查询, 处理了一些数据, 或者序列化. 然后你使用xajaxResponse类生成包含多个指令的xajax的XML响应 ,并回送给xajax的消息分析器执行:    $objResponse = new xajaxResponse();    $objResponse.addAssign("myInput1","value",$DataFromDatabase);    $objResponse.addAssign("myInput1","style.color","red");    $objResponse.addAppend("myDiv1","innerHTML",$DataFromDatabase2);    $objResponse.addPrepend("myDiv2","innerHTML",$DataFromDatabase3);    $objResponse.addReplace("myDiv3","innerHTML","xajax","<strong>xajax</strong>");    $objResponse.addScript("var x = prompt("Enter Your Name");");               return $objResponse->getXML();     $objResponse = new xajaxResponse();    $objResponse.addAssign("myInput1","value",$DataFromDatabase);    $objResponse.addAssign("myInput1","style.color","red");    $objResponse.addAppend("myDiv1","innerHTML",$DataFromDatabase2);    $objResponse.addPrepend("myDiv2","innerHTML",$DataFromDatabase3);    $objResponse.addReplace("myDiv3","innerHTML","xajax","<strong>xajax</strong>");    $objResponse.addScript("var x = prompt("Enter Your Name");");    return $objResponse->getXML();xajax消息分析器将会解析XML消息,并执行以下工作:

  1. id为myInput1的元素的值将被赋值为 $DataFromDatabase的数据.
  2. id为myInput1的元素的颜色将会变为red.
  3. $DataFromDatabase2的数据会被追加到id为myDiv1的元素innerHTML之中.
  4. $DataFromDatabase3的数据会被预先赋值给id为myDiv2的元素innerHTML之中.
  5. id为myDiv3的元素的innerHTML 之中所有的"xajax"将被替换为"<strong>xajax</strong>"; 使得所有的单词 xajax 显示加粗.
  6. 一个提示框将会显示,用来询问用户姓名,从提示框返回的值会被命名为x的javascript变量接收.

所有这些都由构成的PHP函数在服务器端执行并返回xajax的XML响应.

如何异步处理表单数据?Xajax使得异步处理表单数句非常非常的简单. xajax.getFormValues()方法会自动的从表单提取数据,并作为一个参数提交给xajax注册的PHP函数.xajax.getFormValues() 仅仅需要一个参数, 可以是你需要处理得表单的id, 或者是一个实际的表单对象. 你也可以使用xajax.getFormValues作为一个参数给xajax 函数, 例如:xajax_processFormData(xajax.getFormValues(‘formId’));xajax 会生成一个与表单数据对应的请求字符串给xajax服务器解析,然后以一个与表单数据对应的数组传递给PHP函数,就想你提交表单使用PHP的$_GET数组那么简单.Xajax 可以处理类似普通多维数组或者联合数组(哈希数组)等形式的复杂输入名字. 例如, 如果一个表单有三个多选框(checkboxes)并且都命名为 "checkbox[]", 但是值分别为 "check1", "check2", 和 "check3", 然后使用 xajax.getFormValues 函数作为参数传递给xajax 函数, 则 PHP 函数会接受到一个如下的数组:array ( ‘checkbox’ => array (    0 => ‘check1’,    1 => ‘check2’,    2 => ‘check3’, ),)作为函数参数的数组的结构与传统意义上提交表单之后的$_GET数组的结构相同. 你可以访问数组之中的checkbox 的数据: $aFormData[‘checkbox’][0]

如何给xajax增加定制功能?Xajax 可以使用各种服加的用户定制功能进行扩展. 正因为xajax是完全面向对象的,并且可以使用xajaxResponse的addScript()方法,所以他具有无限扩展的可能. 你可以创建你自己的xajax响应类,来继承xajaxResponse 类以及它的方法,并加上你自己定制的响应. 让我们用一个定制的增加选择组合框(select combo boxes)选项的响应指令的例子来说明. 你可以象下面这样扩展xajaxResponse 类:class myXajaxResponse extends xajaxResponse{ function addAddOption($sSelectId, $sOptionText, $sOptionValue) {     $sScript = "var objOption = new Option(‘".$sOptionText."’,’".$sOptionValue."’);";    $sScript .= "document.getElementById(‘".$sSelectId."’).options.add(objOption);";    $this->addScript($sScript); }}现在, 取代xajaxResponse 对象的初始化, 把你自己的 myXajaxResponse 对象的初始化定义到你的 xajax PHP 函数之中:$objResponse = new myXajaxResponse();$objResponse->addAssign("div1", "innerHTML", "Some Text"); $objResponse->addAddOption("select1","New Option","13"); return $objResponse->getXML();被调用时,这个方法将会发送需要的javascript到页面并执行. 当然你也有另外一种做法Alternatively, 你可以在你的程序之中创建一个如下的javascript函数:<script type="text/javascript">function addOption(selectId,txt,val){        var objOption = new Option(txt,val);        document.getElementById(selectId).options.add(objOption);}</script>并且使用addScript() 调用这个方法:$objResponse->addScript("addOption(‘select1′,’New Option’,’13’);");

我能在私有或者收费产品之中使用xajax吗?简而言之: 能,只要你愿意.xajax PHP 类库的发布遵循 GNU Lesser General Public License (LGPL).

XajaxBook By PHP+Mysql+Xajax+Adodb 转

首先感谢大家对XajaxBook的关心和支持,新版中放弃了Smarty,当初加入也是为了学习一下smarty,其实臃肿的adodb也可以去掉,但 自己已经习惯了用这个数据库操作类了就不再另外写了,代码也很简单,大家可以拿自己的数据库操作类来替换掉,新版加入了管理功能,可以删除回复留言,查看 留言者IP地址,管理帐号密码就放在config文件里面,没有用数据库,大家可以修改成数据库的安全性会好一点,感冒折磨的我什么都不想做了,原谅我的 偷懒吧

演示:http://www.im502.com/demo/XajaxBook/
管理帐号:admin 密码:123456

应用案例:http://www.797audio.com/gb/

废话少说,看目录结构:

QUOTE:|+adodb  
|+images
|+xajax
|-al.js
|-init.php
|-db.config.php
|-index.php
|-gb.sql
数据库:

QUOTE:CREATE TABLE `aj_book` (
   `id` int(8) NOT NULL auto_increment,
   `nickname` varchar(200) NOT NULL,
   `email` varchar(200) NOT NULL,
   `homepage` varchar(200) NOT NULL,
   `ip` varchar(200) NOT NULL,
   `post` text NOT NULL,
   `posttime` datetime NOT NULL,
   `reply` text NOT NULL,
   PRIMARY KEY   (`id`)
) ENGINE=MyISAM   DEFAULT CHARSET=utf8 COMMENT=’post’ AUTO_INCREMENT=34 ;


— 导出表中的数据 `aj_book`

INSERT INTO `aj_book` (`id`, `nickname`, `email`, `homepage`, `ip`, `post`, `posttime`, `reply`) VALUES
(1, ‘Lily’, ‘adfa’, ‘asdfa’, ‘127.0.0.1’, ‘dsafdfd’, ‘2007-10-19 11:30:22’, ‘re’),
(2, ‘Tom’, ‘adfaw’, ‘wewqq’, ‘127.0.0.1’, ‘fadfdafadf’, ‘2007-10-19 11:31:17’, ”, ‘0000-00-00 00:00:00’),
db.config.php

[Copy to clipboard] [ – ]CODE:<?php
/**
* XajaxBook 留言簿数据库配置文件
* ============================================================================
* 本软件欢迎转载 但请保留作者信息
* 网站地址: http://www.im502.com
* ============================================================================
* @file:    db.config.php
* @author:     im502 <im502@126.com>
* @version: V1.0 Beta
* @update:     2007-11-5
* ———————————————
*/
// database host
$db_host = ‘localhost’;
// database name
$db_name = ‘mydb’;
// database username
$db_user = ‘root’;
// database password
$db_pass = ‘password’;
//manage username
$adminnane=’797audio’;
//password
$gbpass=’35845268c63ab03ef60f625e92cf6dff’;
?>
init.php

[Copy to clipboard] [ – ]CODE:<?php
/**
* XajaxBook 留言簿公用文件
* ============================================================================
* 本软件欢迎转载 但请保留作者信息
* 网站地址: http://www.im502.com
* ============================================================================
* @file:    init.php
* @author:     im502 <im502@126.com>
* @version: V1.0 Beta
* @update:     2007-11-5
* ———————————————
*/
/*包含数据库连接文件,adodb类库,xajax类库*/
include_once("db.config.php");
require_once("adodb/adodb.inc.php");
require_once("xajax/xajax.inc.php");
/* 初始化数据库类 */
$db = &NewADOConnection(‘mysql’);
$db->Connect($db_host, $db_user, $db_pass, $db_name) or die("Connect database failed");
$db->query("SET NAMES ‘gb2312’;");
$db->debug = 0;//是否开启mysql侦错
?>
index.php

[Copy to clipboard] [ – ]CODE:/<?php
/**
* XajaxBook 留言簿主程序文件
* ============================================================================
*   本软件欢迎转载 但请保留作者信息
* 网站地址: http://www.im502.com
* ============================================================================
* @file:    index.php
* @author:     im502 <im502@126.com>
* @version: V1.0 Beta
* @update:     2007-11-5
* ———————————————
*/
session_start();
/* 包含公共文件 */
require_once (‘init.php’);
$xajax = new xajax();
//$xajax->debugOn();//开启调试
$xajax->decodeUTF8InputOn();
/* xml字符过滤函数*/
function xml_escape($string) {
     return str_replace(array(‘&’,’"’,"’",'<‘,’>’),
         array(‘&’,’"’,’&apos;’,’&lt;’,’&gt;’),
         $string    
     );
}
/**
* 获得用户的真实IP地址
*
* @access   public
* @return   string
*/
function real_ip()
{
     if (isset($_SERVER))
     {
         if (isset($_SERVER["HTTP_X_FORWARDED_FOR"]))
         {
             $arr = explode(‘,’, $_SERVER["HTTP_X_FORWARDED_FOR"]);
         /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
         foreach ($arr AS $ip)
         {
            $ip = trim($ip);
            if ($ip != ‘unknown’)
            {
                   $realip = $ip;
                   break;
            }
         }
         }
         elseif (isset($_SERVER["HTTP_CLIENT_IP"]))
         {
             $realip = $_SERVER["HTTP_CLIENT_IP"];
         }
         else
         {
             $realip = $_SERVER["REMOTE_ADDR"];
         }
     }
     else
     {
         if (getenv(‘HTTP_X_FORWARDED_FOR’))
         {
             $realip = getenv(‘HTTP_X_FORWARDED_FOR’);
         }
         elseif (getenv(‘HTTP_CLIENT_IP’))
         {
             $realip = getenv(‘HTTP_CLIENT_IP’);
         }
         else
         {
             $realip = getenv(‘REMOTE_ADDR’);
         }
     }
     return $realip;
}
/* 注册xajax自定义函数*/
$xajax->registerFunction("postmessage");
$xajax->registerFunction("show");
$xajax->registerFunction("adminlogin");
$xajax->registerFunction("logout");
$xajax->registerFunction("del");
$xajax->registerFunction("reply");
$xajax->registerFunction("addreply");
/* 创建自定义函数postmessage()*/
/**
* 发布留言
*
* @access   public
* @param string    $from    表单ID
* @return   void
*/
function postmessage($form)
{
    global $db;
     $objResponse = new xajaxResponse();
     /* 获取表单传递的参数 */
     $Nick=xml_escape($form[‘Nick’]);
     $HomePage=xml_escape($form[‘HomePage’]);
    $Email=xml_escape($form[‘Email’]);
     $Message=xml_escape($form[‘Message’]);
     $ip=real_ip();
    $errmsg=""; //初始化错误提示
     /* 表单验证 */
    if (trim($Nick) == "")   $errmsg.="Nick is required!n";
    else if (trim($Message) == "") $errmsg.="Message is required!n";
    else if (!(preg_match("/^w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$/", $Email)))   $errmsg.="Email is wrong!n";
    else if ($errmsg=="")
    {
      /* 入库操作 */
         $sql="insert into aj_book(nickname,email,homepage,ip,post,posttime) values(‘$Nick’,’$Email’,’$HomePage’,’$ip’,’$Message’,NOW())";
      $result=$db->Execute($sql);
         $rs=$db->getRow("select * from aj_book where id=".$db->Insert_ID());
         if($rs)
         {
             $scontent.='<div class="post" id="post_’.$rs[id].’">’.’     <h3>Nick Name : <a href="mailto:’.$rs[email].’" title="send mail">’.$rs[nickname].'</a> |   <a href="’.$rs[homepage].’">HomePage</a> | Post at ‘.$rs[posttime].'</h3>’.’     <div class="entry">’.nl2br($rs[post]).'</div></div>’;
             /* 将新入库的记录用xajaxResponse的addPrepend 插入最新留言位置
             注意此处为减轻服务器负担不再调用分页重载,所以新插入后分为位置显示的留言总条数等信息并没有更新
             页面的记录也比分页中的per_page多了一条出来,本人觉得这样做无伤大雅 ^_^
             如需要重载可将下面的语句替换为:$objResponse->addScript("xajax_show();");
             */
         $objResponse->addPrepend("content","innerHTML",$scontent);
         }
         else
         {
             $db->die();
         }
    }
    else
    {
         //弹出错误信息
         $objResponse->addAlert($errmsg);  
    }

    return $objResponse;
}
/* 创建自定义函数login()*/
/**
* 登录
*
* @access   public
* @param string    $from    表单ID
* @return   void
*/
function adminlogin($form)
{
    global $db,$adminnane,$gbpass;
     $objResponse = new xajaxResponse();
     /* 获取表单传递的参数 */
     $admin=trim($form[‘admin’]);
     $pass=md5($form[‘pass’]);
    $errmsg=""; //初始化 错误提示
     /* 表单验证 */
    if(!($admin==$adminnane))
    {
       $errmsg.="Username is wrong!n";
    }
    else if(!($pass==$gbpass))
    {
       $errmsg.="Password is wrong!n";
    }
    if ($errmsg=="")
    {
       // 登录成功 注册session
         $_SESSION[‘admin’]=$admin;
      $objResponse->addScript("xajax_show();");//重载message,出现回复和删除的链接
         //登录后将登录按钮变为注销
      $objResponse->addAssign("log","innerHTML",'<a href="javascript:void(0)" onclick="xajax_logout();">Logout</a>’);
    }
     //弹出提示信息
     else   $objResponse->addAlert($errmsg);
    return $objResponse;
}
/* 创建自定义函数logout()*/
/**
* 注销
*
* @access   public
* @param string    $from    表单ID
* @return   void
*/
function logout()
{
     $objResponse = new xajaxResponse();
     session_destroy();
     $objResponse->addScript("xajax_show(1);");
     $objResponse->addAssign("log","innerHTML",'<a href="javascript:void(0)" onclick="lAlert();">Manage</a>’);
    return $objResponse;
}
/* 创建自定义函数reply()*/
/**
* 回复留言
*
* @access   public
* @param string    $id    留言ID
* @return   void
*/
function reply($id)
{
     $objResponse = new xajaxResponse();
     //点回复后在对应的位置出现发表回复的输入框和提交按钮
     $content='<form id="rform" name="rform" onSubmit="postReply();" action="javascript:void(null);" method="post" enctype="multipart/form-data"><textarea name="re" id="re" cols="60" rows="5" ></textarea><input name="id" id="id" type="hidden" value="’.$id.’" /><input name="rep" id="rep" type="submit" value="Reply" /></form>’;
     $objResponse->addAssign("reply_".$id,"innerHTML",$content);
         
return $objResponse;
}
/* 创建自定义函数addreply()*/
/**
* 回复留言的处理
*
* @access   public
* @param string    $$form    留言ID
* @return   void
*/
function addreply($form)
{
     global $db;
     $objResponse = new xajaxResponse();
     /* 获取表单传递的参数 */
     $re=xml_escape($form[‘re’]);
     $id=$form[‘id’];
     $content="<strong>Reply:</strong>".nl2br($re);
     $objResponse->addAssign("reply_".$id, "innerHTML", "");    
     $db->query("update aj_book set reply=’".$re."’ where id=".$id);
     $objResponse->addAssign("reply_".$id, "innerHTML", $content);
   
return $objResponse;
}
/* 创建自定义函数show()*/
/**
* 显示留言及分页功能
*
* @access   public
* @param string    $page    页码
* @return   void
*/
function show($page=1)
{
global $db;
     $page=intval($page);
     $objResponse = new xajaxResponse();
//每页显示的记录数
$per_page = 10;
     /* 获取留言总条数 */
$num = $db->getOne("select count(*) as nums from aj_book");
    
     if($page<1||$page>ceil($num/$per_page)) $page=1;//判断自定义输入跳转页面是否越界
$offset = ($page – 1) * $per_page;
     /* 没有留言时显示 */
if($num <1)
     {
       $objResponse->addAssign(‘content’, ‘innerHTML’, ‘No message!’);
       return $objResponse;
}
     $sql="select * from aj_book order by id desc limit ".$offset.",".$per_page;
     $rsr=$db->getAll($sql);
     if($rsr)
     {
         /* 循环读出分页留言 */
         foreach($rsr as $rs)
         {
             $scontent.='<div class="post" id="post_’.$rs[id].’">’.’     <h3>Nick Name: <a href="mailto:’.$rs[email].’" title="send mail">’.$rs[nickname].'</a> |   <a href="’.$rs[homepage].’">HomePage</a>   | Post at ‘.$rs[posttime];
             if(!empty($_SESSION[‘admin’]))
             {
                 $scontent.=’ | <a href="javascript:void(0)" onclick="if(confirm(‘Are you sure you want to delete the message?’)){xajax_del(‘.$rs[id].’)} return false;">Delete</a> | <a href="javascript:void(0)" onclick="xajax_reply(‘.$rs[id].’);">Reply</a>’;
             }
             $scontent.='</h3>’.’     <div class="entry">’.nl2br($rs[post]).'</div><div id="reply_’.$rs[id].’" class="reply">’;
             if(!empty($rs[reply]))
             {
                 $scontent.='<strong>Reply:</strong>’.nl2br($rs[reply]);
             }
             $scontent.='</div></div>’;
         }
         /* 赋值留言内容给content对象 */
         $objResponse->addAssign("content","innerHTML",$scontent);
     }
     else
     {
         $db->die();
     }
     /* 开始分页 */
     if($num)
{
      if($num % $per_page)
         {
               $pageCount = (int)($num / $per_page) + 1;
      }
         else
         {
             $pageCount = $num / $per_page;
         }
}
else
     {
      $pageCount = 0;
}
/* 初始化分页导航*/
     $nav = "";
$nextPage = $page + 1;
$prevPage = $page – 1;
     /* 总记录数与分页信息*/
$nav.='<a class="nolink" title="Total Records">’.$num.'</a><a class="nolink">’.$page.’/’.$pageCount.'</a>’;
     /* 首页与前页的判断显示 */
     if($page == 1)
{
      $nav .= ”;
    }
     else
     {
      $nav .= ‘<a href="javascript:void(0);" onclick="xajax_show(1);" title="First Page">|<</a>’;
      $nav .= ‘<a href="javascript:void(0);" onclick="xajax_show(‘.$prevPage.’);" title="Previous Page"><<</a>’;
     }
     /* 数字分页的显示 */
$plus=ceil($per_page/2);
if(($per_page-$plus+$page)>$pageCount)$plus=($per_page-$pageCount+$page);
$begin=$page-$plus+1;
$begin=($begin>=1)?$begin:1;
$nav .=”;
for($i=$begin;$i<$begin+$per_page;$i++)
{
         if($i<=$pageCount)
         {
             if($i!=$page)
             $nav.='<a href="javascript:void(0);" onclick="xajax_show(‘.$i.’);">’.$i.'</a>’;
             else
             $nav.='<a class="curr" title="Current Page">’.$i.'</a>’; //当前页
         }
         else
         {
             break;
         }
}
unset($begin);
     /* 后页与尾页的判断显示 */
if( ($page == $pageCount) || ($pageCount == 0) )
     {
      $nav .= ”;
}
     else
     {
      $nav .= ‘<a href="javascript:void(0);" onclick="xajax_show(‘.$nextPage.’);" title="Next Page">>></a>’;
      $nav .= ‘<a href="javascript:void(0);" onclick="xajax_show(‘.$pageCount.’);" title="Last Page">>|</a>’;
}
     /* 跳转页 */
     $nav .= ‘<input type="text" name="custompage" onKeyDown="if(event.keyCode==13) {xajax_show(this.value); return false;}">’;
     //$objResponse->addAlert($nav);
     /* 分页导航赋值 */
     $objResponse->addAssign("pagebar","innerHTML",$nav);
     return $objResponse;
}
/* 创建自定义函数del()*/
/**
* 删除留言功能
*
* @access   public
* @param string    $id    留言ID
* @return   void
*/
function del($id)
{
global $db;
     $objResponse = new xajaxResponse();
     $db->Execute("delete from aj_book where id=".$id);
     //此处也没有重载,需要的可以将下句替换为:$objResponse->addScript("xajax_show();");
     $objResponse->addRemove("post_".$id);
     
     return $objResponse;
}
$xajax->processRequests();
//根据登录状态显示登录或注销链接,页面刷新后有效
$logstr=$_SESSION[admin]=="" ? ‘<a href="javascript:void(0)" onclick="lAlert();">Manage</a>’   : ‘<a href="javascript:void(0)" onclick="xajax_logout();">Logout</a>’;
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<meta name="Author" content="im502,im502(at)126.com" />
<meta name="keywords" content="php,mysql,ajax,xajax,adodb,smarty,js,javascript,guestbook,book,gbook,phpbook,im502" />
<meta name="description" content="a guest book power by php,mysql,xajax,adodb,smarty" />
<link rel="stylesheet" href="images/style.css" type="text/css" />
<title>XajaxBook by php+mysql+xajax+adodb </title>
<?php echo $xajax->getJavascript(‘./xajax/’); ?>
<script type="text/javascript">
//传递表单
function loginn(){
   xajax_adminlogin(xajax.getFormValues("login"));
   return false;
}
function post(){
   xajax_postmessage(xajax.getFormValues("postform"));
   return false;
}
function postReply(){
   xajax_addreply(xajax.getFormValues("rform"));
   return false;
}
</script>
</head>
<body onload="xajax_show()">
<!–加载需要弹出半透明渐变层的js–>
<script type="text/javascript" src="al.js"></script>
<div id="wrap">
<div id="header"></div>
<div id="sidebar">
<ul>
     <li>
         <h2>Navigation</h2>
             <ul>
                 <li><a title="Show message" href="javascript:void(0)" onclick="xajax_show();">Show Message</a></li>
                 <li><a href="javascript:void(0)" onclick="sAlert();" title="Post a message">Post Message</a></li>
                 <li id="log"><?php echo $logstr; ?></li>
             </ul>
     </li>
</ul>
</div>
<script type="text/javascript">
<!–
xajax.loadingFunction = function(){
xajax.$(‘cLoadingIndicator’).style.display=’block’;
};
xajax.doneLoadingFunction = function(){
xajax.$(‘cLoadingIndicator’).style.display = ‘none’;
}
// –>
</script> <div id="cLoadingIndicator" style="display:none">
             <span ><img src="images/load.gif"> loading…</span>
         </div>
     <div id="content"></div>
     <div id="pagebar"></div>
<div id="footer">
     <p>
         Copyright &copy; <a href="http://www.im505.com">im502.com</a> | XajaxBook By PHP+Mysql+Xajax+Adodb
     </p>
</div>
</div>
</body>
</html>
下载

xajax 问题收集 转

Error: the xajax Javascript component could not be included. Perhaps the URL is incorrect?
URL: xajax_js/xajax_core.js

这是 xajax 0.5 beta 3 版本语法的更新,你需要配置 Javascript URI,如:$xajax->configure('javascript URI', './3rdparty/xajax/');

xajax+Smarty 新手入门之 HelloWorld

前段时间因为项目需要开始接触 PHP 开发。本着简单、高效的原则,最终权衡,我选择 PEAR 和 Smarty 这些流行的第三方库来开发我的项目。现在项目基本完成了,也正式上线了。

有点可惜的是一直以来想在项目中应用 Ajax 的功能,无奈精力有限,上次做项目时没有同步加进来。希望这段时间有点精力,对 PHP, PEAR, Smarty 这方面也稍微熟悉了一点,不如学习和应用一下 Ajax 的功能吧。

第一个疑问:自己写 Ajax 代码还是选择已存在的 Ajax 框架或库?

我的回答,选择 Ajax 框架或库,这样能快速开发项目,自己写的未必比这些现存的好,在这里可不是否定你的水平,:) 毕竟这些框或库已经存在和完善许久了。如果自己对技术感兴趣,希望从自己一行一行代码写,OK!当你了解这些现在的 Ajax 框架后再回过头来看,我想这比你刚开始就自己写来更容易理解,对你没有坏处吧。

第二个疑问:目前流行的 Ajax 框架很多,我该选择哪个?

我的问题,我选择 xajax 库, 主要是因为它支持 Smarty 模板。今天下午查资料对几个流行 Ajax 框架比较一下,一看到 xajax 支持 Smarty 模板,好感顿由心生,用它吧。呵呵!

下面是我刚才学习和测试 xajax 和 Smarty 的步骤,希望对想学习的人有一些帮助,也希望各位朋友多多指点和交流。

1、Smarty 应用

下载:

Smarty 2.6.18 Source

安装:

Windows 安装步骤

我直接把目录下的 libs 拷贝到网站目录下并重命名 smarty,大家也可参照上面步骤。

示例代码:

index.php

require_once(‘./smarty/Smarty.class.php’);
$smarty = new Smarty();
$smarty->template_dir = "./templates/";
$smarty->compile_dir = "./templates_c/";
$smarty->config_dir = "./configs/";
$smarty->cache_dir = "./cache/";
$smarty->assign(‘name’,’Hello World’);
$smarty->display(‘index.tpl’);

index.tpl

<html>
<body>
<p>Hello, {$name}</p>
</body>
</html>

2. xajax 应用

下载:

xajax 0.2.5

安装:

如何安装

我直接把解压出来的 xajax 拷贝到网站目录下

示例代码:

index.php

<?php
require_once(‘./xajax/xajax.inc.php’);

function helloWorld()
{
   $text = "Hello World";
  
   $objResponse = new xajaxResponse();
   $objResponse->addAssign("div1","innerHTML",$text);
  
   return $objResponse;
}

$xajax = new xajax();

$xajax->registerFunction("helloWorld");

$xajax->processRequests();

?>
<html>
<head>
   <title>Hello World</title>
   <?php $xajax->printJavascript(‘./xajax/’); ?>
</head>
<body>
   <div id="div1" name="div1"></div>
   <br/>
   <button onclick="xajax_helloWorld()" >Click Me</button>
</body>
</html>

3. 结合 xajax 和 Smarty 应用

示例代码:

index.php

<?php
require_once(‘./xajax/xajax.inc.php’);
function helloWorld()
{
   $text = "Hello World";
   $objResponse = new xajaxResponse();
   $objResponse->addAssign("div1","innerHTML",$text);
   return $objResponse;
}
$xajax = new xajax();
$xajax->registerFunction("helloWorld");
$xajax->processRequests();
$xajaxHead=$xajax->printJavascript(‘./xajax/’);
require_once(‘./smarty/Smarty.class.php’);
$smarty = new Smarty();
$smarty->template_dir = "./templates/";
$smarty->compile_dir = "./templates_c/";
$smarty->config_dir = "./configs/";
$smarty->cache_dir = "./cache/";
$smarty->assign(‘xajaxHead’,$xajaxHead);
$smarty->display(‘index.tpl’);
?>

index.tpl

<html>
<head>
   <title>Hello World</title>
   {$xajaxHead}
</head>
<body>
   <div id="div1" name="div1"></div>
   <br/>
   <button onClick="xajax_helloWorld()" >Click Me</button>
</body>
</html>

结束语

希望本文档有初学的朋友有些帮助,也希望各位朋友多多交流,大家共同进步!