Skip navigation.

极湖

无不用其“极”

ExtJS 2.x 的多行工具条实现

,

通常的写法
tbar: [{
    ... ...
}, {
    ... ...
}]

这样实现的工具条只有一行。

有时候工具条按钮比较多,一行放不下,需要加行。
简单的做法是:
tbar: new Ext.Panel({
    border: false,
    items:[{
        xtype: 'toolbar',
        items: [
            ... ...
        ]
    }, {
        xtype: 'toolbar',
        items: [
            ... ...
        ]
    }, {
        xtype: 'toolbar',
        items: [
            ... ...
        ]
    }]
})

让 Zend_Db 支持 MySQL 的 SQL_CALC_FOUND_ROWS

, ,

修改 Zend/Db/Select.php, 增加以下代码

const FOUND_ROWS     = 'foundrows'; 
const SQL_FOUND_ROWS = 'SQL_CALC_FOUND_ROWS'; 

protected static $_partsInit = array(
    self::FOUND_ROWS   => false,  
    ... ...
);

/**
 * Makes the query SELECT SQL_CALC_FOUND_ROWS.  
 *
 * @param bool $flag Whether or not add SQL_CALC_FOUND_ROWS to SELECT.
 * @return Zend_Db_Select This Zend_Db_Select object.
 */
public function foundRows($flag = true)
{
    $this->_parts[self::FOUND_ROWS] = (bool) $flag;
    return $this;
}

/**
 * Render FOUND_ROWS clause  
 *
 * @param string   $sql SQL query
 * @return string
 */
protected function _renderFoundRows($sql)
{
    if ($this->_parts[self::FOUND_ROWS]) {
        $sql .= ' ' . self::SQL_FOUND_ROWS;
    }

    return $sql;
}


以上代码的具体位置不再详述。

调用方法如下:

$select = $db->select()->foundRows()->from(
  ... ...
)->where(
  ... ...
);

$data = $db->fetchAll($select);

$stmt = $db->query("SELECT FOUND_ROWS() as cnt");
list($rec) = $stmt->fetchAll();
$count = $rec['cnt'];

三个 JavaScript 工具 + 批处理

,

收集了三个针对 JavaScript 的工具:

1. JavaScript Lint
用于 js 查错。

2. YUI Compressor
用于压缩 js 文件。

3. Closure Compiler
用于压缩和优化 js 文件。

我把以上三个工具都放在 C:\jsl 下面,并把该目录加入系统变量 PATH。
随后在 C:\jsl 下新作三个 bat 文件,分别如下:

jsl.bat
@echo off
c:\jsl\jsl.exe -conf c:\jsl\jsl.default.conf -process "%1"


yuic.bat
@echo off
java -jar C:\jsl\yuicompressor-2.4.2.jar  -v --charset utf-8 -o "%2" "%1"


jsc.bat
@echo off
java -jar c:\jsl\compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --js "%1" > "%2"


使用例:

> jsl test.js
> yuic test.js test.min.js
> jsc test.js test.compiled.js

GAE 开发最常用的两个命令

GAE开发离不开两个很简单的命令,我是想起来才用一下,每次都上搜索引擎查询用法,费时费力,因此这儿做个笔记。

命令一
dev_appserver.py appname

命令二
appcfg.py update appname

详细用法请参考 Google 的文档:
dev_appserver.py
appcfg.py

采用 Zend Framework 的开源产品

Magento
开网店用,已经很有名气了,代码大而全,授权方式采用OSL 3.0。

Digitalus CMS
内容管理系统,后台管理做得还不错,其代码可用于学习ZF。

Dodo
用于搭建任务管理网站。 ZF的版本较新(目前是1.9.1),非常适合于学习ZF。

Windows 下构建 PHP 开发环境: WampServer + Xdebug

,

1. 下载 WampServer
网址: http://www.wampserver.com/en/download.php

2. 安装 WampServer
Windows 的标准安装步骤,连续点“下一步”即可。

3. 下载 Xdebug
网址: http://xdebug.org/download.php

页面上有好几个版本,刚开始一定会被迷惑,不知道该用哪个版本。
经过试验,我的环境(Windows XP)最终能用的是 5.3 VC6 (32 bit)。
(Apache 以外的服务器需用 nts 版本)

下载之后把文件移动(或复制)到 WampServer 的 php 的 ext 目录。

4. 编辑 php.ini
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
追加以下内容:
extension=php_xdebug-2.0.5-5.3-vc6.dll

;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
追加以下内容:
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000


5. 重新启动 WampServer 的 apache。

Smarty 下最简单的调试方法

, ,

很简单的一句话,却常常忘记,因此记录一下:
{$var|@debug_print_var}

稍微复杂一点的用法:
{$var|@debug_print_var:2:100}

意思是缩进长度为2个空格,每行最多字数为100。

其他调试方法可以参考这个(日文)

在虚拟主机上创建 Symbol Link

, ,

便宜的虚拟主机不提供 Shell,因此需要用命令实现的功能不大容易实现。
做网站经常要用 ln 命令创建链接,而要在一般的虚拟主机上就不得不想其他办法了。
不用命令的情况下,用程序倒也能解决一些问题,比如这个建立链接的目标,可用以下 PHP 程序实现:
<?php
$appLib = realpath(dirname(__FILE__) . '/../library');
$zfLib = realpath(dirname(__FILE__) . '/../../ZF');
symlink("$appLib/Zend", "$zfLib/Zend");

经测试,链接正常建立,然而不能正常工作,只能说虚拟主机的自我保护功能做得还不错。

Zend Framework 下实现简单的 proxy 功能

用 Zend_Http_Client 可实现简单的 Proxy 功能,代码如下:
public function proxyAction()
{
    $params = $this->_getAllParams();
    if(!isset($params['url'])) {
        echo 'URL未指定。';
    } else {
        $http = new Zend_Http_Client($params['url']);
        $response = $http->request();
        if ($response->getStatus() == 200) {
            header('Content-Type: text/html; charset=utf-8');
            echo mb_convert_encoding($response->getBody(), "utf-8", "auto");
        } else {
            echo 'HTTP通信错误发生。<br />' . $response->getStatus() . ": " . $response->getMessage();
        }
    }
}

用法:
http://domainname/proxy?url=http://....

用于分割字符串的两个 PHP 函数

,

新作了两个函数,结果没用上,放在在这儿以备用。
/**
 * 按词分割字符串
 * @param $str 元字符串
 * @param $maxLength 单词最大长度
 * @return array
 */
function splitInWords($str, $maxLength = 16) {
    if(empty($str)) return array();
    if($maxLength <= 0) $maxLength = 1;
    $rawWords = explode(' ', $str);
    $words = array();
    foreach($rawWords as $word) {
        $len = mb_strlen($word);
        if($len > $maxLength) {
            $pos = 0;
            while($len > $maxLength) {
                $words[] = mb_substr($word, $pos, $maxLength);
                $pos += $maxLength;
                $len -= $maxLength;
            }
            $words[] = mb_substr($word, $pos, $maxLength);
        } else {
            $words[] = $word;
        }
    }
    return $words;
}

/**
 * 按行(指定长度)分割字符串
 * @param $str 元字符串
 * @param $length 每行最大字符数
 * @return array
 */
function splitInLines($str, $length = 80) {
    $lines = array();
    foreach(split("\n", $str) as $s) {
        preg_match_all("/./u", $s, $matches);
        $arr = $matches[0];
        for($i = 0; $i < ceil(count($arr)/$length); $i++) {
            $lines[] = join("", array_slice($arr, $i*$length, $length));
        }
    }
    return $lines;
}

November 2009
S M T W T F S
October 2009December 2009
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30