Ejemplo n.º 1
0
 function setFilter(Rule $rule)
 {
     $this->filtered = Check::filter($this->input, $rule, $this->errors);
     return !isset($this->errors) || !$this->errors->isExist();
 }
Ejemplo n.º 2
0
 /**
  * Проверка и фильтр массива с учетом правил на его элементы
  * @param mixed $value Значение для проверки и фильтра
  * @param null|Error &$error Возвращаемый объект исключения, если элементы не соответсвуют правилам
  * @param array $args Аргументы фильтра
  * @return array
  */
 static function arrays($value, &$error, $args)
 {
     $result = [];
     if (is_array($value)) {
         $err_msg = 'Некорректное структура массива или значения в нём';
         // Контейнер для ошибок на элементы
         $error = null;
         //$error = new Error('Неверная структура.', 'arrays');
         // Сведения о правиле
         $rule_sub = [];
         $rule_default = null;
         $tree = false;
         foreach ($args as $arg) {
             if (is_array($arg)) {
                 $rule_sub = $arg;
             } else {
                 if ($arg instanceof Rule) {
                     $rule_default = $arg;
                 } else {
                     if (is_string($arg)) {
                         $rule_default = Rule::$arg();
                     } else {
                         if ($arg === true) {
                             $tree = true;
                         }
                     }
                 }
             }
         }
         // Перебор и проверка с фильтром всех элементов
         foreach ((array) $value as $key => $v) {
             $sub_error = null;
             if (isset($rule_sub[$key])) {
                 // Отсутствие элемента
                 if (isset($rule_sub[$key]->forbidden)) {
                     $sub_error = new Error(['Элемент "%s" должен отсутствовать', $key], 'forbidden');
                 } else {
                     $result[$key] = self::filter($v, $rule_sub[$key], $sub_error);
                 }
                 unset($rule_sub[$key]);
             } else {
                 if ($rule_default) {
                     $result[$key] = self::filter($v, $rule_default, $sub_error);
                 }
                 // Если нет правила по умолчанию или оно не подошло и значение является массивом
                 if (!$rule_default || $sub_error) {
                     // Если рекурсивная проверка вложенных массивов
                     if ($tree && (is_array($v) || $v instanceof Values)) {
                         $sub_error = null;
                         $result[$key] = self::filter($v, $args, $sub_error);
                     }
                 }
                 // Если на элемент нет правила, то его не будет в результате
             }
             if ($sub_error) {
                 if (!$error) {
                     $error = new Error($err_msg, 'arrays');
                 }
                 $error->{$key}->add($sub_error);
             }
         }
         // Перебор оставшихся правил, для которых не оказалось значений
         foreach ($rule_sub as $key => $rule) {
             if (isset($rule->required) && !isset($rule->forbidden)) {
                 $result[$key] = self::filter(null, $rule, $sub_error);
                 if ($sub_error) {
                     if (!$error) {
                         $error = new Error($err_msg, 'arrays');
                     }
                     $error->{$key}->required = "Обязательный элемент без значения по умолчанию";
                 }
             }
         }
         // Если ошибок у элементов нет, то удаляем объект исключения
         if (!isset($error) || !$error->isExist()) {
             $error = null;
         }
     } else {
         $error = new Error('Должен быть массивом', 'arrays');
     }
     return $result;
 }