早上接到老家叔叔的电话,说奶奶今天早上去世了。享年 97 岁。
之前春节带宝宝回去,就是怕奶奶某一天突然去世,这一天还是来了,只是来得太突然。只好匆匆买了机票,让我爸妈明天早上飞机回深圳。
今天一整天,整个家族的人都在通电话,个个都是眼泪啪嗒啪嗒的,特别是姐姐妹妹们。在广东的亲戚几乎都是今天就启程回梅州,大部分是从深圳出发。我是离得最远的一个,目前还没确定回不回去。
说起奶奶,她很少跟我们讲她的过去。我们一起生活了二十来年,直到我来到北京上大学、工作。记忆里边的都是小时候兄弟姐妹们在奶奶床上玩耍的情景。
奶奶走的时候,一定很安详……
Posted in 日常生活 | Comments (4) »
Zend Framework 1.5 已经对 AJAX 有了不错的支持,使用上也很简单。主要涉及到的类是 Zend_Controller_Action_Helper_AjaxContext,这个类中的方法 initContext() 中通过判断 XHR 头来确定是否是 AJAX 调用:
<?php
/**
* Initialize AJAX context switching
*
* Checks for XHR requests; if detected, attempts to perform context switch.
*
* @param string $format
* @return void
*/
public function initContext($format = null)
{
$this->_currentContext = null;
if (!$this->getRequest()->isXmlHttpRequest()) {
return;
}
return parent::initContext($format);
}
?>
可以使用 ZF 默认的目录部署来写一个简单示例,目录结构如下:
application/
controllers/
IndexController.php
models/
views/
scripts/
index/
index.phtml
demo.ajax.phtml
helpers/
filters/
html/
.htaccess
index.php
js/
jquery.js
JavaScript 库使用 jQuery。需要写代码的文件是 IndexController.php、index.phtml 和 demo.ajax.phtml。IndexController.php 包含了 2 个 actions,一个是 index,一个是 demo。index 中有个按钮用于测试 AJAX 请求,而请求的目标则是 demo action。demo 对应的视图名字后缀使用了 .ajax.phtml,这是默认的设置。Front controller 的调用很简单:
<?php
require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::getInstance()
->setParam('useDefaultControllerAlways', true)
->setControllerDirectory('../application/controllers')
->dispatch();
?>
IndexController.php 在初始化的时候,需要初始化 AjaxContext Helper:
<?php
class IndexController extends Zend_Controller_Action
{
public function init()
{
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('demo', 'html')
->initContext();
}
public function indexAction()
{
}
public function demoAction()
{
$this->view->hello = 'Hello, world! ('.date('H:i:s').')';
}
}
addActionContext('demo', 'html') 表明 demoAction 为 AJAX 调用的 action,格式为 html。除了 html 之外,还支持 xml、json 等。AJAX 请求时需要给请求的 url 加上 format=html 的 GET 参数。indexAction 对应的视图 index.phtml 代码如下:
<html>
<head>
<title>AJAX DEMO</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="<?=$this->url()?>js/jquery.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#ajax_button').click(function(){ //#ajax_button 的 onclick 事件触发
var url = '<?=$this->url(array('controller'=>'index','action'=>'demo'))?>'; //AJAX 请求的目标 URL
$.get(url, {'format':'html'}, function(data){ //这里传递了 format=html 的 GET 参数
$('#hello_message').html(data); //将 AJAX 返回的内容显示在 #hello_message 里边
});
});
});
</script>
</head>
<body>
<p><input type="button" id="ajax_button" value="AJAX Call" />
<p id="hello_message"><p>
</body>
</html>
demoAction 对应的视图 demo.ajax.phtml 内容很简单,只是输出 $hello:
<?=$this->hello?>
这就是一个完整的 AJAX 过程。使用 Zend Framework 写出来的代码其实很简单。如果想更加简单一些,可以写个 jQuery AJAX 的 view helper,封装 jQuery 的 JavaScript 代码。
Zend Framework 还提供了 autocomplete(自动完成)AJAX 的 action helper:Zend_Controller_Action_Helper_AutoCompleteScriptaculous 和 Zend_Controller_Action_Helper_AutoCompleteDojo,一个是 for Scriptaculous 的,另一个是 for Dojo 的。
Posted in 程序人生, AJAX, Zend Framework, JavaScript | Comment (0) »
不容易呀,PHP 在某些方面得到了 Ruby 阵营的 DHH 的认同(The immediacy of PHP):
I've been writing a little bit of PHP again today. That platform has really received an unfair reputation. For the small things I've been used it for lately, it's absolutely perfect.
I love the fact that it's all just self-contained. That the language includes so many helpful functions in the box. And that it managed to get distributed with just about every instance of Apache out there.
For the small chores, being quick and effective matters far more than long-term maintenance concerns. Or how pretty the code is. PHP scales down like no other package for the web and it deserves more credit for tackling that scope.
其实语言就是工具,何必非要比个高低呢。PHP 和 Ruby 各有所长,都有适用的地方,只是有些 fans 太过于狂热了,非要分出个高下来,这就如同“萝卜白菜哪个更好吃”的问题一样,呵呵。
Posted in 程序人生, Ruby & RoR | Comment (0) »
Class Query 是在 jQuery 之上开发的一个以 class 为主的 JavaScript 库。众所周知,jQuery 语法简单,应用方便,但却由于过于简单,没能提供更加强大的功能,比如 class/object 的扩展,这些对于协调开发都是不可或缺的。在这方面 prototype,mootools 做的都比较好。Class Query 正是出于此目的出现的。
看看这段代码:
<script src="jquery.js"></script>
<script src="classy.js"></script>
<script>
jQuery.Events.addEventListener(document, "ready", function(){
jQuery.querySelectorAll("div").forEach(function(elem){
jQuery.DOM.append(elem, " <b>More…</b>");
});
jQuery.querySelectorAll("div b").forEach(function(elem){
jQuery.Events.addEventListener(elem, "click", function(elem, event){
var next = jQuery.Traversal.nextSibling(elem);
var animation = jQuery.Effects.buildAnimation( next, {height: "toggle"});
amimation.start();
});
});
});
</script>
class/object 可以扩展:
jQuery.DOM.boldWrapInner = jQuery.DOM.wrapInner.extend({
attach: function(elem){
this._super(elem, "<b></b>");
}
});
Happy April Fools Day 2008 
Posted in 程序人生, JavaScript | Comment (0) »