You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Smarty中实现Codeigniter的set_value()函数以重填充表单?

在Smarty中实现表单值重填充(替代CodeIgniter的set_value)

其实这个问题很好解决,核心就是把CodeIgniter里set_value()的逻辑适配到Smarty模板里,我给你两种常用的方案,选适合你项目的来用:

方案一:控制器传值(简单直接)

如果是CodeIgniter和Smarty整合的项目,你可以在控制器里先把表单字段的旧值整理好,再传给模板:

  1. 控制器代码示例
    在处理表单的控制器方法里,用CI的set_value()获取每个字段的提交后值,打包成数组传给Smarty:

    // 整理需要保留值的表单字段
    $form_data = [
        'username' => set_value('username'),
        'email' => set_value('email'),
        // 其他需要的字段都可以加在这里
    ];
    // 把数据赋值给Smarty模板
    $this->smarty->assign('form_values', $form_data);
    
  2. Smarty模板修改
    把你原来的输入框代码改成这样,从控制器传过来的数组里取值,同时保留默认值:

    <input type="text" name="{$field_name}" value="{$form_values[$field_name]|default:''}" class="form-control">
    

    这里把默认值从0改成空字符串更合理,毕竟文本输入框默认应该是空的;如果是数字类型的输入(比如年龄、ID),再改回0就行。

方案二:自定义Smarty插件(优雅复用)

要是不想每次都在控制器里手动整理字段,你可以给Smarty写个自定义函数,直接在模板里像用set_value()一样调用:

  1. 创建Smarty插件文件
    在Smarty的插件目录(一般是application/libraries/smarty/plugins)新建function.set_value.php,内容如下:

    <?php
    function smarty_function_set_value($params, $smarty) {
        // 拿到CI的实例
        $CI =& get_instance();
        // 获取字段名参数,必填
        $field = isset($params['name']) ? $params['name'] : '';
        // 获取可选的默认值
        $default = isset($params['default']) ? $params['default'] : '';
        // 直接返回CI的set_value结果
        return $CI->form_validation->set_value($field, $default);
    }
    ?>
    
  2. 模板里直接调用
    现在你可以把输入框代码改成这样,完全模拟CI原生的set_value用法:

    <input type="text" name="{$field_name}" value="{set_value name=$field_name default=''}" class="form-control">
    

    这样表单验证失败后会自动填充用户之前输入的值,第一次加载表单时就显示你设置的默认值,和原来的效果一模一样。

小提醒

别忘了确保你的CodeIgniter项目已经加载了form_validation库,可以在控制器里手动加载,或者在autoload.php里配置自动加载。

内容的提问来源于stack exchange,提问作者Urudin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:56:21