В CodeIgniter форма проверки твар


Я разработал твар "помощник" сортов. Полей/столбцов извлекаются из базы данных и содержит все от имя поля тип и размер поля. Часть системы интегрирует в CodeIgniter форма проверки библиотеки. В частности, функция, объект поля передается в функцию и происходит следующее:

  1. Система автоматически добавляет требования к проверке на основе объекта поля. Например, является ли поле обязательным (дБ говорит, что поле не может быть null), если в БД поле имеет max_length ограничения .и т. д.
  2. Если пользователь указал набор правил проверки мы сами сначала проверьте, чтобы увидеть, если мы уже задали правила (в 1) и как специальное требование, мы проверяем, чтобы увидеть, если пользователь указал max_length не больше max_length определяются дБ. Если это так, то мы используем БД одна. Примечание: пользовательских правил в качестве трубы-разделены строку, поэтому мы должны разбить его, чтобы получить его как массив.
  3. Затем мы создаем труб, разделенных строкой, что CI форма проверки может понять.

Проблема, я думаю, там может быть лучшего способа сделать это. Кажется, довольно грязный преобразования правила проверки пользователей в массив и затем обратно интро строку. И решение для max_length не кажется идеальным. Мне нужна помощь с рефакторинга.

Код работает 100% кстати.

Использование:

if (($rules = $this->field_validation_rules($field)) !== false) {
    $this->CI->form_validation->set_rules($field->name, $field->human_name, $rules);
}

Функции:

/**
 * Gets validation rules for a field
 * 
 * Combines system rules and user rules
 * 
 * Required enforced if column cannot be null
 * 
 * Max length enforced for columns with max length attributes, overridden
 * by user max length of a smaller value than that which the db specifies
 * 
 * In list enforced for columns with type enum (if the field has user specified
 * in_list it will be removed as db one takes precedence)
 * 
 * @param obj $field
 * @return boolean|string
 */
protected function field_validation_rules($field) {
    $sdata = array();
    if (!$field->null) {
        $sdata['trim'] = 'trim';
        $sdata['required'] = 'required';
    }
    if (!is_null($field->max_length)) {
        if ($field->db_type == 'enum') {
            $sdata['in_list'] = implode(',', $this->get_enum_options($field));
        } else {
            $sdata['max_length'] = $field->max_length;
        }
    }
    if ($field->db_type == 'int') {
        $sdata['integer'] = 'integer';
    } elseif ($field->db_type == 'numeric') {
        $sdata['numeric'] = 'numeric';
    }
    $urules = array();
    if (isset($this->validation_rules[$field->name])) {
        if (count($sdata) == 0) {
            return $this->validation_rules[$field->name];
        } else {
            $urules = explode('|', $this->validation_rules[$field->name]);
            foreach ($urules as $index => $rule) {
                $f_rule = preg_filter('/\[(.*?)\]/', '', $rule);
                if (empty($f_rule)) {
                    $f_rule = $rule;
                }
                if (in_array($f_rule, array_keys($sdata))) {
                    if ($f_rule == 'max_length') {
                        if (preg_match('/\[(.*?)\]/', $rule, $matches) && intval($matches[1]) > $field->max_length) {
                            unset($urules[$index]);
                        } else {
                            unset($sdata['max_length']);
                        }
                    } else {
                        unset($urules[$index]);
                    }
                }
            }
        }
    }
    $srules = array();
    foreach ($sdata as $key => $val) {
        if ($key == $val) {
            $srules[] = $key;
        } else {
            $srules[] = $key . "[{$val}]";
        }
    }
    $rules = array_merge($srules, $urules);
    if (count($rules) !== 0) {
        return implode('|', $rules);
    } else {
        return false;
    }
}

Примечание: $this->validation_rules[$field->name] содержит пользовательские правила для поля (если таковые имеются).



422
1
задан 5 марта 2018 в 06:03 Источник Поделиться
Комментарии