1: <?php
2:
3: /**
4: * This file is part of the Nette Framework (https://nette.org)
5: *
6: * Copyright (c) 2004 David Grudl (http://davidgrudl.com)
7: *
8: * For the full copyright and license information, please view
9: * the file license.txt that was distributed with this source code.
10: */
11:
12: namespace Nette\Application;
13:
14: use Nette;
15:
16:
17:
18: /**
19: * Web form as presenter component.
20: *
21: * @author David Grudl
22: *
23: * @property-read Presenter $presenter
24: */
25: class AppForm extends Nette\Forms\Form implements ISignalReceiver
26: {
27:
28: /**
29: * Application form constructor.
30: */
31: public function __construct(Nette\IComponentContainer $parent = NULL, $name = NULL)
32: {
33: parent::__construct();
34: $this->monitor('Nette\Application\Presenter');
35: if ($parent !== NULL) {
36: $parent->addComponent($this, $name);
37: }
38: }
39:
40:
41:
42: /**
43: * Returns the presenter where this component belongs to.
44: * @param bool throw exception if presenter doesn't exist?
45: * @return Presenter|NULL
46: */
47: public function getPresenter($need = TRUE)
48: {
49: return $this->lookup('Nette\Application\Presenter', $need);
50: }
51:
52:
53:
54: /**
55: * This method will be called when the component (or component's parent)
56: * becomes attached to a monitored object. Do not call this method yourself.
57: * @param IComponent
58: * @return void
59: */
60: protected function attached($presenter)
61: {
62: if ($presenter instanceof Presenter) {
63: $name = $this->lookupPath('Nette\Application\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: // fill-in the form with HTTP data
76: if ($this->isSubmitted()) {
77: foreach ($this->getControls() as $control) {
78: $control->loadHttpData();
79: }
80: }
81: }
82: parent::attached($presenter);
83: }
84:
85:
86:
87: /**
88: * Tells if the form is anchored.
89: * @return bool
90: */
91: public function isAnchored()
92: {
93: return (bool) $this->getPresenter(FALSE);
94: }
95:
96:
97:
98: /**
99: * Internal: receives submitted HTTP data.
100: * @return array
101: */
102: protected function receiveHttpData()
103: {
104: $presenter = $this->getPresenter();
105: if (!$presenter->isSignalReceiver($this, 'submit')) {
106: return;
107: }
108:
109: $isPost = $this->getMethod() === self::POST;
110: $request = $presenter->getRequest();
111: if ($request->isMethod('forward') || $request->isMethod('post') !== $isPost) {
112: return;
113: }
114:
115: if ($isPost) {
116: return Nette\ArrayTools::mergeTree($request->getPost(), $request->getFiles());
117: } else {
118: return $request->getParams();
119: }
120: }
121:
122:
123:
124: /********************* interface ISignalReceiver ****************d*g**/
125:
126:
127:
128: /**
129: * This method is called by presenter.
130: * @param string
131: * @return void
132: */
133: public function signalReceived($signal)
134: {
135: if ($signal === 'submit') {
136: $this->fireEvents();
137:
138: } else {
139: throw new BadSignalException("There is no handler for signal '$signal' in {$this->reflection->name}.");
140: }
141: }
142:
143: }
144: