Файловый менеджер - Редактировать - /home/lmsyaran/public_html/libraries/gantry5/classes/Gantry/Component/Config/Validation.php
Назад
<?php /** * @package Gantry5 * @author RocketTheme http://www.rockettheme.com * @copyright Copyright (C) 2007 - 2017 RocketTheme, LLC * @license Dual License: MIT or GNU/GPLv2 and later * * http://opensource.org/licenses/MIT * http://www.gnu.org/licenses/gpl-2.0.html * * Gantry Framework code that extends GPL code is considered GNU/GPLv2 and later */ namespace Gantry\Component\Config; use Symfony\Component\Yaml\Exception\ParseException; use Symfony\Component\Yaml\Yaml; /** * Data validation. * * @author RocketTheme * @license MIT */ class Validation { /** * Validate value against a blueprint field definition. * * @param $value * @param array $field * @return array */ public static function validate($value, array $field) { $messages = []; $validate = isset($field['validate']) ? (array) $field['validate'] : []; // If value isn't required, we will stop validation if empty value is given. if (empty($validate['required']) && ($value === null || $value === '')) { return $messages; } if (!isset($field['type'])) { $field['type'] = 'input.text'; } // Special case for files, value is never empty and errors with code 4 instead. if (empty($validate['required']) && $field['type'] === 'input.file' && isset($value['error']) && ($value['error'] === UPLOAD_ERR_NO_FILE || \in_array(UPLOAD_ERR_NO_FILE, $value['error'], true))) { return $messages; } // Validate type with fallback type text. $type = (string) isset($field['validate']['type']) ? $field['validate']['type'] : $field['type']; $method = 'type_'.strtr($type, '-.', '__'); if (!method_exists(__CLASS__, $method)) { $method = 'type_Input_Text'; } $name = ucfirst(isset($field['label']) ? $field['label'] : $field['name']); // TODO: translate $message = (string) isset($field['validate']['message']) ? sprintf($field['validate']['message']) : sprintf('Invalid input in field: ') . ' "' . $name . '"'; $success = self::$method($value, $validate, $field); if (!$success) { $messages[$field['name']][] = $message; } // Check individual rules. foreach ($validate as $rule => $params) { $method = 'validate_' . ucfirst(strtr($rule, '-.', '__')); if (method_exists(__CLASS__, $method)) { $success = self::$method($value, $params); if (!$success) { $messages[$field['name']][] = $message; } } } return $messages; } /** * Filter value against a blueprint field definition. * * @param mixed $value * @param array $field * @return mixed Filtered value. */ public static function filter($value, array $field) { $validate = isset($field['validate']) ? (array) $field['validate'] : []; // If value isn't required, we will return null if empty value is given. if (($value === null || $value === '') && empty($validate['required'])) { return null; } if (!isset($field['type'])) { $field['type'] = 'input.text'; } // Special case for files, value is never empty and errors with code 4 instead. if (empty($validate['required']) && $field['type'] === 'input.file' && isset($value['error']) && ($value['error'] === UPLOAD_ERR_NO_FILE || \in_array(UPLOAD_ERR_NO_FILE, $value['error'], true))) { return null; } // Validate type with fallback type text. $type = (string) isset($field['validate']['type']) ? $field['validate']['type'] : $field['type']; $method = 'filter_' . ucfirst(str_replace('-', '_', $type)); if (!method_exists(__CLASS__, $method)) { $method = 'filter_Input_Text'; } return self::$method($value, $validate, $field); } /** * HTML5 input: text * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Text($value, array $params, array $field) { if (!\is_string($value) && !is_numeric($value)) { return false; } $value = (string)$value; if (isset($params['min']) && \strlen($value) < $params['min']) { return false; } if (isset($params['max']) && \strlen($value) > $params['max']) { return false; } $min = isset($params['min']) ? $params['min'] : 0; if (isset($params['step']) && (strlen($value) - $min) % $params['step'] === 0) { return false; } if ((!isset($params['multiline']) || !$params['multiline']) && preg_match('/\R/um', $value)) { return false; } return true; } protected static function filter_Input_Text($value, array $params, array $field) { return (string) $value; } protected static function filter_Input_CommaList($value, array $params, array $field) { return \is_array($value) ? $value : preg_split('/\s*,\s*/', $value, -1, PREG_SPLIT_NO_EMPTY); } protected static function type_Input_CommaList($value, array $params, array $field) { return \is_array($value) ? true : self::type_Input_Text($value, $params, $field); } /** * HTML5 input: textarea * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Textarea_Textarea($value, array $params, array $field) { if (!isset($params['multiline'])) { $params['multiline'] = true; } return self::type_Input_Text($value, $params, $field); } /** * HTML5 input: password * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Password($value, array $params, array $field) { return self::type_Input_Text($value, $params, $field); } /** * HTML5 input: hidden * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Hidden($value, array $params, array $field) { return self::type_Input_Text($value, $params, $field); } /** * Custom input: checkbox list * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Checkboxes_Checkboxes($value, array $params, array $field) { // Set multiple: true so checkboxes can easily use min/max counts to control number of options required $field['multiple'] = true; return self::typeArray((array) $value, $params, $field); } protected static function filter_Checkboxes_Checkboxes($value, array $params, array $field) { return self::filterArray($value, $params, $field); } /** * HTML5 input: checkbox * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Checkbox($value, array $params, array $field) { $value = (string) $value; if (!isset($field['value'])) { $field['value'] = 1; } if ($value && $value != $field['value']) { return false; } return true; } /** * HTML5 input: radio * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Radio($value, array $params, array $field) { return self::typeArray((array) $value, $params, $field); } /** * Custom input: toggle * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Toggle_Toggle($value, array $params, array $field) { return self::typeArray((array) $value, $params, $field); } /** * Custom input: file * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_File($value, array $params, array $field) { return self::typeArray((array) $value, $params, $field); } protected static function filter_Input_File($value, array $params, array $field) { if (isset($field['multiple']) && $field['multiple'] === true) { return (array) $value; } if (\is_array($value)) { return reset($value); } return $value; } /** * HTML5 input: select * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Select_Select($value, array $params, array $field) { return self::typeArray((array) $value, $params, $field); } /** * HTML5 input: number * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Number($value, array $params, array $field) { if (!is_numeric($value)) { return false; } if (isset($params['min']) && $value < $params['min']) { return false; } if (isset($params['max']) && $value > $params['max']) { return false; } $min = isset($params['min']) ? $params['min'] : 0; return !(isset($params['step']) && fmod($value - $min, $params['step']) === 0); } protected static function filter_Input_Number($value, array $params, array $field) { return (string)(int)$value !== (string)(float)$value ? (float) $value : (int) $value; } protected static function filter_Input_DateTime($value, array $params, array $field) { $converted = new \DateTime($value); return $converted->format('Y-m-d H:i:s'); } /** * HTML5 input: range * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Range($value, array $params, array $field) { return self::type_Input_Number($value, $params, $field); } protected static function filter_Input_Range($value, array $params, array $field) { return self::filter_Input_Number($value, $params, $field); } /** * HTML5 input: color * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Color($value, array $params, array $field) { return preg_match('/^\#[0-9a-fA-F]{3}[0-9a-fA-F]{3}?$/u', $value); } /** * HTML5 input: email * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Email($value, array $params, array $field) { return self::type_Input_Text($value, $params, $field) && filter_var($value, FILTER_VALIDATE_EMAIL); } /** * HTML5 input: url * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Url($value, array $params, array $field) { return self::type_Input_Text($value, $params, $field) && filter_var($value, FILTER_VALIDATE_URL); } /** * HTML5 input: datetime * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Datetime($value, array $params, array $field) { if ($value instanceof \DateTime) { return true; } if (!\is_string($value)) { return false; } if (!isset($params['format'])) { return false !== strtotime($value); } $dateFromFormat = \DateTime::createFromFormat($params['format'], $value); return $dateFromFormat && $value === date($params['format'], $dateFromFormat->getTimestamp()); } /** * HTML5 input: datetime-local * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_DatetimeLocal($value, array $params, array $field) { return self::type_Input_Datetime($value, $params, $field); } /** * HTML5 input: date * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Date($value, array $params, array $field) { if (!isset($params['format'])) { $params['format'] = 'Y-m-d'; } return self::type_Input_Datetime($value, $params, $field); } /** * HTML5 input: time * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Time($value, array $params, array $field) { if (!isset($params['format'])) { $params['format'] = 'H:i'; } return self::type_Input_Datetime($value, $params, $field); } /** * HTML5 input: month * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Month($value, array $params, array $field) { if (!isset($params['format'])) { $params['format'] = 'Y-m'; } return self::type_Input_Datetime($value, $params, $field); } /** * HTML5 input: week * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Input_Week($value, array $params, array $field) { if (!isset($params['format']) && !preg_match('/^\d{4}-W\d{2}$/u', $value)) { return false; } return self::type_Input_Datetime($value, $params, $field); } /** * Custom input: array * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function typeArray($value, array $params, array $field) { if (!\is_array($value)) { return false; } if (isset($field['multiple'])) { if (isset($params['min']) && \count($value) < $params['min']) { return false; } if (isset($params['max']) && \count($value) > $params['max']) { return false; } $min = isset($params['min']) ? $params['min'] : 0; if (isset($params['step']) && (\count($value) - $min) % $params['step'] === 0) { return false; } } $options = isset($field['options']) ? array_keys($field['options']) : []; $values = isset($field['use']) && $field['use'] === 'keys' ? array_keys($value) : $value; return !($options && array_diff($values, $options)); } protected static function filterArray($value, $params, $field) { $values = (array) $value; $options = isset($field['options']) ? array_keys($field['options']) : []; $multi = isset($field['multiple']) ? $field['multiple'] : false; if (\count($values) === 1 && isset($values[0]) && $values[0] === '') { return null; } if ($options) { $useKey = isset($field['use']) && $field['use'] === 'keys'; foreach ($values as $key => $val) { $values[$key] = $useKey ? (bool) $val : $val; } } if ($multi) { foreach ($values as $key => $val) { if (\is_array($val)) { $val = implode(',', $val); } $values[$key] = array_map('trim', explode(',', $val)); } } return $values; } public static function type_Input_Yaml($value, $params) { try { Yaml::parse($value); return true; } catch (ParseException $e) { return false; } } public static function filter_Input_Yaml($value, $params) { try { return (array) Yaml::parse($value); } catch (ParseException $e) { return null; } } /** * Custom input: ignore (will not validate) * * @param mixed $value Value to be validated. * @param array $params Validation parameters. * @param array $field Blueprint for the field. * @return bool True if validation succeeded. */ public static function type_Novalidate($value, array $params, array $field) { return true; } public static function filter_Novalidate($value, array $params, array $field) { return $value; } // HTML5 attributes (min, max and range are handled inside the types) public static function validate_Required($value, $params) { if (is_scalar($value)) { return (bool) $params !== true || $value !== ''; } return (bool) $params !== true || !empty($value); } public static function validate_Pattern($value, $params) { return (bool) preg_match("`^{$params}$`u", $value); } // Internal types public static function validate_Alpha($value, $params) { return ctype_alpha($value); } public static function validate_Alnum($value, $params) { return ctype_alnum($value); } public static function type_Bool($value, $params) { return \is_bool($value) || $value == 1 || $value == 0; } public static function validate_Bool($value, $params) { return \is_bool($value) || $value == 1 || $value == 0; } protected static function filter_Bool($value, $params) { return (bool) $value; } public static function validate_Digit($value, $params) { return ctype_digit($value); } public static function validate_Float($value, $params) { return \is_float(filter_var($value, FILTER_VALIDATE_FLOAT)); } protected static function filter_Float($value, $params) { return (float) $value; } public static function validate_Hex($value, $params) { return ctype_xdigit($value); } public static function validate_Int($value, $params) { return is_numeric($value) && (int) $value == $value; } protected static function filter_Int($value, $params) { return (int) $value; } public static function validate_Array($value, $params) { return \is_array($value) || ($value instanceof \ArrayAccess && $value instanceof \Traversable && $value instanceof \Countable); } public static function validate_Json($value, $params) { return (bool) (@json_decode($value)); } }
| ver. 1.4 |
Github
|
.
| PHP 8.1.33 | Генерация страницы: 0 |
proxy
|
phpinfo
|
Настройка