1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10:
11:
12: namespace Nette\Application\UI;
13:
14: use Nette;
15:
16:
17:
18: 19: 20: 21: 22: 23: 24:
25: class Form extends Nette\Forms\Form implements ISignalReceiver
26: {
27:
28: 29: 30:
31: public function __construct(Nette\ComponentModel\IContainer $parent = NULL, $name = NULL)
32: {
33: parent::__construct();
34: $this->monitor('Nette\Application\UI\Presenter');
35: if ($parent !== NULL) {
36: $parent->addComponent($this, $name);
37: }
38: }
39:
40:
41:
42: 43: 44: 45: 46:
47: public function getPresenter($need = TRUE)
48: {
49: return $this->lookup('Nette\Application\UI\Presenter', $need);
50: }
51:
52:
53:
54: 55: 56: 57: 58: 59:
60: protected function attached($presenter)
61: {
62: if ($presenter instanceof Presenter) {
63: $name = $this->lookupPath('Nette\Application\UI\Presenter');
64:
65: if (!isset($this->getElementPrototype()->id)) {
66: $this->getElementPrototype()->id = 'frm-' . $name;
67: }
68:
69: $this->setAction(new Link(
70: $presenter,
71: $name . self::NAME_SEPARATOR . 'submit!',
72: array()
73: ));
74:
75:
76: if ($this->isSubmitted()) {
77: foreach ($this->getControls() as $control) {
78: if (!$control->isDisabled()) {
79: $control->loadHttpData();
80: }
81: }
82: }
83: }
84: parent::attached($presenter);
85: }
86:
87:
88:
89: 90: 91: 92:
93: public function isAnchored()
94: {
95: return (bool) $this->getPresenter(FALSE);
96: }
97:
98:
99:
100: 101: 102: 103:
104: protected function receiveHttpData()
105: {
106: $presenter = $this->getPresenter();
107: if (!$presenter->isSignalReceiver($this, 'submit')) {
108: return;
109: }
110:
111: $isPost = $this->getMethod() === self::POST;
112: $request = $presenter->getRequest();
113: if ($request->isMethod('forward') || $request->isMethod('post') !== $isPost) {
114: return;
115: }
116:
117: if ($isPost) {
118: return Nette\Utils\Arrays::mergeTree($request->getPost(), $request->getFiles());
119: } else {
120: return $request->getParameters();
121: }
122: }
123:
124:
125:
126:
127:
128:
129:
130: 131: 132: 133: 134:
135: public function signalReceived($signal)
136: {
137: if ($signal === 'submit') {
138: if (!$this->getPresenter()->getRequest()->hasFlag(Nette\Application\Request::RESTORED)) {
139: $this->fireEvents();
140: }
141: } else {
142: $class = get_class($this);
143: throw new BadSignalException("Missing handler for signal '$signal' in $class.");
144: }
145: }
146:
147: }
148: