如何在Smarty中实现Codeigniter的set_value()函数以重填充表单?
在Smarty中实现表单值重填充(替代CodeIgniter的
set_value) 其实这个问题很好解决,核心就是把CodeIgniter里set_value()的逻辑适配到Smarty模板里,我给你两种常用的方案,选适合你项目的来用:
方案一:控制器传值(简单直接)
如果是CodeIgniter和Smarty整合的项目,你可以在控制器里先把表单字段的旧值整理好,再传给模板:
控制器代码示例
在处理表单的控制器方法里,用CI的set_value()获取每个字段的提交后值,打包成数组传给Smarty:// 整理需要保留值的表单字段 $form_data = [ 'username' => set_value('username'), 'email' => set_value('email'), // 其他需要的字段都可以加在这里 ]; // 把数据赋值给Smarty模板 $this->smarty->assign('form_values', $form_data);Smarty模板修改
把你原来的输入框代码改成这样,从控制器传过来的数组里取值,同时保留默认值:<input type="text" name="{$field_name}" value="{$form_values[$field_name]|default:''}" class="form-control">这里把默认值从
0改成空字符串更合理,毕竟文本输入框默认应该是空的;如果是数字类型的输入(比如年龄、ID),再改回0就行。
方案二:自定义Smarty插件(优雅复用)
要是不想每次都在控制器里手动整理字段,你可以给Smarty写个自定义函数,直接在模板里像用set_value()一样调用:
创建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); } ?>模板里直接调用
现在你可以把输入框代码改成这样,完全模拟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
相关产品推荐
相关产品推荐

