1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11:
12:
13:
14:
15: 16: 17: 18: 19: 20: 21: 22:
23: abstract class NTextBase extends NFormControl
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->invoke($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: final 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 NCallback($filter);
98: return $this;
99: }
100:
101:
102: 103: 104: 105:
106: public function sanitize($value)
107: {
108: if ($this->control->maxlength) {
109: $value = NStrings::substring($value, 0, $this->control->maxlength);
110: }
111: if (strcasecmp($this->control->getName(), 'input') === 0) {
112: $value = NStrings::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 === NRule::VALIDATOR && !$rule->isNegative
123: && ($rule->operation === NForm::LENGTH || $rule->operation === NForm::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 === NForm::FLOAT) {
138: $this->addFilter(array(__CLASS__, 'filterFloat'));
139:
140: } elseif ($operation === NForm::LENGTH || $operation === NForm::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: public static function validateMinLength(NTextBase $control, $length)
155: {
156: return NStrings::length($control->getValue()) >= $length;
157: }
158:
159:
160: 161: 162: 163: 164: 165:
166: public static function validateMaxLength(NTextBase $control, $length)
167: {
168: return NStrings::length($control->getValue()) <= $length;
169: }
170:
171:
172: 173: 174: 175: 176: 177:
178: public static function validateLength(NTextBase $control, $range)
179: {
180: if (!is_array($range)) {
181: $range = array($range, $range);
182: }
183: return NValidators::isInRange(NStrings::length($control->getValue()), $range);
184: }
185:
186:
187: 188: 189: 190: 191:
192: public static function validateEmail(NTextBase $control)
193: {
194: return NValidators::isEmail($control->getValue());
195: }
196:
197:
198: 199: 200: 201: 202:
203: public static function validateUrl(NTextBase $control)
204: {
205: return NValidators::isUrl($control->getValue()) || NValidators::isUrl('http://' . $control->getValue());
206: }
207:
208:
209:
210: public static function validateRegexp(NTextBase $control, $regexp)
211: {
212: return (bool) NStrings::match($control->getValue(), $regexp);
213: }
214:
215:
216: 217: 218: 219: 220: 221:
222: public static function validatePattern(NTextBase $control, $pattern)
223: {
224: return (bool) NStrings::match($control->getValue(), "\x01^($pattern)\\z\x01u");
225: }
226:
227:
228: 229: 230: 231: 232:
233: public static function validateInteger(NTextBase $control)
234: {
235: return NValidators::isNumericInt($control->getValue());
236: }
237:
238:
239: 240: 241: 242: 243:
244: public static function validateFloat(NTextBase $control)
245: {
246: return NValidators::isNumeric(self::filterFloat($control->getValue()));
247: }
248:
249:
250: 251: 252: 253: 254: 255:
256: public static function validateRange(NTextBase $control, $range)
257: {
258: return NValidators::isInRange($control->getValue(), $range);
259: }
260:
261:
262: 263: 264: 265: 266:
267: public static function filterFloat($s)
268: {
269: return str_replace(array(' ', ','), array('', '.'), $s);
270: }
271:
272: }
273: