Skip to content
Permalink
Branch: master
Find file Copy path
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
221 lines (187 sloc) 5.02 KB
<?php
/**
* @link https://craftcms.com/
* @copyright Copyright (c) Pixel & Tonic, Inc.
* @license https://craftcms.github.io/license/
*/
namespace craft\fields;
use Craft;
use craft\base\ElementInterface;
use craft\base\Field;
use craft\base\PreviewableFieldInterface;
use craft\base\SortableFieldInterface;
use craft\helpers\Db;
use craft\helpers\Localization;
use craft\i18n\Locale;
/**
* Number represents a Number field.
*
* @author Pixel & Tonic, Inc. <support@pixelandtonic.com>
* @since 3.0.0
*/
class Number extends Field implements PreviewableFieldInterface, SortableFieldInterface
{
// Static
// =========================================================================
/**
* @inheritdoc
*/
public static function displayName(): string
{
return Craft::t('app', 'Number');
}
/**
* @inheritdoc
*/
public static function valueType(): string
{
return 'int|float|null';
}
// Properties
// =========================================================================
/**
* @var int|float|null The default value for new elements
*/
public $defaultValue;
/**
* @var int|float The minimum allowed number
*/
public $min = 0;
/**
* @var int|float|null The maximum allowed number
*/
public $max;
/**
* @var int The number of digits allowed after the decimal point
*/
public $decimals = 0;
/**
* @var int|null The size of the field
*/
public $size;
/**
* @var string|null Text that should be displayed before the input
*/
public $prefix;
/**
* @var string|null Text that should be displayed after the input
*/
public $suffix;
// Public Methods
// =========================================================================
/**
* @inheritdoc
*/
public function init()
{
parent::init();
// Normalize $defaultValue
if ($this->defaultValue === '') {
$this->defaultValue = null;
}
// Normalize $max
if ($this->max === '') {
$this->max = null;
}
// Normalize $min
if ($this->min === '') {
$this->min = null;
}
// Normalize $decimals
if (!$this->decimals) {
$this->decimals = 0;
}
// Normalize $size
if ($this->size !== null && !$this->size) {
$this->size = null;
}
}
/**
* @inheritdoc
*/
public function rules()
{
$rules = parent::rules();
$rules[] = [['min', 'max'], 'number'];
$rules[] = [['decimals', 'size'], 'integer'];
$rules[] = [
['max'],
'compare',
'compareAttribute' => 'min',
'operator' => '>='
];
if (!$this->decimals) {
$rules[] = [['min', 'max'], 'integer'];
}
return $rules;
}
/**
* @inheritdoc
*/
public function getSettingsHtml()
{
return Craft::$app->getView()->renderTemplate('_components/fieldtypes/Number/settings',
[
'field' => $this
]);
}
/**
* @inheritdoc
*/
public function getContentColumnType(): string
{
return Db::getNumericalColumnType($this->min, $this->max, $this->decimals);
}
/**
* @inheritdoc
*/
public function normalizeValue($value, ElementInterface $element = null)
{
if ($value === null && $this->defaultValue !== null && $this->isFresh($element)) {
return $this->defaultValue;
}
// Was this submitted with a locale ID?
if (isset($value['locale'], $value['value'])) {
$value = Localization::normalizeNumber($value['value'], $value['locale']);
}
return $value === '' ? null : $value;
}
/**
* @inheritdoc
*/
public function getInputHtml($value, ElementInterface $element = null): string
{
// If decimals is 0 (or null, empty for whatever reason), don't run this
if ($value !== null && $this->decimals) {
$decimalSeparator = Craft::$app->getLocale()->getNumberSymbol(Locale::SYMBOL_DECIMAL_SEPARATOR);
try {
$value = number_format($value, $this->decimals, $decimalSeparator, '');
} catch (\Throwable $e) {
// NaN
}
}
return Craft::$app->getView()->renderTemplate('_components/fieldtypes/Number/input', [
'field' => $this,
'value' => $value,
]);
}
/**
* @inheritdoc
*/
public function getElementValidationRules(): array
{
return [
['number', 'min' => $this->min, 'max' => $this->max],
];
}
/**
* @inheritdoc
*/
public function getTableAttributeHtml($value, ElementInterface $element): string
{
if ($value === null) {
return '';
}
return Craft::$app->getFormatter()->asDecimal($value, $this->decimals);
}
}
You can’t perform that action at this time.