/** * Валидатор даты * * Проверяется соответствие формату и реальность даты. Решил не мудрить с настройками. Валидатор разрешает только * формат "dd.mm.yyyy" * * Возвращаемое значение приводится в формат MySQL "yyyy-mm-dd" для корректного сохранения в БД. * * @param string $date * @return array возвращаем в формате yyyy-mm-dd (mysql) */ public static function date($date) { if (!preg_match('~\\d{2}\\.\\d{2}\\.\\d{4}~', $date)) { $msg = App::t('Неверный формат даты. Ожидается "FORMAT".', ['FORMAT' => 'dd.mm.yyyy']); return ['error' => $msg]; } list($d, $m, $y) = explode('.', $date); if (!checkdate($m, $d, $y)) { return ['error' => App::t('Нереальная дата')]; } return ['value' => sprintf('%d-%d-%d', $y, $m, $d)]; }
/** * Типовой валидатор "bounds". * * Проверка рационального числа в заданных пределах. Полезно для проверки чисел с плавающей точкой, в дополнение * к filter_var(FILTER_VALIDATE_FLOAT). Описание: * <pre> * $desc = [ * 'min' => number, * 'max' => number, * 'message' => string, // свое сообщение об ошибке. Необязательно. * ]; * </pre> * * Любой из параметров можно пропустить. Значение 'NULL' - не проверять границу с этой стороны. * * Проверяемое значение может быть равно NULL, только если до этого были ошибки в других валидаторах. При этом * выходим без дополнительных сообщений. * * @param array $desc описание валидатора * @param number $data проверяемые данные * @param mixed $value куда писать валидное значение * @param mixed $error куда писать ошибку * @return bool * @throws \LogicException */ protected function validatorBounds(&$desc, &$data, &$value, &$error) { if (is_null($data)) { $this->isValid = false; return false; } // Предохранитель для разработчика if (!is_numeric($data)) { throw new \LogicException('Проверка границ числа не применима к такому типу данных: ' . gettype($value)); } $min = isset($desc['min']) ? (double) $desc['min'] : null; $max = isset($desc['max']) ? (double) $desc['max'] : null; $message = isset($desc['message']) ? App::t($desc['message']) : ''; $data *= 1; // приведение к типу if (!is_null($min) && $data < $min) { $errMsg[] = $message ?: App::t('Значение меньше допустимого, минимум M', ['M' => $min]); } elseif (!is_null($min) && $data > $max) { $errMsg[] = $message ?: App::t('Значение больше допустимого, максимум M', ['M' => $max]); } else { $errMsg = null; } if (!($passed = !$errMsg)) { $this->isValid = false; $error = is_array($error) ? array_merge($error, $errMsg) : $errMsg; } return $passed; }
/** * Добавление flash-сообщения в сессию * * Флаг перезаписи: true - любое значение переписываем, false - массивы объединяем, строки дописываем, <b>целые</b> * числа суммируем, с другими данными не работаем. При этом тип новых данных приводим к имеющемуся в сессии. * * @param string $key ключ в сессии * @param mixed $data данные для записи * @param bool $force флаг перезаписи. True - любое значение переписываем, false - массивы объединяем, * строки дописываем, числа суммируем. При этом тип новых данных приводим к имеющемуся в сессии. * @return void */ public static function addFlash($key, $data, $force = false) { self::init(); $data = App::t($data); if (isset($_SESSION['flash'][$key]) && !$force) { $curData = $_SESSION['flash'][$key]; if (is_array($curData)) { $data = array_merge($curData, (array) $data); } elseif (!is_numeric($curData)) { $data = $curData . $data; } elseif (preg_match('~^\\d+$~', $curData)) { $data = (int) $curData + intval($data); } } $_SESSION['flash'][$key] = $data; }