setID(self::DEFAULT_ID); $control->setEnabled($this->getIsEnabled($column, $record)); $container->Controls[] = $control; } protected function setNotNullProperty($container, $control, $column, $record) { $this->setDefaultProperty($container, $control, $column, $record); if(!$column->getAllowNull() && !$column->hasSequence()) $this->createRequiredValidator($container, $column, $record); } protected function createBooleanControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $control = new TCheckBox(); $control->setChecked(TPropertyValue::ensureBoolean($value)); $control->setCssClass('boolean-checkbox'); $this->setDefaultProperty($container, $control, $column, $record); return $control; } protected function createDefaultControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $control = new TTextBox(); $control->setText($value); $control->setCssClass('default-textbox scaffold_input'); if(($len=$column->getColumnSize())!==null) $control->setMaxLength($len); $this->setNotNullProperty($container, $control, $column, $record); return $control; } protected function getDefaultControlValue($container,$column, $record) { $control = $container->findControl(self::DEFAULT_ID); if($control instanceof TCheckBox) return $control->getChecked(); else if($control instanceof TControl) return $control->getText(); } protected function createMultiLineControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $control = new TTextBox(); $control->setText($value); $control->setTextMode(TTextBoxMode::MultiLine); $control->setCssClass('multiline-textbox scaffold_input'); $this->setNotNullProperty($container, $control, $column, $record); return $control; } protected function createYearControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $control = new TDropDownList(); $years = array(); $current = intval(@date('Y')); $from = $current-10; $to=$current+10; for($i = $from; $i <= $to; $i++) $years[$i] = $i; $control->setDataSource($years); $control->setSelectedValue(empty($value) ? $current : $value); $control->setCssClass('year-dropdown'); $this->setNotNullProperty($container, $control, $column, $record); return $control; } protected function createIntegerControl($container, $column, $record) { $control = $this->createDefaultControl($container, $column, $record); $val = $this->createTypeValidator($container, $column, $record); $val->setDataType(TValidationDataType::Integer); $val->setErrorMessage('Please entery an integer.'); return $control; } protected function createFloatControl($container, $column, $record) { $control = $this->createDefaultControl($container, $column, $record); $val = $this->createTypeValidator($container, $column, $record); $val->setDataType(TValidationDataType::Float); $val->setErrorMessage('Please entery a decimal number.'); if(($max= $column->getMaxiumNumericConstraint())!==null) { $val = $this->createRangeValidator($container,$column,$record); $val->setDataType(TValidationDataType::Float); $val->setMaxValue($max); $val->setStrictComparison(true); $val->setErrorMessage('Please entery a decimal number strictly less than '.$max.'.'); } return $control; } protected function createRequiredValidator($container, $column, $record) { $val = new TRequiredFieldValidator(); $val->setErrorMessage('*'); $val->setControlCssClass('required-input'); $val->setCssClass('required'); $val->setControlToValidate(self::DEFAULT_ID); $val->setValidationGroup($this->getParent()->getValidationGroup()); $val->setDisplay(TValidatorDisplayStyle::Dynamic); $container->Controls[] = $val; return $val; } protected function createTypeValidator($container, $column, $record) { $val = new TDataTypeValidator(); $val->setControlCssClass('required-input2'); $val->setCssClass('required'); $val->setControlToValidate(self::DEFAULT_ID); $val->setValidationGroup($this->getParent()->getValidationGroup()); $val->setDisplay(TValidatorDisplayStyle::Dynamic); $container->Controls[] = $val; return $val; } protected function createRangeValidator($container, $column, $record) { $val = new TRangeValidator(); $val->setControlCssClass('required-input3'); $val->setCssClass('required'); $val->setControlToValidate(self::DEFAULT_ID); $val->setValidationGroup($this->getParent()->getValidationGroup()); $val->setDisplay(TValidatorDisplayStyle::Dynamic); $container->Controls[] = $val; return $val; } protected function createTimeControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $hours=array(); for($i=0;$i<24;$i++) $hours[] = str_pad($i,2,'0',STR_PAD_LEFT); $mins=array(); for($i=0;$i<60;$i++) $mins[] = str_pad($i,2,'0',STR_PAD_LEFT); $hour = intval(@date('H')); $min = intval(@date('i')); $sec = intval(@date('s')); if(!empty($value)) { $match=array(); if(preg_match('/(\d+):(\d+):?(\d+)?/', $value, $match)) { $hour = $match[1]; $min = $match[2]; if(isset($match[3])) $sec=$match[3]; } } $hcontrol = new TDropDownList(); $hcontrol->setDataSource($hours); $hcontrol->setID(self::DEFAULT_ID); $hcontrol->dataBind(); $hcontrol->setSelectedValue(intval($hour)); $container->Controls[] = $hcontrol; $container->Controls[] = ' : '; $mcontrol = new TDropDownList(); $mcontrol->setDataSource($mins); $mcontrol->dataBind(); $mcontrol->setID('scaffold_time_min'); $mcontrol->setSelectedValue(intval($min)); $container->Controls[] = $mcontrol; $container->Controls[] = ' : '; $scontrol = new TDropDownList(); $scontrol->setDataSource($mins); $scontrol->dataBind(); $scontrol->setID('scaffold_time_sec'); $scontrol->setSelectedValue(intval($sec)); $container->Controls[] = $scontrol; return array($hcontrol,$mcontrol,$scontrol); } protected function createDateControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $control = new TDatePicker(); $control->setFromYear(1900); $control->setInputMode(TDatePickerInputMode::DropDownList); $control->setDateFormat('yyyy-MM-dd'); if(!empty($value)) $control->setDate(substr($value,0,10)); $control->setCssClass('date-dropdown'); $this->setNotNullProperty($container, $control, $column, $record); return $control; } protected function createDateTimeControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $control = $this->createDateControl($container, $column, $record); $container->Controls[] = ' @ '; $time = $this->createTimeControl($container, $column, $record); if(!empty($value)) { $match=array(); if(preg_match('/(\d+):(\d+):?(\d+)?/', substr($value, 11), $match)) { $time[0]->setSelectedValue(intval($match[1])); $time[1]->setSelectedValue(intval($match[2])); if(isset($match[3])) $time[2]->setSelectedValue(intval($match[3])); } } $time[0]->setID('scaffold_time_hour'); return array($control, $time[0], $time[1], $time[2]); } protected function getDateTimeValue($container, $column, $record) { $date = $container->findControl(self::DEFAULT_ID)->getDate(); $hour = $container->findControl('scaffold_time_hour')->getSelectedValue(); $mins = $container->findControl('scaffold_time_min')->getSelectedValue(); $secs = $container->findControl('scaffold_time_sec')->getSelectedValue(); return "{$date} {$hour}:{$mins}:{$secs}"; } protected function getTimeValue($container, $column, $record) { $hour = $container->findControl(self::DEFAULT_ID)->getSelectedValue(); $mins = $container->findControl('scaffold_time_min')->getSelectedValue(); $secs = $container->findControl('scaffold_time_sec')->getSelectedValue(); return "{$hour}:{$mins}:{$secs}"; } protected function createSetControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $selectedValues = preg_split('/\s*,\s*/', $value); $control = new TCheckBoxList(); $values = $column->getDbTypeValues(); $control->setDataSource($values); $control->dataBind(); $control->setSelectedIndices($this->getMatchingIndices($values,$selectedValues)); $control->setID(self::DEFAULT_ID); $control->setCssClass('set-checkboxes'); $this->setNotNullProperty($container, $control, $column, $record); return $control; } protected function getMatchingIndices($checks, $values) { $index=array(); for($i=0, $k=count($checks); $i<$k; $i++) { if(in_array($checks[$i], $values)) $index[] = $i; } return $index; } protected function createEnumControl($container, $column, $record) { $value = $this->getRecordPropertyValue($column, $record); $selectedValues = preg_split('/\s*,\s*/', $value); $control = new TRadioButtonList(); $values = $column->getDbTypeValues(); $control->setDataSource($values); $control->dataBind(); $index = $this->getMatchingIndices($values,$selectedValues); if(count($index) > 0) $control->setSelectedIndex($index[0]); $control->setID(self::DEFAULT_ID); $control->setCssClass('enum-radio-buttons'); $this->setNotNullProperty($container, $control, $column, $record); return $control; } protected function getSetValue($container, $column, $record) { $value=array(); foreach($container->findControl(self::DEFAULT_ID)->getItems() as $item) { if($item->getSelected()) $value[] = $item->getText(); } return implode(',', $value); } protected function getEnumValue($container, $column, $record) { return $container->findControl(self::DEFAULT_ID)->getSelectedItem()->getText(); } }