Выполнять проверку только при создании с использованием php-activerecord - PullRequest
0 голосов
/ 28 сентября 2011

Я создаю пользовательскую модель, используя Codeigniter и php-activerecord, и в вики сказано, что я могу использовать 'on' => 'create', чтобы запустить проверку только при создании новой записи, например,

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 ]

1 голос
/ 11 апреля 2012

Причина этого, скорее всего, заключается в том, что она не была реализована.

Соответствующими классами являются lib / Model.php и lib / Validations.php

С чисто абстрактной точки зрения вам необходимо отслеживать режим работы между сохранением и созданием. Для этого я создал открытое свойство (public $ validation_mode) в lib / Model.php и установил для этого свойства значение 'create' или 'save' в закрытых методах Model :: insert () и Model :: update () соответственно. Эти значения соответствуют свойству on, которое вы пытаетесь использовать.

Затем в lib / Validations.php я изменил следующие методы:

Validations :: 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' => ' создать 'и по умолчанию (' on '=>' сохранить '). Используя открытое свойство $ validation_mode из класса Model ($ this-> model-> validation_mode), мы можем определить текущий режим работы и хотим ли мы продолжать добавлять сообщение об ошибке или пропустить его на этот раз.

Очевидно, что вы захотите задокументировать любые внесенные вами изменения и тщательно протестировать их. Согласно документации, все методы валидации предположительно поддерживают эту «общую опцию» на стороне allow_null, allow_blank, но опять же, если она не реализована, вам придется сделать это самостоятельно, внеся эти необходимые изменения.

1 голос
/ 27 ноября 2013

Я нашел ответ на ваш вопрос без редактирования библиотеки.

Добавьте обратный вызов 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');
}
1 голос
/ 02 декабря 2011

должен быть вызван метод проверки как это:

     #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())
...