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: public function setValue($value)
145: {
146: $this->value = $value;
147: return $this;
148: }
149:
150:
151: 152: 153: 154:
155: public function getValue()
156: {
157: return $this->value;
158: }
159:
160:
161: 162: 163: 164:
165: public function isFilled()
166: {
167: $value = $this->getValue();
168: return $value !== NULL && $value !== array() && $value !== '';
169: }
170:
171:
172: 173: 174: 175:
176: public function setDefaultValue($value)
177: {
178: $form = $this->getForm(FALSE);
179: if ($this->isDisabled() || !$form || !$form->isAnchored() || !$form->isSubmitted()) {
180: $this->setValue($value);
181: }
182: return $this;
183: }
184:
185:
186: 187: 188: 189: 190:
191: public function setDisabled($value = TRUE)
192: {
193: if ($this->disabled = (bool) $value) {
194: $this->omitted = TRUE;
195: $this->setValue(NULL);
196: }
197: return $this;
198: }
199:
200:
201: 202: 203: 204:
205: public function isDisabled()
206: {
207: return $this->disabled === TRUE;
208: }
209:
210:
211: 212: 213: 214: 215:
216: public function setOmitted($value = TRUE)
217: {
218: $this->omitted = (bool) $value;
219: return $this;
220: }
221:
222:
223: 224: 225: 226:
227: public function isOmitted()
228: {
229: return $this->omitted;
230: }
231:
232:
233:
234:
235:
236: 237: 238: 239:
240: public function getControl()
241: {
242: $this->setOption('rendered', TRUE);
243: $el = clone $this->control;
244: return $el->addAttributes(array(
245: 'name' => $this->getHtmlName(),
246: 'id' => $this->getHtmlId(),
247: 'required' => $this->isRequired(),
248: 'disabled' => $this->isDisabled(),
249: 'data-nette-rules' => Nette\Forms\Helpers::exportRules($this->rules) ?: NULL,
250: ));
251: }
252:
253:
254: 255: 256: 257: 258:
259: public function getLabel($caption = NULL)
260: {
261: $label = clone $this->label;
262: $label->for = $this->getHtmlId();
263: $label->setText($this->translate($caption === NULL ? $this->caption : $caption));
264: return $label;
265: }
266:
267:
268: 269: 270: 271:
272: public function getControlPrototype()
273: {
274: return $this->control;
275: }
276:
277:
278: 279: 280: 281:
282: public function getLabelPrototype()
283: {
284: return $this->label;
285: }
286:
287:
288: 289: 290: 291: 292:
293: public function setHtmlId($id)
294: {
295: $this->control->id = $id;
296: return $this;
297: }
298:
299:
300: 301: 302: 303:
304: public function getHtmlId()
305: {
306: if (!isset($this->control->id)) {
307: $this->control->id = sprintf(self::$idMask, $this->lookupPath());
308: }
309: return $this->control->id;
310: }
311:
312:
313: 314: 315: 316: 317: 318:
319: public function setAttribute($name, $value = TRUE)
320: {
321: $this->control->$name = $value;
322: return $this;
323: }
324:
325:
326:
327:
328:
329: 330: 331: 332:
333: public function setTranslator(Nette\Localization\ITranslator $translator = NULL)
334: {
335: $this->translator = $translator;
336: return $this;
337: }
338:
339:
340: 341: 342: 343:
344: public function getTranslator()
345: {
346: if ($this->translator === TRUE) {
347: return $this->getForm(FALSE) ? $this->getForm()->getTranslator() : NULL;
348: }
349: return $this->translator;
350: }
351:
352:
353: 354: 355: 356: 357: 358:
359: public function translate($value, $count = NULL)
360: {
361: if ($translator = $this->getTranslator()) {
362: $tmp = is_array($value) ? array(& $value) : array(array(& $value));
363: foreach ($tmp[0] as & $v) {
364: if ($v != NULL && !$v instanceof Html) {
365: $v = $translator->translate($v, $count);
366: }
367: }
368: }
369: return $value;
370: }
371:
372:
373:
374:
375:
376: 377: 378: 379: 380: 381: 382:
383: public function addRule($validator, $message = NULL, $arg = NULL)
384: {
385: $this->rules->addRule($validator, $message, $arg);
386: return $this;
387: }
388:
389:
390: 391: 392: 393: 394: 395:
396: public function addCondition($validator, $value = NULL)
397: {
398: return $this->rules->addCondition($validator, $value);
399: }
400:
401:
402: 403: 404: 405: 406: 407: 408:
409: public function addConditionOn(IControl $control, $validator, $value = NULL)
410: {
411: return $this->rules->addConditionOn($control, $validator, $value);
412: }
413:
414:
415: 416: 417:
418: public function getRules()
419: {
420: return $this->rules;
421: }
422:
423:
424: 425: 426: 427: 428:
429: public function setRequired($value = TRUE)
430: {
431: $this->rules->setRequired($value);
432: return $this;
433: }
434:
435:
436: 437: 438: 439:
440: public function isRequired()
441: {
442: return $this->rules->isRequired();
443: }
444:
445:
446: 447: 448: 449:
450: public function validate()
451: {
452: if ($this->isDisabled()) {
453: return;
454: }
455: $this->cleanErrors();
456: $this->rules->validate();
457: }
458:
459:
460: 461: 462: 463: 464:
465: public function addError($message)
466: {
467: $this->errors[] = $message;
468: }
469:
470:
471: 472: 473: 474:
475: public function getError()
476: {
477: return $this->errors ? implode(' ', array_unique($this->errors)) : NULL;
478: }
479:
480:
481: 482: 483: 484:
485: public function getErrors()
486: {
487: return array_unique($this->errors);
488: }
489:
490:
491: 492: 493:
494: public function hasErrors()
495: {
496: return (bool) $this->errors;
497: }
498:
499:
500: 501: 502:
503: public function cleanErrors()
504: {
505: $this->errors = array();
506: }
507:
508:
509:
510: protected static function exportRules($rules)
511: {
512: trigger_error(__METHOD__ . '() is deprecated; use Nette\Forms\Helpers::exportRules() instead.', E_USER_DEPRECATED);
513: return Nette\Forms\Helpers::exportRules($rules);
514: }
515:
516:
517:
518:
519:
520: 521: 522: 523:
524: public function setOption($key, $value)
525: {
526: if ($value === NULL) {
527: unset($this->options[$key]);
528: } else {
529: $this->options[$key] = $value;
530: }
531: return $this;
532: }
533:
534:
535: 536: 537: 538:
539: public function getOption($key, $default = NULL)
540: {
541: return isset($this->options[$key]) ? $this->options[$key] : $default;
542: }
543:
544:
545: 546: 547: 548:
549: public function getOptions()
550: {
551: return $this->options;
552: }
553:
554: }
555: