Tag: xajax

  • PHP创建Excel文件

    【本文收录于Go4Pro.org】 在我的任氏有无轩页面中,有一个专门记载湖人比赛情况的页面。随着NBA 08-09赛季的开幕,这个页面就开始频繁的更新了。

    在之前的改版中,我已经将这个页面用Smarty页面重新改写了,这次是要为其加入导出比赛情况到Excel文件的功能。

    211103注:本页面已经全面改写。

    ============

    我使用的后台库是PEAR类库中的Spreadsheet_Excel_Writer。安装了PEAR的用户都可以用以下命令安装这个库:

    pear install --onlyreqdeps Spreadsheet_Excel_Writer-beta

    PEAR还是很方便的。在我的PHP环境中,这个库将安装在<PHP install dir>/PEAR/Spreadsheet下。我习惯将<PHP install dir>/PEAR加入到我的PHP包含路径中去,这样在引用包含文件时可以省力一些。

    ==========

    获取来自数据库的内容等操作就不再赘述,只讲针对Excel导出的部分:

    require_once(Spreadsheet/Excel/Writer.php);
    $sdate=date(Y-m-d, strtotime($_POST['sYear'].-.$_POST['sMonth'].-.$_POST['sDay']));
    $edate=date(Y-m-d, strtotime($_POST['eYear'].-.$_POST['eMonth'].-.$_POST['eDay']));
    $rows=getGames($sdate, $edate);
    $wb=new Spreadsheet_Excel_Writer();
    $wb->send(Laker Games.xls);
    $ws=&$wb->addWorksheet(Games_Summary);
    $f_title=&$wb->addFormat(array('bold'=>true,
                                   'Align'=>'center',
                                   'Color'=>'blue',
                                   'FgColor'=>'yellow'));
    $ws->write(0,0, Game Sequence, $f_title);
    $ws->write(0,1, Date Played, $f_title);
    $ws->write(0,2, Teams, $f_title);
    $ws->write(0,3, Score, $f_title);
    $ws->write(0,4, Win/Lose, $f_title);
    $ws->write(0,5, Remarks, $f_title);
    $rowid=1;
    foreach ($rows as $game)
    {
        $ws->write($rowid,0, $game['seq']);
        $ws->write($rowid,1, $game['date']);
        $ws->write($rowid,2, $game['team']);
        $ws->write($rowid,3, $game['score']);
        $ws->write($rowid,4, $game['win']);
        $ws->write($rowid,5, iconv('utf-8', 'gb18030', $game['note']));
        $rowid++;
    }
    $wb->close();

    ==================

    大部分代码是自明的。不做太多的说明,结合PEAR关于Spreadsheet_Excel_Writer的文档,应该很容易知道各行代码的作用。

    值得注意的是,以上的代码无法在XAJAX的环境下执行。我猜想,原因在于send函数:

    function send($filename)
    {
            header(Content-type: application/vnd.ms-excel);
            header(Content-Disposition: attachment; filename=$filename);
            header(Expires: 0);
            header(Cache-Control: must-revalidate, post-check=0,pre-check=0);
            header(Pragma: public);
    }

    在这个函数中,Writer用header的方式来“欺骗”浏览器,表明将要输出的内容是一个Excel的表格文件。我认为,正是这个HEAD信息破坏了XAJAX(即AJAX)所维系的头信息,造成该函数无法在XAJAX的环境下运行(但是也不出错……)。

    Writer并没有提供一个独立的将生成的Excel内容保存起来的函数,有时间、有精力的话在这个方面加以改进应该是不错的。

  • 站点后台改版近况

    到目前为止,还是很有收获。很多页面都已经改造到使用Smarty引擎,而且有两个页面(http://www.rsywx.net)和各本书籍的详细情况的页面——后一个页面无法直接访问,需要进入书籍列表后点击一本书籍后进入)使用了XAJAX技术。我个人认为后一个XAJAX技术的应用更加“有用”:我可以在不刷新页面的前提下完成添加一本书的TAG的任务。

    Smarty的速度还是可以信赖的,它的模板编译功能很强大。而XAJAX也很易用,我不用再去学习jQuery或者别的什么ajax框架。

    现在还有读书页面和杂项页面需要改动。然后就要开始加入一些XAJAX的示例页面了。

  • “任氏有无轩”后台改版

    2F设置好了,php-interbase的模块春阳也给我编译好了……似乎没有什么理由再阻止我进行后台的改版。

    当然,前台不会动——毕竟那是我花了钱请人设计的,还没有用上多久马上改版说不过去。

    后台想这么改动:

    • 所有的页面改用Smarty引擎来支持;
    • 必要的页面会用到XAJAX的技术实现ajax的效果。

    目前只是测试了一个页面,就是www.rsywx.net的首页。

    当你用你的鼠标移进、移出两个小图片时,右边会出现、隐藏相应的文字说明。这个就是用XAJAX实现的。当然,这个只是很初级的应用。

    我还会开辟一个专门讲述Smarty和另一个专门讲述XAJAX的栏目。希望到时有人关注。

    由于我的2F已经支持InterBase并安装了FireBird服务器,因此我将在近日将Vista上的IB数据库迁移到FB下去。希望能顺利。我使用IB已经有很多年了,还写了(至今)国内唯一一本关于IB的书。这份感情和依赖是Borland/CodeGear/Embarcadero无法理解的。

    也许,使用FB多了后,我会再次捉刀,写本关于FB的书吧,毕竟FB和IB太相像了。 ……

  • XAJAX学习笔记(六)

    今天完成了一个类似Accordion的DEMO。

    Demo 08

  • XAJAX学习笔记(五)

    今天完成了所谓的Autocomplete,又称作Incremental Search的XAJAX实现。

    还不是很完整,有一个地方还需要改进:可以使用键盘在各个选择项中来回移动,按回车选择,按ESC关闭弹出框等。

    Demo地址在这里

  • XAJAX学习笔记(四)

    昨天完成了一个新的XAJAX的DEMO,是一个类似digg.com样式的在线投票(“顶”或者“拍”)系统。

    暂时没有考虑重新刷新页面后可以重新投票的问题,不过在实际应用中必须加以考虑的。

    Demo 5: 在线“顶/拍”系统。

  • XAJAX学习笔记(三)

    昨天完成了两个DEMO,都是关于级联下拉框的。应该说这个应用还是很多的,比如:先选择省、再选择市、然后可以继续选择区这样的结构。

    Demo 3:两级下拉框

    Demo 4:三级下拉框

    实施本身没有什么太大的问题,但是在考虑IE/FF的兼容性时却遇到了一些问题。主要是出在如何将一个select下拉框中已有的option去掉上。IE和FF的代码是不一样的:

    
    function clearOption(selectId)
    {
        var obj;
        if(document.all) // IE implementation
        {
            obj=document.all[selectId];
            var i;
            for(i=0;i<obj.length else="" for="" i="" i--="" obj="document.getElementById(selectId);" obj.options.remove="" obj.remove="" return="" var="">
    请注意粗体部分。</obj.length>
  • XAJAX学习笔记(二)

    学习XAJAX第二天,有两点体会,和大家共享一下。

    第一,关于addAssign中修改一个块属性的问题。

    假定我有一段HTML代码如下:

    <div id=div01 class=en-us>This line will be changed.</div>

    通常我们想在程序中通过一个操作(通常是一个按钮或一个超级链接)来改变其外观,如文本内容、字体、颜色、大小等。如果你对CSS比较熟悉,可能会这样做:

    (more…)

  • XAJAX学习笔记(一)

    前几天玩的是.NET + AJAX,而且还有.NET Ajax Control Toolkit,所以一下子体验了很多D’N’D编程的威力。

    当然,也是有代价的,比如:对AJAX底层的实现就不会太关心;而且对控件的调整也会囿于MS的框架;因此,从某种程度上说,要真正的去体会.NET + AJAX,而特别是后者,必需深入到更底层的框架中去。 当然,我也很讨厌一下子就跳到最底层的,所以在网络上搜索了一下,发现在PHP下还是有一个AJAX框架的,那就是XAJAX。 用XAJAX开发还是相对简单的,不过有一点还是要注意。普通的PHP文件中,<?php?>是可以出现在任意位置的,但是如果使用了XAJAX,那么以下这些代码必需出现在PHP文件的最开始:

    (more…)