仅在使用php-activerecord创建时执行验证

时间:2011-09-28 07:59:42

标签: php activerecord codeigniter-2

我正在使用Codeigniter和php-activerecord创建用户模型,wiki说我可以使用'on'=> “创建”仅在创建新记录时运行验证,如此,

static $validates_presence_of = array(
    array('title', 'message' => 'cannot be blank on a book!', 'on' => 'create')
);

它还声明我们可以访问“保存”,“更新”和“删除”......

这些都不适合我,我可以找出原因,这是我的代码,

// Validations
static $validates_presence_of = array(
array('email', 'message' => 'Please enter a valid email address.'),
array('password', 'message' => 'Password must be provided.', 'on' => 'create')
);

我想将其设置为这样,以便当用户更新其个人资料时,他们可以将密码留空以保留当前密码。

感谢任何帮助或指导!谢谢!

3 个答案:

答案 0 :(得分:1)

应该像这样调用验证方法:

     #example
$your_obj = new Instace();

if($your_obj->is_valid()) {
  // if all is correct your logical code
}
else {
 // your logical to show the error messages
}
//doesnt work if you write 

if(!$your_obj->is_valid())

//the other way you must be use the next method 
if($your_obj->is_invalid())

答案 1 :(得分:1)

原因很可能是因为它没有实施。

相关类是lib / Model.php和lib / Validations.php

从纯粹抽象的角度来看,您需要跟踪保存和创建之间的操作模式。为此,我在lib / Model.php中创建了一个公共属性(public $ validation_mode),并将该属性分别设置为私有方法Model :: insert()和Model :: update()中的'create'或'save'。这些值与您尝试使用的“on”属性相匹配。

然后在lib / Validations.php中,我修改了以下方法:

<强>验证:: validates_presence_of()

public function validates_presence_of($attrs)
{
    $configuration = array_merge(self::$DEFAULT_VALIDATION_OPTIONS, array('message' => Errors::$DEFAULT_ERROR_MESSAGES['blank'], 'on' => 'save'));

    foreach ($attrs as $attr)
    {
        $options = array_merge($configuration, $attr);
        $this->record->add_on_blank($options[0], $options['message'], $options);
    }
}

<强>错误:: add_on_blank()

public function add_on_blank($attribute, $msg, $options = array())
{
    if (!$msg)
        $msg = self::$DEFAULT_ERROR_MESSAGES['blank'];

    if (($value = $this->model->$attribute) === '' || $value === null)
            {
                    if(array_key_exists('on', $options))
                    {
                        if($options['on'] == $this->model->validation_mode)
                        {
                            $this->add($attribute, $msg);
                        }
                    } else {                            
                        $this->add($attribute, $msg);
                    }
            }
}

这基本上是将模型中指定的所有$选项(包括'on'属性)传递给Errors :: add_on_blank()方法,它现在有足够的信息来区分'on'=&gt; '创建'和默认('开'=&gt;'保存')。使用Model类中的public $ validation_mode属性($ this-&gt; model-&gt; validation_mode),我们可以确定当前的操作模式是什么以及我们是否希望继续添加错误消息或者这次跳过它周围。

显然,您希望记录所做的任何更改并进行彻底测试。根据文档,所有验证方法都应该支持这个“共同选项”和allow_null,allow_blank,但是如果它没有实现,你将不得不通过进行这些必要的更改来实现它。

答案 2 :(得分:1)

如果没有编辑库,我会找到你问题的答案。

添加before_validation回调并在此回调中添加验证规则。它对我有用。

static $before_validation_on_create = array('before_validation_on_create');

static $validates_presence_of = array(
    array('login'),
);

public function before_validation_on_create() {
   self::$validates_presence_of[] = array('password');
}