1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Forms\Controls;
9:
10: use Nette;
11: use Nette\Forms\Form;
12: use Nette\Utils\Strings;
13: use Nette\Utils\Validators;
14:
15:
16: 17: 18: 19: 20: 21: 22:
23: abstract class TextBase extends BaseControl
24: {
25:
26: protected $emptyValue = '';
27:
28:
29: protected $filters = array();
30:
31:
32: protected $rawValue = '';
33:
34:
35: 36: 37: 38: 39:
40: public function setValue($value)
41: {
42: if ($value === NULL) {
43: $value = '';
44: } elseif (!is_scalar($value) && !method_exists($value, '__toString')) {
45: throw new Nette\InvalidArgumentException(sprintf("Value must be scalar or NULL, %s given in field '%s'.", gettype($value), $this->name));
46: }
47: $this->rawValue = $this->value = $value;
48: return $this;
49: }
50:
51:
52: 53: 54: 55:
56: public function getValue()
57: {
58: $value = $this->value;
59: if (!empty($this->control->maxlength)) {
60: $value = Strings::substring($value, 0, $this->control->maxlength);
61: }
62: foreach ($this->filters as $filter) {
63: $value = (string) call_user_func($filter, $value);
64: }
65: return $value === Strings::trim($this->translate($this->emptyValue)) ? '' : $value;
66: }
67:
68:
69: 70: 71: 72: 73:
74: public function setEmptyValue($value)
75: {
76: $this->emptyValue = (string) $value;
77: return $this;
78: }
79:
80:
81: 82: 83: 84:
85: public function getEmptyValue()
86: {
87: return $this->emptyValue;
88: }
89:
90:
91: 92: 93: 94: 95: 96:
97: public function addFilter($filter)
98: {
99: $this->filters[] = Nette\Utils\Callback::check($filter);
100: return $this;
101: }
102:
103:
104: public function getControl()
105: {
106: $el = parent::getControl();
107: if ($this->emptyValue !== '') {
108: $el->attrs['data-nette-empty-value'] = Strings::trim($this->translate($this->emptyValue));
109: }
110: if (isset($el->placeholder)) {
111: $el->placeholder = $this->translate($el->placeholder);
112: }
113: return $el;
114: }
115:
116:
117: public function addRule($operation, $message = NULL, $arg = NULL)
118: {
119: if ($operation === Form::LENGTH || $operation === Form::MAX_LENGTH) {
120: $tmp = is_array($arg) ? $arg[1] : $arg;
121: if (is_scalar($tmp)) {
122: $this->control->maxlength = isset($this->control->maxlength) ? min($this->control->maxlength, $tmp) : $tmp;
123: }
124: }
125: return parent::addRule($operation, $message, $arg);
126: }
127:
128:
129:
130:
131:
132: 133: 134: 135: 136:
137: public static function validateEmail(TextBase $control)
138: {
139: return Validators::isEmail($control->getValue());
140: }
141:
142:
143: 144: 145: 146: 147:
148: public static function validateUrl(TextBase $control)
149: {
150: if (Validators::isUrl($value = $control->getValue())) {
151: return TRUE;
152:
153: } elseif (Validators::isUrl($value = "http://$value")) {
154: $control->setValue($value);
155: return TRUE;
156: }
157: return FALSE;
158: }
159:
160:
161: 162: 163: 164: 165:
166: public static function filterUrl($s)
167: {
168: return Validators::isUrl('http://' . $s) ? 'http://' . $s : $s;
169: }
170:
171:
172:
173: public static function validateRegexp(TextBase $control, $regexp)
174: {
175: trigger_error('Validator REGEXP is deprecated; use PATTERN instead (which is matched against the entire value and is case sensitive).', E_USER_DEPRECATED);
176: return (bool) Strings::match($control->getValue(), $regexp);
177: }
178:
179:
180: 181: 182: 183: 184:
185: public static function validatePattern(TextBase $control, $pattern)
186: {
187: return (bool) Strings::match($control->getValue(), "\x01^($pattern)\\z\x01u");
188: }
189:
190:
191: 192: 193: 194: 195:
196: public static function validateInteger(TextBase $control)
197: {
198: if (Validators::isNumericInt($value = $control->getValue())) {
199: if (!is_float($tmp = $value * 1)) {
200: $control->setValue($tmp);
201: }
202: return TRUE;
203: }
204: return FALSE;
205: }
206:
207:
208: 209: 210: 211: 212:
213: public static function validateFloat(TextBase $control)
214: {
215: $value = self::filterFloat($control->getValue());
216: if (Validators::isNumeric($value)) {
217: $control->setValue((float) $value);
218: return TRUE;
219: }
220: return FALSE;
221: }
222:
223:
224: 225: 226: 227: 228: 229:
230: public static function filterFloat($s)
231: {
232: return str_replace(array(' ', ','), array('', '.'), $s);
233: }
234:
235: }
236: