Example #1
0
 /**
  * Валидатор даты
  *
  * Проверяется соответствие формату и реальность даты. Решил не мудрить с настройками. Валидатор разрешает только
  * формат "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)];
 }
Example #2
0
 /**
  * Типовой валидатор "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;
 }
Example #3
0
 /**
  * Добавление 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;
 }