# 模板函数使用指南 如果在使用模板函数时提示 `recorder_get_records` 等函数未定义,请按照以下步骤解决: ## 问题原因 模板函数需要在ThinkPHP启动时正确注册到全局作用域,可能因为以下原因导致函数未注册: 1. Composer自动加载未正确更新 2. 插件服务未正确启动 3. 函数文件未被正确加载 ## 解决方案 ### 方案1: 更新Composer自动加载(推荐) 在项目根目录执行: ```bash composer dump-autoload ``` 这会重新生成自动加载文件,确保 `src/functions.php` 被正确加载。 ### 方案2: 手动引入函数文件 #### 在应用启动时引入 在 `app/provider.php` 或 `config/app.php` 中添加: ```php // 引入操作记录模板函数 $functionsFile = app_path('plugs/think-plugs-recorder/src/functions.php'); if (file_exists($functionsFile)) { require_once $functionsFile; } ``` #### 在模板中临时引入 在需要使用的模板文件顶部添加: ```html {php} $functionsFile = app_path('plugs/think-plugs-recorder/src/functions.php'); if (file_exists($functionsFile)) { require_once $functionsFile; } {/php} {:recorder_render_list(['user_id' => $user_id])} ``` #### 在控制器中引入 在控制器的构造函数或方法中: ```php {assign name="records" value=":jerryyan\recorder\helper\ViewHelper::getRecords(['user_id' => $user_id])" /} {:jerryyan\recorder\helper\ViewHelper::renderList(['user_id' => $user_id], ['limit' => 10])} {:jerryyan\recorder\helper\ViewHelper::renderTimeline(['data_type' => 'order', 'data_id' => $order_id])} {:jerryyan\recorder\helper\ViewHelper::renderItem($record, ['show_extra' => true])} {assign name="stats" value=":jerryyan\recorder\helper\ViewHelper::getStats()" /} ``` ## 测试函数注册 运行测试脚本检查函数是否正确注册: ```bash php plugs/think-plugs-recorder/test_functions.php ``` ## 可用的模板函数 注册成功后,以下函数可在模板中直接使用: ### recorder_get_records() 获取操作记录数据: ```html {assign name="records" value=":recorder_get_records(['user_id' => $user_id, 'limit' => 5])" /} {volist name="records" id="record"}
总操作次数: {$stats.total_count}
``` ## 常见问题 ### Q: 提示 "Call to undefined function recorder_get_records()" A: 函数未正确注册,请按方案1或方案2解决。 ### Q: 函数存在但调用时报错 A: 可能是数据库连接问题或权限问题,检查数据库配置和表是否存在。 ### Q: 在某些页面可以使用,某些页面不能使用 A: 可能是自动加载时机问题,建议使用方案2在应用启动时全局引入。 ### Q: 开发环境正常,生产环境报错 A: 生产环境需要重新执行 `composer dump-autoload --optimize`。 ## 最佳实践 1. **推荐使用方案1**: 通过Composer自动加载是最标准的方式 2. **在应用启动时引入**: 确保所有页面都能使用函数 3. **备用方案**: 准备类方法调用作为备用方案 4. **错误处理**: 在模板中使用函数前检查函数是否存在 ```html {if function_exists('recorder_render_list')} {:recorder_render_list(['user_id' => $user_id])} {else} {:jerryyan\recorder\helper\ViewHelper::renderList(['user_id' => $user_id])} {/if} ```