1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Forms\Controls;
9:
10: use Nette,
11: Nette\Forms\Form,
12: Nette\Utils\Strings,
13: 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: 33: 34:
35: public function __construct($label = NULL)
36: {
37: parent::__construct($label);
38: $this->addFilter($this->sanitize);
39: }
40:
41:
42: 43: 44: 45: 46:
47: public function setValue($value)
48: {
49: $this->value = is_array($value) ? '' : str_replace("\r\n", "\n", $value);
50: return $this;
51: }
52:
53:
54: 55: 56: 57:
58: public function getValue()
59: {
60: $value = $this->value;
61: foreach ($this->filters as $filter) {
62: $value = (string) $filter($value);
63: }
64: return $value === $this->translate($this->emptyValue) ? '' : $value;
65: }
66:
67:
68: 69: 70: 71: 72:
73: public function setEmptyValue($value)
74: {
75: $this->emptyValue = (string) $value;
76: return $this;
77: }
78:
79:
80: 81: 82: 83:
84: public function getEmptyValue()
85: {
86: return $this->emptyValue;
87: }
88:
89:
90: 91: 92: 93: 94:
95: public function addFilter($filter)
96: {
97: $this->filters[] = new Nette\Callback($filter);
98: return $this;
99: }
100:
101:
102: 103: 104: 105:
106: public function sanitize($value)
107: {
108: if ($this->control->maxlength) {
109: $value = Nette\Utils\Strings::substring($value, 0, $this->control->maxlength);
110: }
111: if (strcasecmp($this->control->getName(), 'input') === 0) {
112: $value = Nette\Utils\Strings::trim(strtr($value, "\r\n", ' '));
113: }
114: return $value;
115: }
116:
117:
118: public function getControl()
119: {
120: $control = parent::getControl();
121: foreach ($this->getRules() as $rule) {
122: if ($rule->type === Nette\Forms\Rule::VALIDATOR && !$rule->isNegative
123: && ($rule->operation === Form::LENGTH || $rule->operation === Form::MAX_LENGTH)
124: ) {
125: $control->maxlength = is_array($rule->arg) ? $rule->arg[1] : $rule->arg;
126: }
127: }
128: if ($this->emptyValue !== '') {
129: $control->data('nette-empty-value', $this->translate($this->emptyValue));
130: }
131: return $control;
132: }
133:
134:
135: public function addRule($operation, $message = NULL, $arg = NULL)
136: {
137: if ($operation === Form::FLOAT) {
138: $this->addFilter(array(__CLASS__, 'filterFloat'));
139:
140: } elseif ($operation === Form::LENGTH || $operation === Form::MAX_LENGTH) {
141: $tmp = is_array($arg) ? $arg[1] : $arg;
142: $this->control->maxlength = is_scalar($tmp) ? $tmp : NULL;
143: }
144: return parent::addRule($operation, $message, $arg);
145: }
146:
147:
148:
149:
150:
151: 152: 153: 154: 155: 156:
157: public static function validateMinLength(TextBase $control, $length)
158: {
159: return Strings::length($control->getValue()) >= $length;
160: }
161:
162:
163: 164: 165: 166: 167: 168:
169: public static function validateMaxLength(TextBase $control, $length)
170: {
171: return Strings::length($control->getValue()) <= $length;
172: }
173:
174:
175: 176: 177: 178: 179: 180:
181: public static function validateLength(TextBase $control, $range)
182: {
183: if (!is_array($range)) {
184: $range = array($range, $range);
185: }
186: return Validators::isInRange(Strings::length($control->getValue()), $range);
187: }
188:
189:
190: 191: 192: 193: 194:
195: public static function validateEmail(TextBase $control)
196: {
197: return Validators::isEmail($control->getValue());
198: }
199:
200:
201: 202: 203: 204: 205:
206: public static function validateUrl(TextBase $control)
207: {
208: return Validators::isUrl($control->getValue()) || Validators::isUrl('http://' . $control->getValue());
209: }
210:
211:
212:
213: public static function validateRegexp(TextBase $control, $regexp)
214: {
215: return (bool) Strings::match($control->getValue(), $regexp);
216: }
217:
218:
219: 220: 221: 222: 223: 224:
225: public static function validatePattern(TextBase $control, $pattern)
226: {
227: return (bool) Strings::match($control->getValue(), "\x01^($pattern)\\z\x01u");
228: }
229:
230:
231: 232: 233: 234: 235:
236: public static function validateInteger(TextBase $control)
237: {
238: return Validators::isNumericInt($control->getValue());
239: }
240:
241:
242: 243: 244: 245: 246:
247: public static function validateFloat(TextBase $control)
248: {
249: return Validators::isNumeric(static::filterFloat($control->getValue()));
250: }
251:
252:
253: 254: 255: 256: 257: 258:
259: public static function validateRange(TextBase $control, $range)
260: {
261: return Validators::isInRange($control->getValue(), $range);
262: }
263:
264:
265: 266: 267: 268: 269:
270: public static function filterFloat($s)
271: {
272: return str_replace(array(' ', ','), array('', '.'), $s);
273: }
274:
275: }
276: