TextField   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 158
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 47
c 2
b 0
f 0
dl 0
loc 158
rs 10
wmc 18

10 Methods

Rating   Name   Duplication   Size   Complexity  
A getSchemaValidation() 0 9 2
A setTip() 0 5 1
A getSchemaDataDefaults() 0 10 2
A getTip() 0 3 1
A InternallyLabelledField() 0 9 2
A __construct() 0 11 3
A getMaxLength() 0 3 1
A setMaxLength() 0 5 1
A getAttributes() 0 14 2
A validate() 0 15 3
1
<?php
2
3
namespace SilverStripe\Forms;
4
5
use SilverStripe\Dev\Deprecation;
6
7
/**
8
 * Text input field.
9
 */
10
class TextField extends FormField implements TippableFieldInterface
11
{
12
    /**
13
     * @var int
14
     */
15
    protected $maxLength;
16
17
    protected $schemaDataType = FormField::SCHEMA_DATA_TYPE_TEXT;
18
19
    /**
20
     * @var Tip|null A tip to render beside the input
21
     */
22
    private $tip;
23
24
    /**
25
     * Returns an input field.
26
     *
27
     * @param string $name
28
     * @param null|string $title
29
     * @param string $value
30
     * @param null|int $maxLength Max characters to allow for this field. If this value is stored
31
     * against a DB field with a fixed size it's recommended to set an appropriate max length
32
     * matching this size.
33
     * @param null|Form $form
34
     */
35
    public function __construct($name, $title = null, $value = '', $maxLength = null, $form = null)
36
    {
37
        if ($maxLength) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $maxLength of type integer|null is loosely compared to true; this is ambiguous if the integer can be 0. You might want to explicitly use !== null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
38
            $this->setMaxLength($maxLength);
39
        }
40
41
        if ($form) {
42
            $this->setForm($form);
43
        }
44
45
        parent::__construct($name, $title, $value);
46
    }
47
48
    /**
49
     * @param int $maxLength
50
     * @return $this
51
     */
52
    public function setMaxLength($maxLength)
53
    {
54
        $this->maxLength = $maxLength;
55
56
        return $this;
57
    }
58
59
    /**
60
     * @return null|int
61
     */
62
    public function getMaxLength()
63
    {
64
        return $this->maxLength;
65
    }
66
67
    /**
68
     * @return Tip|null
69
     */
70
    public function getTip(): ?Tip
71
    {
72
        return $this->tip;
73
    }
74
75
    /**
76
     * Applies a Tip to the field, which shows a popover on the right side of
77
     * the input to place additional context or explanation of the field's
78
     * purpose in. Currently only supported in React-based forms.
79
     *
80
     * @param Tip|null $tip The Tip to apply, or null to remove an existing one
81
     * @return $this
82
     */
83
    public function setTip(?Tip $tip = null): self
84
    {
85
        $this->tip = $tip;
86
87
        return $this;
88
    }
89
90
    /**
91
     * @return array
92
     */
93
    public function getAttributes()
94
    {
95
        $maxLength = $this->getMaxLength();
96
97
        $attributes = array();
98
99
        if ($maxLength) {
100
            $attributes['maxLength'] = $maxLength;
101
            $attributes['size'] = min($maxLength, 30);
102
        }
103
104
        return array_merge(
105
            parent::getAttributes(),
106
            $attributes
107
        );
108
    }
109
110
    public function getSchemaDataDefaults()
111
    {
112
        $data = parent::getSchemaDataDefaults();
113
        $data['data']['maxlength'] =  $this->getMaxLength();
114
115
        if ($this->getTip() instanceof Tip) {
116
            $data['tip'] = $this->getTip()->getTipSchema();
117
        }
118
119
        return $data;
120
    }
121
122
    /**
123
     * @return string
124
     */
125
    public function InternallyLabelledField()
126
    {
127
        Deprecation::notice('4.0', 'Please use ->setValue() instead');
128
129
        if (!$this->value) {
130
            $this->value = $this->Title();
131
        }
132
133
        return $this->Field();
134
    }
135
136
    /**
137
     * Validate this field
138
     *
139
     * @param Validator $validator
140
     * @return bool
141
     */
142
    public function validate($validator)
143
    {
144
        if (!is_null($this->maxLength) && mb_strlen($this->value) > $this->maxLength) {
0 ignored issues
show
introduced by
The condition is_null($this->maxLength) is always false.
Loading history...
145
            $validator->validationError(
146
                $this->name,
147
                _t(
148
                    'SilverStripe\\Forms\\TextField.VALIDATEMAXLENGTH',
149
                    'The value for {name} must not exceed {maxLength} characters in length',
150
                    array('name' => $this->getName(), 'maxLength' => $this->maxLength)
151
                ),
152
                "validation"
153
            );
154
            return false;
155
        }
156
        return true;
157
    }
158
159
    public function getSchemaValidation()
160
    {
161
        $rules = parent::getSchemaValidation();
162
        if ($this->getMaxLength()) {
163
            $rules['max'] = [
164
                'length' => $this->getMaxLength(),
165
            ];
166
        }
167
        return $rules;
168
    }
169
}
170