Subversion-Projekte lars-tiefland.prado

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
1 lars 1
<?php
2
/**
3
 * TScaffoldInputCommon class file.
4
 *
5
 * @link http://www.pradosoft.com/
6
 * @copyright Copyright &copy; 2005-2008 PradoSoft
7
 * @license http://www.pradosoft.com/license/
8
 * @package System.Data.ActiveReecord.Scaffold.InputBuilder
9
 */
10
Prado::using('System.Data.ActiveRecord.Scaffold.InputBuilder.TScaffoldInputBase');
11
 
12
class TScaffoldInputCommon extends TScaffoldInputBase
13
{
14
	protected function setDefaultProperty($container, $control, $column, $record)
15
	{
16
		$control->setID(self::DEFAULT_ID);
17
		$control->setEnabled($this->getIsEnabled($column, $record));
18
		$container->Controls[] = $control;
19
	}
20
 
21
	protected function setNotNullProperty($container, $control, $column, $record)
22
	{
23
		$this->setDefaultProperty($container, $control, $column, $record);
24
		if(!$column->getAllowNull() && !$column->hasSequence())
25
			$this->createRequiredValidator($container, $column, $record);
26
	}
27
 
28
	protected function createBooleanControl($container, $column, $record)
29
	{
30
		$value = $this->getRecordPropertyValue($column, $record);
31
		$control = new TCheckBox();
32
		$control->setChecked(TPropertyValue::ensureBoolean($value));
33
		$control->setCssClass('boolean-checkbox');
34
		$this->setDefaultProperty($container, $control, $column, $record);
35
		return $control;
36
	}
37
 
38
	protected function createDefaultControl($container, $column, $record)
39
	{
40
		$value = $this->getRecordPropertyValue($column, $record);
41
		$control = new TTextBox();
42
		$control->setText($value);
43
		$control->setCssClass('default-textbox scaffold_input');
44
		if(($len=$column->getColumnSize())!==null)
45
			$control->setMaxLength($len);
46
		$this->setNotNullProperty($container, $control, $column, $record);
47
		return $control;
48
	}
49
 
50
	protected function getDefaultControlValue($container,$column, $record)
51
	{
52
		$control = $container->findControl(self::DEFAULT_ID);
53
		if($control instanceof TCheckBox)
54
			return $control->getChecked();
55
		else if($control instanceof TControl)
56
			return $control->getText();
57
	}
58
 
59
	protected function createMultiLineControl($container, $column, $record)
60
	{
61
		$value = $this->getRecordPropertyValue($column, $record);
62
		$control = new TTextBox();
63
		$control->setText($value);
64
		$control->setTextMode(TTextBoxMode::MultiLine);
65
		$control->setCssClass('multiline-textbox scaffold_input');
66
		$this->setNotNullProperty($container, $control, $column, $record);
67
		return $control;
68
	}
69
 
70
	protected function createYearControl($container, $column, $record)
71
	{
72
		$value = $this->getRecordPropertyValue($column, $record);
73
		$control = new TDropDownList();
74
		$years = array();
75
		$current = intval(@date('Y'));
76
		$from = $current-10; $to=$current+10;
77
		for($i = $from; $i <= $to; $i++)
78
			$years[$i] = $i;
79
		$control->setDataSource($years);
80
		$control->setSelectedValue(empty($value) ? $current : $value);
81
		$control->setCssClass('year-dropdown');
82
		$this->setNotNullProperty($container, $control, $column, $record);
83
		return $control;
84
	}
85
 
86
	protected function createIntegerControl($container, $column, $record)
87
	{
88
		$control = $this->createDefaultControl($container, $column, $record);
89
		$val = $this->createTypeValidator($container, $column, $record);
90
		$val->setDataType(TValidationDataType::Integer);
91
		$val->setErrorMessage('Please entery an integer.');
92
		return $control;
93
	}
94
 
95
	protected function createFloatControl($container, $column, $record)
96
	{
97
		$control = $this->createDefaultControl($container, $column, $record);
98
		$val = $this->createTypeValidator($container, $column, $record);
99
		$val->setDataType(TValidationDataType::Float);
100
		$val->setErrorMessage('Please entery a decimal number.');
101
		if(($max= $column->getMaxiumNumericConstraint())!==null)
102
		{
103
			$val = $this->createRangeValidator($container,$column,$record);
104
			$val->setDataType(TValidationDataType::Float);
105
			$val->setMaxValue($max);
106
			$val->setStrictComparison(true);
107
			$val->setErrorMessage('Please entery a decimal number strictly less than '.$max.'.');
108
		}
109
		return $control;
110
	}
111
 
112
	protected function createRequiredValidator($container, $column, $record)
113
	{
114
		$val = new TRequiredFieldValidator();
115
		$val->setErrorMessage('*');
116
		$val->setControlCssClass('required-input');
117
		$val->setCssClass('required');
118
		$val->setControlToValidate(self::DEFAULT_ID);
119
		$val->setValidationGroup($this->getParent()->getValidationGroup());
120
		$val->setDisplay(TValidatorDisplayStyle::Dynamic);
121
		$container->Controls[] = $val;
122
		return $val;
123
	}
124
 
125
	protected function createTypeValidator($container, $column, $record)
126
	{
127
		$val = new TDataTypeValidator();
128
		$val->setControlCssClass('required-input2');
129
		$val->setCssClass('required');
130
		$val->setControlToValidate(self::DEFAULT_ID);
131
		$val->setValidationGroup($this->getParent()->getValidationGroup());
132
		$val->setDisplay(TValidatorDisplayStyle::Dynamic);
133
		$container->Controls[] = $val;
134
		return $val;
135
	}
136
 
137
	protected function createRangeValidator($container, $column, $record)
138
	{
139
		$val = new TRangeValidator();
140
		$val->setControlCssClass('required-input3');
141
		$val->setCssClass('required');
142
		$val->setControlToValidate(self::DEFAULT_ID);
143
		$val->setValidationGroup($this->getParent()->getValidationGroup());
144
		$val->setDisplay(TValidatorDisplayStyle::Dynamic);
145
		$container->Controls[] = $val;
146
		return $val;
147
	}
148
 
149
	protected function createTimeControl($container, $column, $record)
150
	{
151
		$value = $this->getRecordPropertyValue($column, $record);
152
		$hours=array();
153
		for($i=0;$i<24;$i++) $hours[] = str_pad($i,2,'0',STR_PAD_LEFT);
154
		$mins=array();
155
		for($i=0;$i<60;$i++) $mins[] = str_pad($i,2,'0',STR_PAD_LEFT);
156
		$hour = intval(@date('H'));
157
		$min = intval(@date('i'));
158
		$sec = intval(@date('s'));
159
		if(!empty($value))
160
		{
161
			$match=array();
162
			if(preg_match('/(\d+):(\d+):?(\d+)?/', $value, $match))
163
			{
164
				$hour = $match[1];
165
				$min = $match[2];
166
				if(isset($match[3]))
167
					$sec=$match[3];
168
			}
169
		}
170
 
171
		$hcontrol = new TDropDownList();
172
		$hcontrol->setDataSource($hours);
173
		$hcontrol->setID(self::DEFAULT_ID);
174
		$hcontrol->dataBind();
175
		$hcontrol->setSelectedValue(intval($hour));
176
		$container->Controls[] = $hcontrol;
177
		$container->Controls[] = ' : ';
178
 
179
		$mcontrol = new TDropDownList();
180
		$mcontrol->setDataSource($mins);
181
		$mcontrol->dataBind();
182
		$mcontrol->setID('scaffold_time_min');
183
		$mcontrol->setSelectedValue(intval($min));
184
		$container->Controls[] = $mcontrol;
185
		$container->Controls[] = ' : ';
186
 
187
		$scontrol = new TDropDownList();
188
		$scontrol->setDataSource($mins);
189
		$scontrol->dataBind();
190
		$scontrol->setID('scaffold_time_sec');
191
		$scontrol->setSelectedValue(intval($sec));
192
		$container->Controls[] = $scontrol;
193
 
194
		return array($hcontrol,$mcontrol,$scontrol);
195
	}
196
 
197
 
198
	protected function createDateControl($container, $column, $record)
199
	{
200
		$value = $this->getRecordPropertyValue($column, $record);
201
		$control = new TDatePicker();
202
		$control->setFromYear(1900);
203
		$control->setInputMode(TDatePickerInputMode::DropDownList);
204
		$control->setDateFormat('yyyy-MM-dd');
205
		if(!empty($value))
206
			$control->setDate(substr($value,0,10));
207
		$control->setCssClass('date-dropdown');
208
		$this->setNotNullProperty($container, $control, $column, $record);
209
		return $control;
210
	}
211
 
212
	protected function createDateTimeControl($container, $column, $record)
213
	{
214
		$value = $this->getRecordPropertyValue($column, $record);
215
		$control = $this->createDateControl($container, $column, $record);
216
		$container->Controls[] = ' @ ';
217
		$time = $this->createTimeControl($container, $column, $record);
218
		if(!empty($value))
219
		{
220
			$match=array();
221
			if(preg_match('/(\d+):(\d+):?(\d+)?/', substr($value, 11), $match))
222
			{
223
				$time[0]->setSelectedValue(intval($match[1]));
224
				$time[1]->setSelectedValue(intval($match[2]));
225
				if(isset($match[3]))
226
					$time[2]->setSelectedValue(intval($match[3]));
227
			}
228
		}
229
		$time[0]->setID('scaffold_time_hour');
230
		return array($control, $time[0], $time[1], $time[2]);
231
	}
232
 
233
	protected function getDateTimeValue($container, $column, $record)
234
	{
235
		$date = $container->findControl(self::DEFAULT_ID)->getDate();
236
		$hour = $container->findControl('scaffold_time_hour')->getSelectedValue();
237
		$mins = $container->findControl('scaffold_time_min')->getSelectedValue();
238
		$secs = $container->findControl('scaffold_time_sec')->getSelectedValue();
239
		return "{$date} {$hour}:{$mins}:{$secs}";
240
	}
241
 
242
	protected function getTimeValue($container, $column, $record)
243
	{
244
		$hour = $container->findControl(self::DEFAULT_ID)->getSelectedValue();
245
		$mins = $container->findControl('scaffold_time_min')->getSelectedValue();
246
		$secs = $container->findControl('scaffold_time_sec')->getSelectedValue();
247
		return "{$hour}:{$mins}:{$secs}";
248
	}
249
 
250
	protected function createSetControl($container, $column, $record)
251
	{
252
		$value = $this->getRecordPropertyValue($column, $record);
253
		$selectedValues = preg_split('/\s*,\s*/', $value);
254
		$control = new TCheckBoxList();
255
		$values = $column->getDbTypeValues();
256
		$control->setDataSource($values);
257
		$control->dataBind();
258
		$control->setSelectedIndices($this->getMatchingIndices($values,$selectedValues));
259
		$control->setID(self::DEFAULT_ID);
260
		$control->setCssClass('set-checkboxes');
261
		$this->setNotNullProperty($container, $control, $column, $record);
262
		return $control;
263
	}
264
 
265
	protected function getMatchingIndices($checks, $values)
266
	{
267
		$index=array();
268
		for($i=0, $k=count($checks); $i<$k; $i++)
269
		{
270
			if(in_array($checks[$i], $values))
271
				$index[] = $i;
272
		}
273
		return $index;
274
	}
275
 
276
	protected function createEnumControl($container, $column, $record)
277
	{
278
		$value = $this->getRecordPropertyValue($column, $record);
279
		$selectedValues = preg_split('/\s*,\s*/', $value);
280
		$control = new TRadioButtonList();
281
		$values = $column->getDbTypeValues();
282
		$control->setDataSource($values);
283
		$control->dataBind();
284
		$index = $this->getMatchingIndices($values,$selectedValues);
285
		if(count($index) > 0)
286
			$control->setSelectedIndex($index[0]);
287
		$control->setID(self::DEFAULT_ID);
288
		$control->setCssClass('enum-radio-buttons');
289
		$this->setNotNullProperty($container, $control, $column, $record);
290
		return $control;
291
	}
292
 
293
	protected function getSetValue($container, $column, $record)
294
	{
295
		$value=array();
296
		foreach($container->findControl(self::DEFAULT_ID)->getItems() as $item)
297
		{
298
			if($item->getSelected())
299
				$value[] = $item->getText();
300
		}
301
		return implode(',', $value);
302
	}
303
 
304
	protected function getEnumValue($container, $column, $record)
305
	{
306
		return $container->findControl(self::DEFAULT_ID)->getSelectedItem()->getText();
307
	}
308
}
309