1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Forms\Controls;
9:
10: use Nette;
11: use Nette\Forms\IControl;
12: use Nette\Utils\Html;
13: use Nette\Forms\Form;
14:
15:
16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
32: abstract class BaseControl extends Nette\ComponentModel\Component implements IControl
33: {
34:
35: public static $idMask = 'frm-%s';
36:
37:
38: public $caption;
39:
40:
41: protected $value;
42:
43:
44: protected $control;
45:
46:
47: protected $label;
48:
49:
50: private $errors = array();
51:
52:
53: protected $disabled = FALSE;
54:
55:
56: private $omitted = FALSE;
57:
58:
59: private $rules;
60:
61:
62: private $translator = TRUE;
63:
64:
65: private $options = array();
66:
67:
68: 69: 70:
71: public function __construct($caption = NULL)
72: {
73: $this->monitor('Nette\Forms\Form');
74: parent::__construct();
75: $this->control = Html::el('input', array('type' => NULL, 'name' => NULL));
76: $this->label = Html::el('label');
77: $this->caption = $caption;
78: $this->rules = new Nette\Forms\Rules($this);
79: $this->setValue(NULL);
80: }
81:
82:
83: 84: 85: 86: 87:
88: protected function attached($form)
89: {
90: if (!$this->isDisabled() && $form instanceof Form && $form->isAnchored() && $form->isSubmitted()) {
91: $this->loadHttpData();
92: }
93: }
94:
95:
96: 97: 98: 99: 100:
101: public function getForm($need = TRUE)
102: {
103: return $this->lookup('Nette\Forms\Form', $need);
104: }
105:
106:
107: 108: 109: 110:
111: public function loadHttpData()
112: {
113: $this->setValue($this->getHttpData(Form::DATA_TEXT));
114: }
115:
116:
117: 118: 119: 120:
121: public function getHttpData($type, $htmlTail = NULL)
122: {
123: return $this->getForm()->getHttpData($type, $this->getHtmlName() . $htmlTail);
124: }
125:
126:
127: 128: 129: 130:
131: public function getHtmlName()
132: {
133: return Nette\Forms\Helpers::generateHtmlName($this->lookupPath('Nette\Forms\Form'));
134: }
135:
136:
137:
138:
139:
140: 141: 142: 143: 144:
145: public function setValue($value)
146: {
147: $this->value = $value;
148: return $this;
149: }
150:
151:
152: 153: 154: 155:
156: public function getValue()
157: {
158: return $this->value;
159: }
160:
161:
162: 163: 164: 165:
166: public function isFilled()
167: {
168: $value = $this->getValue();
169: return $value !== NULL && $value !== array() && $value !== '';
170: }
171:
172:
173: 174: 175: 176:
177: public function setDefaultValue($value)
178: {
179: $form = $this->getForm(FALSE);
180: if ($this->isDisabled() || !$form || !$form->isAnchored() || !$form->isSubmitted()) {
181: $this->setValue($value);
182: }
183: return $this;
184: }
185:
186:
187: 188: 189: 190: 191:
192: public function setDisabled($value = TRUE)
193: {
194: if ($this->disabled = (bool) $value) {
195: $this->omitted = TRUE;
196: $this->setValue(NULL);
197: }
198: return $this;
199: }
200:
201:
202: 203: 204: 205:
206: public function isDisabled()
207: {
208: return $this->disabled === TRUE;
209: }
210:
211:
212: 213: 214: 215: 216:
217: public function setOmitted($value = TRUE)
218: {
219: $this->omitted = (bool) $value;
220: return $this;
221: }
222:
223:
224: 225: 226: 227:
228: public function isOmitted()
229: {
230: return $this->omitted;
231: }
232:
233:
234:
235:
236:
237: 238: 239: 240:
241: public function getControl()
242: {
243: $this->setOption('rendered', TRUE);
244: $el = clone $this->control;
245: return $el->addAttributes(array(
246: 'name' => $this->getHtmlName(),
247: 'id' => $this->getHtmlId(),
248: 'required' => $this->isRequired(),
249: 'disabled' => $this->isDisabled(),
250: 'data-nette-rules' => Nette\Forms\Helpers::exportRules($this->rules) ?: NULL,
251: ));
252: }
253:
254:
255: 256: 257: 258: 259:
260: public function getLabel($caption = NULL)
261: {
262: $label = clone $this->label;
263: $label->for = $this->getHtmlId();
264: $label->setText($this->translate($caption === NULL ? $this->caption : $caption));
265: return $label;
266: }
267:
268:
269: 270: 271: 272:
273: public function getControlPrototype()
274: {
275: return $this->control;
276: }
277:
278:
279: 280: 281: 282:
283: public function getLabelPrototype()
284: {
285: return $this->label;
286: }
287:
288:
289: 290: 291: 292: 293:
294: public function setHtmlId($id)
295: {
296: $this->control->id = $id;
297: return $this;
298: }
299:
300:
301: 302: 303: 304:
305: public function getHtmlId()
306: {
307: if (!isset($this->control->id)) {
308: $this->control->id = sprintf(self::$idMask, $this->lookupPath());
309: }
310: return $this->control->id;
311: }
312:
313:
314: 315: 316: 317: 318: 319:
320: public function setHtmlAttribute($name, $value = TRUE)
321: {
322: return $this->setAttribute($name, $value);
323: }
324:
325:
326: 327: 328: 329: 330: 331:
332: public function setAttribute($name, $value = TRUE)
333: {
334: $this->control->$name = $value;
335: return $this;
336: }
337:
338:
339:
340:
341:
342: 343: 344: 345:
346: public function setTranslator(Nette\Localization\ITranslator $translator = NULL)
347: {
348: $this->translator = $translator;
349: return $this;
350: }
351:
352:
353: 354: 355: 356:
357: public function getTranslator()
358: {
359: if ($this->translator === TRUE) {
360: return $this->getForm(FALSE) ? $this->getForm()->getTranslator() : NULL;
361: }
362: return $this->translator;
363: }
364:
365:
366: 367: 368: 369: 370: 371:
372: public function translate($value, $count = NULL)
373: {
374: if ($translator = $this->getTranslator()) {
375: $tmp = is_array($value) ? array(& $value) : array(array(& $value));
376: foreach ($tmp[0] as & $v) {
377: if ($v != NULL && !$v instanceof Html) {
378: $v = $translator->translate($v, $count);
379: }
380: }
381: }
382: return $value;
383: }
384:
385:
386:
387:
388:
389: 390: 391: 392: 393: 394: 395:
396: public function addRule($validator, $message = NULL, $arg = NULL)
397: {
398: $this->rules->addRule($validator, $message, $arg);
399: return $this;
400: }
401:
402:
403: 404: 405: 406: 407: 408:
409: public function addCondition($validator, $value = NULL)
410: {
411: return $this->rules->addCondition($validator, $value);
412: }
413:
414:
415: 416: 417: 418: 419: 420: 421:
422: public function addConditionOn(IControl $control, $validator, $value = NULL)
423: {
424: return $this->rules->addConditionOn($control, $validator, $value);
425: }
426:
427:
428: 429: 430:
431: public function getRules()
432: {
433: return $this->rules;
434: }
435:
436:
437: 438: 439: 440: 441:
442: public function setRequired($value = TRUE)
443: {
444: $this->rules->setRequired($value);
445: return $this;
446: }
447:
448:
449: 450: 451: 452:
453: public function isRequired()
454: {
455: return $this->rules->isRequired();
456: }
457:
458:
459: 460: 461: 462:
463: public function validate()
464: {
465: if ($this->isDisabled()) {
466: return;
467: }
468: $this->cleanErrors();
469: $this->rules->validate();
470: }
471:
472:
473: 474: 475: 476: 477:
478: public function addError($message)
479: {
480: $this->errors[] = $message;
481: }
482:
483:
484: 485: 486: 487:
488: public function getError()
489: {
490: return $this->errors ? implode(' ', array_unique($this->errors)) : NULL;
491: }
492:
493:
494: 495: 496: 497:
498: public function getErrors()
499: {
500: return array_unique($this->errors);
501: }
502:
503:
504: 505: 506:
507: public function hasErrors()
508: {
509: return (bool) $this->errors;
510: }
511:
512:
513: 514: 515:
516: public function cleanErrors()
517: {
518: $this->errors = array();
519: }
520:
521:
522:
523: protected static function exportRules($rules)
524: {
525: trigger_error(__METHOD__ . '() is deprecated; use Nette\Forms\Helpers::exportRules() instead.', E_USER_DEPRECATED);
526: return Nette\Forms\Helpers::exportRules($rules);
527: }
528:
529:
530:
531:
532:
533: 534: 535: 536:
537: public function setOption($key, $value)
538: {
539: if ($value === NULL) {
540: unset($this->options[$key]);
541: } else {
542: $this->options[$key] = $value;
543: }
544: return $this;
545: }
546:
547:
548: 549: 550: 551:
552: public function getOption($key, $default = NULL)
553: {
554: return isset($this->options[$key]) ? $this->options[$key] : $default;
555: }
556:
557:
558: 559: 560: 561:
562: public function getOptions()
563: {
564: return $this->options;
565: }
566:
567: }
568: