1: <?php
2:
3: 4: 5: 6:
7:
8: namespace Nette\Forms;
9:
10: use Nette;
11:
12:
13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
25: class Container extends Nette\ComponentModel\Container implements \ArrayAccess
26: {
27:
28: public $onValidate;
29:
30:
31: protected $currentGroup;
32:
33:
34: private $validated;
35:
36:
37:
38:
39:
40: 41: 42: 43: 44: 45:
46: public function setDefaults($values, $erase = FALSE)
47: {
48: $form = $this->getForm(FALSE);
49: if (!$form || !$form->isAnchored() || !$form->isSubmitted()) {
50: $this->setValues($values, $erase);
51: }
52: return $this;
53: }
54:
55:
56: 57: 58: 59: 60: 61:
62: public function setValues($values, $erase = FALSE)
63: {
64: if ($values instanceof \Traversable) {
65: $values = iterator_to_array($values);
66:
67: } elseif (!is_array($values)) {
68: throw new Nette\InvalidArgumentException(sprintf('First parameter must be an array, %s given.', gettype($values)));
69: }
70:
71: foreach ($this->getComponents() as $name => $control) {
72: if ($control instanceof IControl) {
73: if (array_key_exists($name, $values)) {
74: $control->setValue($values[$name]);
75:
76: } elseif ($erase) {
77: $control->setValue(NULL);
78: }
79:
80: } elseif ($control instanceof Container) {
81: if (array_key_exists($name, $values)) {
82: $control->setValues($values[$name], $erase);
83:
84: } elseif ($erase) {
85: $control->setValues(array(), $erase);
86: }
87: }
88: }
89: return $this;
90: }
91:
92:
93: 94: 95: 96: 97:
98: public function getValues($asArray = FALSE)
99: {
100: $values = $asArray ? array() : new Nette\Utils\ArrayHash;
101: foreach ($this->getComponents() as $name => $control) {
102: if ($control instanceof IControl && !$control->isOmitted()) {
103: $values[$name] = $control->getValue();
104:
105: } elseif ($control instanceof Container) {
106: $values[$name] = $control->getValues($asArray);
107: }
108: }
109: return $values;
110: }
111:
112:
113:
114:
115:
116: 117: 118: 119:
120: public function isValid()
121: {
122: if (!$this->validated) {
123: $this->validate();
124: }
125: return !$this->getErrors();
126: }
127:
128:
129: 130: 131: 132: 133:
134: public function validate(array $controls = NULL)
135: {
136: foreach ($controls === NULL ? $this->getControls() : $controls as $control) {
137: $control->validate();
138: }
139: $this->onValidate($this);
140: $this->validated = TRUE;
141: }
142:
143:
144: 145: 146: 147:
148: public function getErrors()
149: {
150: $errors = array();
151: foreach ($this->getControls() as $control) {
152: $errors = array_merge($errors, $control->getErrors());
153: }
154: return array_unique($errors);
155: }
156:
157:
158:
159:
160:
161: 162: 163:
164: public function setCurrentGroup(ControlGroup $group = NULL)
165: {
166: $this->currentGroup = $group;
167: return $this;
168: }
169:
170:
171: 172: 173: 174:
175: public function getCurrentGroup()
176: {
177: return $this->currentGroup;
178: }
179:
180:
181: 182: 183: 184: 185: 186: 187: 188:
189: public function addComponent(Nette\ComponentModel\IComponent $component, $name, $insertBefore = NULL)
190: {
191: parent::addComponent($component, $name, $insertBefore);
192: if ($this->currentGroup !== NULL && $component instanceof IControl) {
193: $this->currentGroup->add($component);
194: }
195: return $this;
196: }
197:
198:
199: 200: 201: 202:
203: public function getControls()
204: {
205: return $this->getComponents(TRUE, 'Nette\Forms\IControl');
206: }
207:
208:
209: 210: 211: 212: 213:
214: public function getForm($need = TRUE)
215: {
216: return $this->lookup('Nette\Forms\Form', $need);
217: }
218:
219:
220:
221:
222:
223: 224: 225: 226: 227: 228: 229: 230:
231: public function addText($name, $label = NULL, $cols = NULL, $maxLength = NULL)
232: {
233: $control = new Controls\TextInput($label, $maxLength);
234: $control->setAttribute('size', $cols);
235: return $this[$name] = $control;
236: }
237:
238:
239: 240: 241: 242: 243: 244: 245: 246:
247: public function addPassword($name, $label = NULL, $cols = NULL, $maxLength = NULL)
248: {
249: $control = new Controls\TextInput($label, $maxLength);
250: $control->setAttribute('size', $cols);
251: return $this[$name] = $control->setType('password');
252: }
253:
254:
255: 256: 257: 258: 259: 260: 261: 262:
263: public function addTextArea($name, $label = NULL, $cols = NULL, $rows = NULL)
264: {
265: $control = new Controls\TextArea($label);
266: $control->setAttribute('cols', $cols)->setAttribute('rows', $rows);
267: return $this[$name] = $control;
268: }
269:
270:
271: 272: 273: 274: 275: 276: 277:
278: public function addUpload($name, $label = NULL, $multiple = FALSE)
279: {
280: return $this[$name] = new Controls\UploadControl($label, $multiple);
281: }
282:
283:
284: 285: 286: 287: 288: 289:
290: public function addHidden($name, $default = NULL)
291: {
292: $control = new Controls\HiddenField;
293: $control->setDefaultValue($default);
294: return $this[$name] = $control;
295: }
296:
297:
298: 299: 300: 301: 302: 303:
304: public function addCheckbox($name, $caption = NULL)
305: {
306: return $this[$name] = new Controls\Checkbox($caption);
307: }
308:
309:
310: 311: 312: 313: 314: 315: 316:
317: public function addRadioList($name, $label = NULL, array $items = NULL)
318: {
319: return $this[$name] = new Controls\RadioList($label, $items);
320: }
321:
322:
323: 324: 325: 326:
327: public function addCheckboxList($name, $label = NULL, array $items = NULL)
328: {
329: return $this[$name] = new Controls\CheckboxList($label, $items);
330: }
331:
332:
333: 334: 335: 336: 337: 338: 339: 340:
341: public function addSelect($name, $label = NULL, array $items = NULL, $size = NULL)
342: {
343: $control = new Controls\SelectBox($label, $items);
344: if ($size > 1) {
345: $control->setAttribute('size', (int) $size);
346: }
347: return $this[$name] = $control;
348: }
349:
350:
351: 352: 353: 354: 355: 356: 357: 358:
359: public function addMultiSelect($name, $label = NULL, array $items = NULL, $size = NULL)
360: {
361: $control = new Controls\MultiSelectBox($label, $items);
362: if ($size > 1) {
363: $control->setAttribute('size', (int) $size);
364: }
365: return $this[$name] = $control;
366: }
367:
368:
369: 370: 371: 372: 373: 374:
375: public function addSubmit($name, $caption = NULL)
376: {
377: return $this[$name] = new Controls\SubmitButton($caption);
378: }
379:
380:
381: 382: 383: 384: 385: 386:
387: public function addButton($name, $caption = NULL)
388: {
389: return $this[$name] = new Controls\Button($caption);
390: }
391:
392:
393: 394: 395: 396: 397: 398: 399:
400: public function addImage($name, $src = NULL, $alt = NULL)
401: {
402: return $this[$name] = new Controls\ImageButton($src, $alt);
403: }
404:
405:
406: 407: 408: 409: 410:
411: public function addContainer($name)
412: {
413: $control = new Container;
414: $control->currentGroup = $this->currentGroup;
415: return $this[$name] = $control;
416: }
417:
418:
419:
420:
421:
422: 423: 424: 425: 426: 427:
428: public function offsetSet($name, $component)
429: {
430: $this->addComponent($component, $name);
431: }
432:
433:
434: 435: 436: 437: 438: 439:
440: public function offsetGet($name)
441: {
442: return $this->getComponent($name, TRUE);
443: }
444:
445:
446: 447: 448: 449: 450:
451: public function offsetExists($name)
452: {
453: return $this->getComponent($name, FALSE) !== NULL;
454: }
455:
456:
457: 458: 459: 460: 461:
462: public function offsetUnset($name)
463: {
464: $component = $this->getComponent($name, FALSE);
465: if ($component !== NULL) {
466: $this->removeComponent($component);
467: }
468: }
469:
470:
471: 472: 473:
474: public function __clone()
475: {
476: throw new Nette\NotImplementedException('Form cloning is not supported yet.');
477: }
478:
479: }
480: