Azalea 項目中瓢剿,當(dāng)進行 View 視圖渲染時疗杉,需要動態(tài)增加幾個模板文件中使用的函數(shù),如下面的模板文件代碼片段
// 增加了 p 方法用于 HTML 轉(zhuǎn)義輸出昭伸,并支持 printf 格式
<span><?php p('您好 %s, %s好', $username, date('H') <= 12 ? '上午' : '下午'); ?></span>
// 增加了 url 方法用于輸出絕對路徑
<a href="<?php echo url('login') ?>">登錄</a>
先需要類似普通的模塊 functions 注冊
static zend_function_entry azalea_template_functions[] = {
ZEND_NAMED_FE(p, ZEND_FN(azalea_template_printf), NULL) // 注冊 p
ZEND_NAMED_FE(url, ZEND_FN(azalea_url), NULL) // 注冊 url
PHP_FE_END
};
/* {{{ proto void p( string $format [, mixed $args [, mixed $... ]] ) */
PHP_FUNCTION(azalea_template_printf)
{
zend_string *result, *text;
// 參考 formatted_print.c 實現(xiàn)了一個 azaleaSprintf 方法
if ((result = azaleaSprintf(execute_data)) == NULL) {
RETURN_FALSE;
}
// 然后進行 HTML 轉(zhuǎn)義
text = php_escape_html_entities_ex((unsigned char *) ZSTR_VAL(result), ZSTR_LEN(result), 0, ENT_QUOTES, get_default_charset(), 1);
zend_string_release(result);
// 輸出
PHPWRITE(ZSTR_VAL(text), ZSTR_LEN(text));
zend_string_release(text);
}
/* }}} */
然后在需要注冊函數(shù)的地方胀滚,調(diào)用 zend_register_functions
zend_register_functions(NULL, azalea_template_functions, NULL, MODULE_TEMPORARY);
當(dāng)然你可能還需要在結(jié)束時刪除這些臨時 functions
zend_unregister_functions(azalea_template_functions, -1, NULL);