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

CodeIgniter集成Twig后表单验证消息无法显示问题求助

解决CodeIgniter集成Twig时表单验证消息不显示的问题

刚接触Twig遇到这种问题很正常,我来帮你排查下核心原因——大概率是表单验证的错误信息没正确传递到Twig模板里,或者模板里的调用方式不对。下面给你一步步的解决方案:

第一步:在控制器里传递验证错误信息

当表单验证失败时,你需要把CodeIgniter表单验证类生成的错误数据,通过Twig的渲染参数传进模板里。修改你的user_register方法:

public function user_register() {
    $this->form_validation->set_rules('username', 'Username', 'trim|required');
    $this->form_validation->set_rules('password', 'Password', 'trim|required');

    if ($this->form_validation->run() == FALSE) {
        // 把所有错误信息打包成数组传给Twig
        $data['validation_errors'] = $this->form_validation->error_array();
        // 顺便传递表单旧值,方便用户重新填写
        $data['old_input'] = $this->input->post();
        
        // 渲染Twig模板时带上这些数据
        $this->twig->display('register.twig', $data);
    } else {
        // 验证成功后的逻辑,比如保存用户、跳转
        redirect('user/login');
    }
}

第二步:在Twig模板里显示错误信息

现在你可以在模板里根据传递的validation_errors数组,针对性地显示单个字段的错误,或者批量显示所有错误:

单个字段错误显示示例

<div class="form-group">
    <label for="username">用户名</label>
    <input type="text" name="username" id="username" value="{{ old_input.username|default('') }}">
    {# 检查当前字段是否有错误,有就显示 #}
    {% if validation_errors.username %}
        <span class="text-danger">{{ validation_errors.username }}</span>
    {% endif %}
</div>

<div class="form-group">
    <label for="password">密码</label>
    <input type="password" name="password" id="password">
    {% if validation_errors.password %}
        <span class="text-danger">{{ validation_errors.password }}</span>
    {% endif %}
</div>

批量显示所有错误示例

如果想一次性展示所有验证错误,可以这么写:

{% if validation_errors is not empty %}
    <div class="alert alert-danger">
        <ul>
            {% for field, error in validation_errors %}
                <li>{{ error }}</li>
            {% endfor %}
        </ul>
    </div>
{% endif %}

可选:让Twig直接支持CI的表单验证方法

如果你不想每次都手动传递错误数组,可以检查你用的「CodeIgniter Simple and Secure Twig」是否配置了全局访问CI实例。如果配置了,你可以直接在模板里调用CI的表单验证方法:

{# 直接调用form_validation的error方法获取单个字段错误 #}
{% if form_validation.error('username') %}
    <span class="text-danger">{{ form_validation.error('username') }}</span>
{% endif %}

不过这个要看集成包的具体配置,如果你不确定,还是用前面手动传递数据的方法更稳妥。

内容的提问来源于stack exchange,提问作者Dan Angelo Alcanar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:48:32