source: trunk/forms.php@ 391

Last change on this file since 391 was 302, checked in by george, 14 years ago
  • Opraveno: Vkládání nových plateb a faktůr.
File size: 9.1 KB
Line 
1<?php
2
3include_once('form_classes.php');
4include_once('database.php');
5
6class Form
7{
8 var $Definition = array();
9 var $Values = array();
10 var $OnSubmit = '';
11
12 function Form($ClassName)
13 {
14 global $FormClasses;
15
16 $this->Definition = &$FormClasses[$ClassName];
17 }
18
19 function ShowEditForm()
20 {
21 if(!array_key_exists('SubmitText', $this->Definition)) $this->Definition['SubmitText'] = 'Uložit';
22 $Output = '<form class="Form" action="'.$this->OnSubmit.'" method="post">'.$this->ShowEditBlock().'<div><input type="submit" value="'.$this->Definition['SubmitText'].'" /></div></form>';
23 return($Output);
24 }
25
26 function ShowEditBlock($Context = '')
27 {
28 global $Database, $FormTypes;
29
30 $Table = array(
31 //'Header' => array('Položka', 'Hodnota'),
32 'Rows' => array(),
33 );
34 if($Context != '') $Context = $Context.'-';
35 foreach($this->Definition['Items'] as $Index => $Item)
36 {
37 if(!array_key_exists($Index, $this->Values) and isset($Item['Default'])) $this->Values[$Index] = $Item['Default'];
38 switch($Item['Type'])
39 {
40 case 'Boolean':
41 if($this->Values[$Index] == 0) $Checked = ''; else $Checked = ' CHECKED';
42 $Edit = '<input type="checkbox" name="'.$Context.$Index.'"'.$Checked.' />';
43 break;
44 case 'String':
45 $Edit = '<input style="width: 98%;" type="text" name="'.$Context.$Index.'" value="'.$this->Values[$Index].'" />';
46 break;
47 case 'Text':
48 $Edit = '<textarea style="width: 98%; height: 200px;" name="'.$Context.$Index.'">'.$this->Values[$Index].'</textarea>';
49 break;
50 case 'Password':
51 $Edit = '<input style="width: 98%;" type="password" name="'.$Context.$Index.'" value="'.$this->Values[$Index].'" />';
52 break;
53 case 'Integer':
54 $Edit = '<input style="width: 98%;" type="text" name="'.$Context.$Index.'" value="'.$this->Values[$Index].'" />';
55 break;
56 case 'Float':
57 $Edit = '<input style="width: 98%;" type="text" name="'.$Context.$Index.'" value="'.$this->Values[$Index].'" />';
58 break;
59 case 'Time':
60 if($this->Values[$Index] == 'Now') $this->Values[$Index] = date('j.n.Y');
61 $Edit = '<input style="width: 98%;" type="text" name="'.$Context.$Index.'" value="'.$this->Values[$Index].'" />';
62 break;
63 case 'Array':
64 $Form = new Form($Item['ItemClass']);
65 $Edit = '<script type="text/javascript" id="syndication">'.
66 "var Count = 0;".
67 "function AddItem() {".
68 "Count = Count + 1;".
69 "var newcontent = document.createElement('div');".
70 "newcontent.id = '".$Context.$Item['ItemClass']."-' + Count;".
71 "newcontent.innerHTML = '<input type=\"hidden\" name=\"".$Context.$Item['ItemClass']."-' + Count + '\">".$Form->ShowEditBlock($Context.$Item['ItemClass']."-' + Count + '")."';".
72 "var scr = document.getElementById('syndication');".
73 "scr.parentNode.insertBefore(newcontent, scr); }".
74 '</script>';
75 $Edit .= '<form><input type="button" onclick="AddItem();" value="Přidat položku" /></form>';
76 break;
77 default:
78 if(array_key_exists($Item['Type'], $FormTypes))
79 {
80 // Custom types
81 switch($FormTypes[$Item['Type']]['Type'])
82 {
83 case 'Enumeration':
84 $Edit = '<select style="width: 100%;" name="'.$Context.$Index.'">';
85 foreach($FormTypes[$Item['Type']]['States'] as $StateIndex => $StateName)
86 {
87 if($this->Values[$Index] == $StateIndex) $Selected = 'selected="selected"';
88 else $Selected = '';
89 $Edit .= '<option value="'.$StateIndex.'"'.$Selected.'>'.$StateName.'</option>';
90 }
91 $Edit .= '</select>';
92 break;
93 case 'Reference':
94 $Edit = '<select style="width: 100%;" name="'.$Context.$Index.'">';
95 $DbResult = $Database->select($FormTypes[$Item['Type']]['Table'], $FormTypes[$Item['Type']]['Id'].' as Id, '.$FormTypes[$Item['Type']]['Name'].' as Name', $FormTypes[$Item['Type']]['Filter'].' ORDER BY Name');
96 while($Row = $DbResult->fetch_assoc())
97 {
98 if($Row['Id'] == $this->Values[$Index]) $Selected = ' selected="selected"';
99 else $Selected = '';
100 $Edit .= '<option value="'.$Row['Id'].'"'.$Selected.'>'.$Row['Id'].': '.$Row['Name'].'</option>';
101 }
102 $Edit .= '</select>';
103 break;
104 default:
105 $Edit = 'Neznámý typ';
106 }
107 } else $Edit = 'Neznámý typ';
108 }
109 array_push($Table['Rows'], array($Item['Caption'].':', $Edit));
110 }
111 $Output = '<fieldset><legend>'.$this->Definition['Title'].'</legend>'.Table($Table).
112 '</fieldset>';
113 return($Output);
114 }
115
116 function LoadValuesFromDatabase($Id)
117 {
118 global $Database;
119
120 $DbResult = $Database->query('SELECT T.* FROM '.$this->Definition['Table'].' AS T WHERE T.Id='.$Id);
121 $DbRow = $DbResult->fetch_array();
122 foreach($this->Definition['Items'] as $Index => $Item)
123 {
124 $this->Values[$Index] = $DbRow[$Index];
125 switch($Item['Type'])
126 {
127 case 'Password':
128 if($Item['Type'] == 'Password') $this->Values[$Index] = ''; // Dont show password
129 break;
130 case 'Time':
131 $this->Values[$Index] == MysqlDateTimeToTime($this->Values[$Index]);
132 break;
133 }
134 }
135 }
136
137 function SaveValuesToDatabase($Id)
138 {
139 global $Database;
140
141 foreach($this->Definition['Items'] as $Index => $Item)
142 {
143 switch($Item['Type'])
144 {
145 case 'Password':
146 if($this->Values[$Index] == '') unset($this->Values[$Index]); // Do not modify empty passwords
147 else $this->Values[$Index] = sha1($this->Values[$Index]);
148 break;
149 case 'Time':
150 $this->Values[$Index] = TimeToMysqlDateTime($this->Values[$Index]);
151 break;
152 }
153 }
154 if($Id == 0)
155 {
156 $this->Values['Id'] = $Id;
157 $DbResult = $Database->replace($this->Definition['Table'], $this->Values);
158 } else
159 $DbResult = $Database->update($this->Definition['Table'], 'Id='.$Id, $this->Values);
160 //echo($Database->LastQuery);
161 }
162
163 function LoadValuesFromForm()
164 {
165 $this->Values = $this->LoadValuesFromFormBlock();
166 }
167
168 function LoadValuesFromFormBlock($Context = '')
169 {
170 global $FormTypes;
171
172 if($Context != '') $Context = $Context.'-';
173 $Values = array();
174 foreach($this->Definition['Items'] as $Index => $Item)
175 {
176 if(array_key_exists($Context.$Index, $_POST))
177 switch($Item['Type'])
178 {
179 case 'Boolean':
180 if(array_key_exists($Context.$Index, $_POST)) $Values[$Index] = 1;
181 else $Values[$Index] = 0;
182 break;
183 case 'String':
184 $Values[$Index] = $_POST[$Context.$Index];
185 break;
186 case 'Text':
187 $Values[$Index] = $_POST[$Context.$Index];
188 break;
189 case 'Password':
190 $Values[$Index] = $_POST[$Context.$Index];
191 break;
192 case 'Integer':
193 $Values[$Index] = $_POST[$Context.$Index];
194 break;
195 case 'Float':
196 $Values[$Index] = $_POST[$Context.$Index];
197 break;
198 case 'Time':
199 $Values[$Index] = explode('.', $_POST[$Context.$Index]);
200 $Values[$Index] = mktime(0, 0, 0, $Values[$Index][1], $Values[$Index][0], $Values[$Index][2]);
201 break;
202 case 'Array':
203 $I = 1;
204 //echo('Expect: '.$Context.$Item['ItemClass'].'-'.$I.'<br />');
205 while(isset($_POST[$Context.$Item['ItemClass'].'-'.$I]))
206 {
207 $Form = new Form($Item['ItemClass']);
208 $Values[$Index][] = $Form->LoadValuesFromFormBlock($Context.$Item['ItemClass'].'-'.$I);
209 $I++;
210 }
211 break;
212 default:
213 if(array_key_exists($Item['Type'], $FormTypes))
214 {
215 // Custom types
216 switch($FormTypes[$Item['Type']]['Type'])
217 {
218 case 'Enumeration':
219 $Values[$Index] = $_POST[$Context.$Index];
220 break;
221 case 'Reference':
222 $Values[$Index] = $_POST[$Context.$Index];
223 break;
224 default:
225 }
226 }
227 }
228 }
229 return($Values);
230 }
231}
232
233function MakeLink($Target, $Title)
234{
235 return('<a href="'.$Target.'">'.$Title.'</a>');
236}
237
238function Table($Table)
239{
240 $Result = '<table class="BasicTable">';
241 if(array_key_exists('Header', $Table))
242 {
243 $Result .= '<tr>';
244 foreach($Table['Header'] as $Item)
245 $Result .= '<th>'.$Item.'</th>';
246 $Result .= '</tr>';
247 }
248 foreach($Table['Rows'] as $Row)
249 {
250 $Result .= '<tr>';
251 foreach($Row as $Index => $Item)
252 {
253 if($Index == 0) $Class = ' class="Header"'; else $Class = '';
254 $Result .= '<td'.$Class.' style="width: '.(floor(100 / count($Row))).'%">'.$Item.'</td>';
255 }
256 $Result .= '</tr>';
257 }
258 $Result .= '</table>';
259 return($Result);
260}
261
262function ShowEditTable($ClassName, $Values)
263{
264}
265
266?>
Note: See TracBrowser for help on using the repository browser.