%PDF- %PDF-
| Direktori : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/ |
| Current File : //www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/Validator.php |
<?php
/**
* This file is part of the Nette Framework (https://nette.org)
* Copyright (c) 2004 David Grudl (https://davidgrudl.com)
*/
declare(strict_types=1);
namespace Nette\Forms;
use Nette;
use Nette\Utils\Strings;
use Nette\Utils\Validators;
/**
* Common validators.
*/
class Validator
{
use Nette\StaticClass;
/** @var array */
public static $messages = [
Controls\CsrfProtection::Protection => 'Your session has expired. Please return to the home page and try again.',
Form::Equal => 'Please enter %s.',
Form::NotEqual => 'This value should not be %s.',
Form::Filled => 'This field is required.',
Form::Blank => 'This field should be blank.',
Form::MinLength => 'Please enter at least %d characters.',
Form::MaxLength => 'Please enter no more than %d characters.',
Form::Length => 'Please enter a value between %d and %d characters long.',
Form::Email => 'Please enter a valid email address.',
Form::URL => 'Please enter a valid URL.',
Form::Integer => 'Please enter a valid integer.',
Form::Float => 'Please enter a valid number.',
Form::Min => 'Please enter a value greater than or equal to %d.',
Form::Max => 'Please enter a value less than or equal to %d.',
Form::Range => 'Please enter a value between %d and %d.',
Form::MaxFileSize => 'The size of the uploaded file can be up to %d bytes.',
Form::MaxPostSize => 'The uploaded data exceeds the limit of %d bytes.',
Form::MimeType => 'The uploaded file is not in the expected format.',
Form::Image => 'The uploaded file must be image in format JPEG, GIF, PNG or WebP.',
Controls\SelectBox::Valid => 'Please select a valid option.',
Controls\UploadControl::Valid => 'An error occurred during file upload.',
];
/**
* @return string|Nette\HtmlStringable
* @internal
*/
public static function formatMessage(Rule $rule, bool $withValue = true)
{
$message = $rule->message;
if ($message instanceof Nette\HtmlStringable) {
return $message;
} elseif ($message === null && is_string($rule->validator) && isset(static::$messages[$rule->validator])) {
$message = static::$messages[$rule->validator];
} elseif ($message == null) { // intentionally ==
trigger_error(
"Missing validation message for control '{$rule->control->getName()}'"
. (is_string($rule->validator) ? " (validator '{$rule->validator}')." : '.'),
E_USER_WARNING
);
}
if ($translator = $rule->control->getForm()->getTranslator()) {
$message = $translator->translate($message, is_int($rule->arg) ? $rule->arg : null);
}
$message = preg_replace_callback('#%(name|label|value|\d+\$[ds]|[ds])#', function (array $m) use ($rule, $withValue, $translator) {
static $i = -1;
switch ($m[1]) {
case 'name': return $rule->control->getName();
case 'label':
if ($rule->control instanceof Controls\BaseControl) {
$caption = $rule->control->getCaption();
$caption = $caption instanceof Nette\HtmlStringable
? $caption->getText()
: ($translator ? $translator->translate($caption) : $caption);
return rtrim((string) $caption, ':');
}
return '';
case 'value': return $withValue
? $rule->control->getValue()
: $m[0];
default:
$args = is_array($rule->arg) ? $rule->arg : [$rule->arg];
$i = (int) $m[1] ? (int) $m[1] - 1 : $i + 1;
return isset($args[$i])
? ($args[$i] instanceof Control ? ($withValue ? $args[$i]->getValue() : "%$i") : $args[$i])
: '';
}
}, $message);
return $message;
}
/********************* default validators ****************d*g**/
/**
* Is control's value equal with second parameter?
*/
public static function validateEqual(Control $control, $arg): bool
{
$value = $control->getValue();
$values = is_array($value) ? $value : [$value];
$args = is_array($arg) ? $arg : [$arg];
foreach ($values as $val) {
foreach ($args as $item) {
if ($item instanceof \BackedEnum) {
$item = $item->value;
}
if ((string) $val === (string) $item) {
continue 2;
}
}
return false;
}
return (bool) $values;
}
/**
* Is control's value not equal with second parameter?
*/
public static function validateNotEqual(Control $control, $arg): bool
{
return !static::validateEqual($control, $arg);
}
/**
* Returns argument.
*/
public static function validateStatic(Control $control, bool $arg): bool
{
return $arg;
}
/**
* Is control filled?
*/
public static function validateFilled(Controls\BaseControl $control): bool
{
return $control->isFilled();
}
/**
* Is control not filled?
*/
public static function validateBlank(Controls\BaseControl $control): bool
{
return !$control->isFilled();
}
/**
* Is control valid?
*/
public static function validateValid(Controls\BaseControl $control): bool
{
return $control->getRules()->validate();
}
/**
* Is a control's value number in specified range?
*/
public static function validateRange(Control $control, array $range): bool
{
$range = array_map(function ($v) {
return $v === '' ? null : $v;
}, $range);
return Validators::isInRange($control->getValue(), $range);
}
/**
* Is a control's value number greater than or equal to the specified minimum?
*/
public static function validateMin(Control $control, $minimum): bool
{
return Validators::isInRange($control->getValue(), [$minimum === '' ? null : $minimum, null]);
}
/**
* Is a control's value number less than or equal to the specified maximum?
*/
public static function validateMax(Control $control, $maximum): bool
{
return Validators::isInRange($control->getValue(), [null, $maximum === '' ? null : $maximum]);
}
/**
* Count/length validator. Range is array, min and max length pair.
* @param array|int $range
*/
public static function validateLength(Control $control, $range): bool
{
if (!is_array($range)) {
$range = [$range, $range];
}
$value = $control->getValue();
return Validators::isInRange(is_array($value) ? count($value) : Strings::length((string) $value), $range);
}
/**
* Has control's value minimal count/length?
*/
public static function validateMinLength(Control $control, $length): bool
{
return static::validateLength($control, [$length, null]);
}
/**
* Is control's value count/length in limit?
*/
public static function validateMaxLength(Control $control, $length): bool
{
return static::validateLength($control, [null, $length]);
}
/**
* Has been button pressed?
*/
public static function validateSubmitted(Controls\SubmitButton $control): bool
{
return $control->isSubmittedBy();
}
/**
* Is control's value valid email address?
*/
public static function validateEmail(Control $control): bool
{
return Validators::isEmail((string) $control->getValue());
}
/**
* Is control's value valid URL?
*/
public static function validateUrl(Control $control): bool
{
$value = (string) $control->getValue();
if (Validators::isUrl($value)) {
return true;
}
$value = "https://$value";
if (Validators::isUrl($value)) {
$control->setValue($value);
return true;
}
return false;
}
/**
* Does the control's value match the regular expression?
* Case-sensitive to comply with the HTML5 <input /> pattern attribute behaviour
*/
public static function validatePattern(Control $control, string $pattern, bool $caseInsensitive = false): bool
{
$regexp = "\x01^(?:$pattern)$\x01Du" . ($caseInsensitive ? 'i' : '');
foreach (static::toArray($control->getValue()) as $item) {
$value = $item instanceof Nette\Http\FileUpload ? $item->getUntrustedName() : $item;
if (!Strings::match((string) $value, $regexp)) {
return false;
}
}
return true;
}
public static function validatePatternCaseInsensitive(Control $control, string $pattern): bool
{
return self::validatePattern($control, $pattern, true);
}
/**
* Is a control's value numeric?
*/
public static function validateNumeric(Control $control): bool
{
$value = $control->getValue();
return (is_int($value) && $value >= 0)
|| (is_string($value) && Strings::match($value, '#^\d+$#D'));
}
/**
* Is a control's value decimal number?
*/
public static function validateInteger(Control $control): bool
{
if (
Validators::isNumericInt($value = $control->getValue())
&& !is_float($tmp = $value * 1) // too big for int?
) {
$control->setValue($tmp);
return true;
}
return false;
}
/**
* Is a control's value float number?
*/
public static function validateFloat(Control $control): bool
{
$value = $control->getValue();
if (is_string($value)) {
$value = str_replace([' ', ','], ['', '.'], $value);
}
if (Validators::isNumeric($value)) {
$control->setValue((float) $value);
return true;
}
return false;
}
/**
* Is file size in limit?
*/
public static function validateFileSize(Controls\UploadControl $control, $limit): bool
{
foreach (static::toArray($control->getValue()) as $file) {
if ($file->getSize() > $limit || $file->getError() === UPLOAD_ERR_INI_SIZE) {
return false;
}
}
return true;
}
/**
* Has file specified mime type?
* @param string|string[] $mimeType
*/
public static function validateMimeType(Controls\UploadControl $control, $mimeType): bool
{
$mimeTypes = is_array($mimeType) ? $mimeType : explode(',', $mimeType);
foreach (static::toArray($control->getValue()) as $file) {
$type = strtolower($file->getContentType());
if (!in_array($type, $mimeTypes, true) && !in_array(preg_replace('#/.*#', '/*', $type), $mimeTypes, true)) {
return false;
}
}
return true;
}
/**
* Is file image?
*/
public static function validateImage(Controls\UploadControl $control): bool
{
foreach (static::toArray($control->getValue()) as $file) {
if (!$file->isImage()) {
return false;
}
}
return true;
}
private static function toArray($value): array
{
return is_object($value) ? [$value] : (array) $value;
}
}