Azalea 项目中,当进行 View 视图渲染时,需要动态增加几个模板文件中使用的函数,如下面的模板文件代码片段
// 增加了 p 方法用于 HTML 转义输出,并支持 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 实现了一个 azaleaSprintf 方法
if ((result = azaleaSprintf(execute_data)) == NULL) {
RETURN_FALSE;
}
// 然后进行 HTML 转义
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);
}
/* }}} */
然后在需要注册函数的地方,调用 zend_register_functions
zend_register_functions(NULL, azalea_template_functions, NULL, MODULE_TEMPORARY);
当然你可能还需要在结束时删除这些临时 functions
zend_unregister_functions(azalea_template_functions, -1, NULL);