我正在CodeIgniter中开发一个表单,我希望根据name和password字段的验证状态动态更改输入字段类.我的问题是,当我提交一个有效的名称和无效的密码时,密码和名称都变成了红色. My desired output是如果名称是有效的,它将变成绿色,密码变成红色,因为它是无效的时提交. 任何建议或见解将不胜感激!

下面是我的视图或Github repository中的相关代码片段:

form.php(查看)

<input type="text" name="name" value="<?php echo set_value('name'); ?>" class=<?php echo (isset($name_valid) && $name_valid === true) ? '"text-green-500"' : '"text-red-500"'; ?>>
<input type="text" name="password" value="<?php echo set_value('password'); ?>" class="<?php echo (isset($password_valid) && $password_valid == 'true') ? 'text-green-500' : 'text-red-500'; ?>">

UserController.php(Controller方法)

public function create() {
        $this->load->model('UserModel');
        $data = array(
            'name' => $this->input->post('name'),
            'password' => $this->input->post('password')
        );
        $validated_result = $this->UserModel->validate_input($data);

        if ($validated_result['name_valid'] === true) {
            $data['name_valid'] = true;
        }
        if ($validated_result['password_valid'] === true) {
            $data['password_valid'] = true;
        }
        $this->load->view('form', $data);

UserModel.php

 public function validate_input($data) {
        $this->load->library('form_validation');

        $this->form_validation->set_rules('name', 'name', 'required|trim|regex_match[/^[^0-9]+$/]');
        $this->form_validation->set_rules('password', 'Password', 'required|trim|min_length[5]|max_length[100]');

        $result['name_valid'] = $this->form_validation->run(['name' => $data['name']]);
        $result['password_valid'] = $this->form_validation->run(['password' => $data['password']]);

        return $result;
    }

推荐答案

您不能使用$this->form_validation->run()与名称和数据的单个字段.run方法接受的唯一参数是组的名称,它引用了配置文件中的一组验证规则,然后这些规则将应用于整个表单,而不是单个字段.

通过调用$this->form_validation->run()两次,它将执行您为这两个字段设置的两个验证规则两次.这两个调用都会给你整个表单的结果,而不是单个字段的结果(所以如果两个字段都有效,则为true,如果一个或两个字段都有错误,则为false).

要获取单个字段的错误,您可以在调用$this->form_validation->run();后使用$this->form_validation->error('fieldName');,这将为您提供该字段的错误信息,如果该字段有效,则提供空字符串.如果需要,可以将其转换为布尔值:

public function validate_input($data) {
    $this->load->library('form_validation');

    $this->form_validation->set_data($data);
    $this->form_validation->set_rules('name', 'name', 'required|trim|regex_match[/^[^0-9]+$/]');
    $this->form_validation->set_rules('password', 'Password', 'required|trim|min_length[5]|max_length[100]');

    $this->form_validation->run();

    $result['name_valid'] = !$this->form_validation->error('name');
    $result['password_valid'] = !$this->form_validation->error('password');

    return $result;
}

如果您想验证$_POST数组中的数据,可以省略$data参数和$this->form_validation->set_data($data);(这似乎是您正在做的事情)—如果您不向表单验证库传递任何数据,默认情况下表单验证库会验证$_POST数据.

与使用$this->form_validation->error('fieldName');获取错误并将其传递到视图中,您也可以直接使用form_error('fieldName')访问视图中的错误,如下所示:

<input type="text" name="name" value="<?php echo set_value('name'); ?>" class=<?php echo !form_error('name') ? '"text-green-500"' : '"text-red-500"'; ?>>
<input type="text" name="password" value="<?php echo set_value('password'); ?>" class="<?php echo !form_error('password') ? 'text-green-500' : 'text-red-500'; ?>">

希望这一切都有帮助!

Php相关问答推荐

未找到laravel cascadeOnEdit

有什么方法可以阻止WordPress主题升级通知吗?

使用列入黑名单的单词和自定义业务逻辑的组合将特定的子字符串包装在HTML标记中

使注册字段UserMeta值对于WooCommerce中的每个用户是唯一的

FlySystem v3:使用本地适配器时出现问题

未检测到laravel控制器

将自定义字段添加到管理产品 在 WooCommerce 3.2+ 中批量编辑

如何将不同的 Woocommerce 费用合并为一个名称?

将 PHP 版本更改为 8.1,但 WordPress 认为我们正在使用版本 7.4?

使用自定义插件中的 WooCommerce 模板发送自定义邮箱

PHP 中的curl -F request=@file.xml

如何使用不同的方法编写嵌套连接查询并将两列连接成一列在 laravel 查询生成器中

Shopware 6 AuthControllerDecorator已弃用

URL中包含"&"与DirectoryIterator不兼容

从图像URL中获取文件扩展名?

如何在PHP中对多个脚本调用进行排队?

.htaccess环境变量条件不被判断

在 PHP 中验证签名

mysql / sql修复多对多数据库中的行

如何将 2021-04-08T22:25:09.335541Z 作为时间戳保存到 Laravel 中的数据库中?