Tag: php

  • CI做了一个简单的后台

    昨天用CodeIgniter随手开发了一个BT群的统计后台。从下载到初步跑起来——我原来只用过Symfony,从来没有用过CI——用了差不多1个小时。还算是很快的。

    CI的设置比Symfony简单多了,一个包压缩到你想作为WEB根目录的目录下就可以了。这对轻量级、快速开发而言是非常实用的。

    它的M/V/C架构也很清晰。

    在C的层次,虽然可以使用route来配置pretty uri,但是你不用的话也可以很“自然”的在各个controller里飞快的搭建各种路径;在V的层次,我目前的实践还没有用到嵌套模板、子模板,相信是有的。不过貌似在V中,对CSS连接路径的判断有些不直观,有待继续验证;在M层次,比Symfony简单多了,它基本舍弃了OO方式,而只是提供了一种方法来让用户定义一些M中的方法而返回数据集,然后再经由C传递到V中进行渲染。

    我对CI的应用目前就到此为止。等有了新的体会再共享吧……

  • Going for Symfony | 第一天

    最近一段时间比较空一些:受经济危机影响,来访的客户少了;太子期末考试结束,我也不用揪着他复习功课了。所以决定把Symfony看一看。

    (more…)

  • NetBeans IDE

    NetBeans出了个支持PHP的IDE,下载后试用了一下,感觉还不错。

    首先,它对JS的支持不错。很多PHP的IDE都不支持对JS的编写。

    其次,有数据库的支持。我的PHPED标准版不支持这个,要到专业版才行。

    缺点:

    代码提示系统还有一些bug;调试不是很直观。这些都有待研究。

  • 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内容保存起来的函数,有时间、有精力的话在这个方面加以改进应该是不错的。

  • 【一日一得】Paamayim Nekudotayim

    在OO的编程语言(如C++)中,有一个很重要的符号:::,即双冒号,一般称其为Scope Resolution Operator,范围解析运算符。

    在C++中,我们可以这样写:

    class Base
    {
        protected int i;
        public showI()
        {
            cout showI();
            //感谢指正,用脚本语言多了,忘记在C++中是没有GC的
            delete d;
            d=NULL;
        }
    }

    (more…)

  • Smarty中用section完成主从表循环

    在我的“任氏有无轩”WEB界面中,有一个是读书页面。这个页面列出了我非但读过、而且写过相关评论的书籍,各个评论将链接到对应的BLOG文章去。 显然,这是一个很典型的“一对多”的主从表循环。原来我是简单的用嵌套循环,现在既然用了Smarty引擎,我就改用了Smarty中的section语法。

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

    Smarty中的section语法说来不复杂——特别是在不嵌套的时候:

    <?php
    //从PHP脚本中assign()一个数组给Smarty:
    $data = array(1000,1001,1002);
    $smarty->assign('custid',$data);
    ?>
    输出数组的模板:
    {* 本例将打印出$custid数组的所有值 *}
    {section name=customer loop=$custid}
    id: {$custid[customer]}
    {/section}
    {*  逆序打印所有$custid数组中的值 *}
    {section name=foo loop=$custid step=-1}
    {$custid[foo]}
    {/section}

    语法是自明的,这里不多做解释。如果牵涉到主从表的嵌套循环,那么语法会稍微复杂一些:

    {section name=reading loop=$readings}
        //循环显示外层循环的内容
        {section name=reading_detail loop=$reading_details[reading]}
        {$reading_details[reading][reading_detail].reviewid} <a
          href={$reading_details[reading][reading_detail].uri}>
        {$reading_details[reading][reading_detail].title}
        </a>
        {$reading_details[reading][reading_detail].datein}
        {/section}
    {/section}

    可见,外层循环(主循环)还是保持基本语法不变,内层的语法中需要特别注意loop=$reading_details[reading]这个loop变量的控制,以及循环显示内层循环的内容时对索引的引用控制。 当然,我使用的是一种最直截了当的方法。在对应的PHP文件中,对各个循环变量可以使用一个类似的嵌套循环来赋值:

    $i=0;
    $arr1=array();
    $arr2=array();
    foreach ($result1 as $master)
    {
        $arr[$i]['aField']=$master['aField'];
        // 更多的外层赋值
        $j=0;
        foreach ($result2 as $detail)
        {
            $arr[$i][$j]['anotherField']=$detail['anotherField'];
            // 更多的内层赋值
            $j++;
        }
        $i++;
    }

    这样就可以完成两个循环变量的初始化,然后再用Smarty赋值给模板变量即可。 Smarty中的section是非常强大的循环控制语句。任何需要使用Smarty进行模板操作的人,必须掌握其语法。也许,它的唯一不足也在于此:对于一个MVC完全隔离,前端界面可能由根本不懂计算机编程的设计人员完成的前端来说,section的语法还是稍微复杂了一些。

  • “任氏有无轩”改版进程

    今天完成了“读书”界面的改版,前台全部用Smarty,后台是PHP。

    之所以搞了比较长的时间,是因为在读书页面中,牵涉到一个主从表的循环。主表的很简单,而从表的就不那么简单。我足足想了差不多一个礼拜构思数组(数据集)的构成,又用了差不多60分钟完成了代码的编写。

    现在的任氏有无轩已经基本上由Smarty驱动了。

  • 通用PHP分页函数

    在PHP编程中,分页是经常要用到的功能。最近我们接手的网站也需要加入这个功能,于是去网络上搜寻了一下。网络上也有不少介绍,有相应的例子。看了几个之后,决定自己写。用了大概30分钟时间就调通了,下面和大家分享一下心得。

    要写一个分页函数不是很难,根据分页导航来显示对应的子数据集也不是很复杂。但是其中还是有不少细节的问题需要解决。比如,要传递哪些参数,返回什么;如何避免全表选择;如何灵活的输出导航条等等。

    先看我的函数原型:

    function getPageNav($uri, $selectsql, $countsql, &$navbar, &$outres, $curpage, $param, $recperpage=10)

    这个函数中我使用了八个参数。其中有两个引用参数是用来返回导航条和结果数据集的。还有一个是可选参数。所以,实际上,要传递进函数的参数应该是5个。

    (more…)

  • WS的WS

    2002年6月,当我完成李维的《C++Builder 6 Soap/Web Service开发》一书的技术编辑工作后,应邀为这本书写了一个序,其中提到:

    技术的发展永远是和现实需要相配套的。我们需要用一种新的概念和技术来解决当今极为分布的环境下,各应用之间互相集成的问题。幸运的是,这样的概念和技术已经出现了,它就是SOAP(Simple Object Access Protocol,暂译为“简化对象存取的协议 ”)和Web Service。

    (more…)

  • 八月十七日

    是日,上于股市继续保持受挫状态。终于出现红字。

    下午与太子一起去邻里中心学习拼音,却带错了练习本无法练习写拼音。

    回家后,上开始钻研两个问题:

    (more…)