【问题标题】:How to Call model function as validation rule如何调用模型函数作为验证规则
【发布时间】:2015-08-28 08:09:39
【问题描述】:

我在使用带有 CodeIgniter 3.x 的 form_validation 库时遇到了问题:

我想使用模型函数作为输入的验证规则。当我提交表单时,似乎根本没有调用该函数。 According to the user guide,这是我从控制器执行此操作的方式:

if($this->input->post() !== false) 
    {
        $this->form_validation->set_rules(
            'username', //the post value to check
            'User Name',
            array(
                'trim',
                'required',
                array($this->user_model, 'checkUserName') // i want to call checkUserName from the user_model model
            )
        );

我不明白为什么它甚至不调用 user_model 中的 checkUserName 函数:有人知道吗?

[EDIT]:我在 system/libraries/form_validation.php 中看到了 set_rules() 函数的源代码。似乎如果第三个参数不是字符串,它什么都不做,所以我不能调用模型函数。用户指南不是最新的? 这是我从 form_validation 中找到的代码行:

// No fields? Nothing to do...
    if ( ! is_string($field) OR  ! is_string($rules) OR $field == '')
    {
        return $this;
    }

【问题讨论】:

  • 您是否在构造函数中加载了模型文件并确保您运行的是 PHP 5.3+ !!
  • 是的:我正在运行 php 5.6.10,并且模型已加载到我的控制器的构造函数中。
  • 你有什么错误吗??
  • 日志阈值在我的 config.php 文件中定义为 4:没有任何可疑之处,即使在 php 错误日志中也是如此。看来 form_validation 只是忽略了这个规则
  • 你有没有代码进入这个条件if($this->input->post() !== false)

标签: php codeigniter


【解决方案1】:

如果您正在检查用户名是否重复,请使用内置函数 is_unique['table.field]
table:表名。
field:是名称将要检查的字段。

$this->form_validation->set_rules('username', User Name, 'is_unique['users.username]');

这将检查 dbtable 用户字段中的用户名。如果找到提供的用户名,它将返回 错误用户名不是唯一的

这是在 form_validation 类中定义的is_unique() 函数:

public function is_unique($str, $field)
    {
        sscanf($field, '%[^.].%[^.]', $table, $field);
        return isset($this->CI->db)
            ? ($this->CI->db->limit(1)->get_where($table, array($field => $str))->num_rows() === 0)
            : FALSE;
    }

如果您真的想调用自己的自定义函数,那么...
最好是扩展 form_validation 类:如下。

class MY_Form_validation extends CI_Form_validation {
    protected $CI;
    public function __construct()
    {
        parent::__construct();
        $this->CI =& get_instance();
    }

    public function check_user_name($str)
    {
      //here you codes goes eg.$this->CI->db->get_where(); etc.
    }
}

【讨论】:

  • 我不想检查用户名是否唯一:我必须检查它是否存在并检查其他一些设置,所以我无法使用它。但正如我在帖子编辑中所说,奇怪的是用户指南谈到了一个似乎没有实现的功能
【解决方案2】:
'premium_dates' => [
        'field'  => 'premium_dates',
        'label'  => 'Premium dates',
        'rules'  => [
            'trim',
            ['validate_premium_dates', function () {
                return $this->Properties_seasons_model->validate_premium_dates();
            }],
        ],
        'errors' => [
            'validate_premium_dates' => 'Premium dates enabled. Please choose at least one Premium Date.',
        ],
    ];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 2019-08-07
    相关资源
    最近更新 更多