00001 <?php
00010 class form_db extends form {
00011
00019 public function addFromField(array $field, $isI18n=false) {
00020 $prm = $this->getFromFieldPrm($field);
00021 return $this->add($prm['type'], $prm, $isI18n);
00022 }
00023
00029 public function addFromRelated(array $related) {
00030 $prm = array(
00031 'dbList'=>$related['fk2']['link'],
00032 'name'=>$related['name'],
00033 'label'=>$related['label'],
00034 'valid'=>array_key_exists('valid', $related)? $related['valid'] : false
00035 );
00036 if (isset($related['comment']) && is_array($related['comment']))
00037 $prm = array_merge($prm, $related['comment']);
00038 $prm['dbList']['fields'] = $related['fk2']['link']['ident'].
00039 ($prm['dbList']['fields']? ','.$prm['dbList']['fields'] : null);
00040 $type = 'checkbox';
00041 if (isset($related['fields']) && count($related['fields'])) {
00042 $type = 'checkbox_fields';
00043 $prm['table'] = $related['tableObj'];
00044 $prm['fields'] = $related['fields'];
00045 }
00046 if (count($prm['dbList']['fields'])) {
00047 $tmp = array();
00048 foreach(explode(',', $prm['dbList']['fields']) as $f) {
00049 if ($f != $prm['dbList']['ident']) {
00050 $tmp[] = $f;
00051 }
00052 }
00053 if (count($tmp))
00054 $prm['dbList']['order'] = implode(' ASC, ', $tmp).' ASC';
00055 }
00056 if (array_key_exists('formType', $related) && $related['formType'])
00057 $type = $related['formType'];
00058 return $this->add($type, $prm);
00059 }
00060
00067 public function addFromFieldFilter(array $field) {
00068 $saveAutoValidRule = $this->cfg->autoValidRule;
00069 $this->cfg->autoValidRule = array();
00070 if (isset($field['formTypeFilter'])) {
00071 $field['formType'] = $field['formTypeFilter'];
00072 } else if (isset($field['formType'])) {
00073 unset($field['formType']);
00074 }
00075 $prm = $this->getFromFieldPrm($field);
00076 $this->cfg->autoValidRule = $saveAutoValidRule;
00077 unset($prm['value']);
00078 switch($prm['type']) {
00079 case 'multiline':
00080 case 'richtext':
00081 $prm['type'] = 'text';
00082 break;
00083 case 'date':
00084 case 'datetime':
00085 $prm['type'] = 'range_date';
00086 break;
00087 case 'radio':
00088 if ($field['type'] == 'tinyint')
00089 $prm['list'] += array('-1'=>$this->cfg->all);
00090 else
00091 $prm['type'] = 'checkbox';
00092 $prm['valueNone'] = -1;
00093 $prm['value'] = -1;
00094 break;
00095 case 'list':
00096 $prm['list'] += array('-1'=>$this->cfg->all);
00097 $prm['valueNone'] = -1;
00098 $prm['value'] = -1;
00099 break;
00100 case 'file':
00101 $prm['type'] = 'checkbox';
00102 $prm['list'] = array('1'=>$this->cfg->getInArray('listBool', 1));
00103 $prm['uniqValue'] = true;
00104 break;
00105 case 'numeric':
00106 $prm['type'] = 'range_numeric';
00107 $prm['valid']['validEltArray'] = true;
00108 $prm['allowedRange'] = $this->cfg->table->getRange($prm['name']);
00109 break;
00110 }
00111 $prm['valid']['required'] = false;
00112 $prm['valid']['dbUnique'] = false;
00113 return $this->add($prm['type'], $prm);
00114 }
00115
00121 public function addFromRelatedFilter(array $related) {
00122 $prm = array(
00123 'dbList'=>$related['fk2']['link'],
00124 'name'=>$related['name'],
00125 'label'=>$related['label'],
00126 'valid'=>array_key_exists('valid', $related)? $related['valid'] : false
00127 );
00128 $prm['dbList']['fields'] = $related['fk2']['link']['ident'].
00129 ($prm['dbList']['fields']? ','.$prm['dbList']['fields'] : null);
00130 $type = 'checkbox';
00131 if (count($prm['dbList']['fields'])) {
00132 $tmp = array();
00133 foreach(explode(',', $prm['dbList']['fields']) as $f) {
00134 if ($f != $prm['dbList']['ident']) {
00135 $tmp[] = $f;
00136 }
00137 }
00138 if (count($tmp))
00139 $prm['dbList']['order'] = implode(' ASC, ', $tmp).' ASC';
00140 }
00141 if (array_key_exists('formTypeFilter', $related) && $related['formTypeFilter'])
00142 $type = $related['formTypeFilter'];
00143 return $this->add($type, $prm);
00144 }
00145
00152 public function getFromFieldPrm(array $field) {
00153 $ret = array();
00154 $prm = array_merge(array(
00155 'name'=>$field['name'],
00156 'label'=>$field['label'],
00157 'value'=>array_key_exists('value', $field)? $field['value'] : $field['default'],
00158 'link'=>array_key_exists('link', $field)? $field['link'] : null,
00159 'valid'=>array('required'=>$field['required'])
00160 ), $field['comment']);
00161
00162 if ($field['unique'] && ! array_key_exists('dbUnique', $prm['valid'])) {
00163 $prm['valid']['dbUnique'] = array(
00164 'table'=>$this->cfg->table,
00165 'field'=>$field['name'],
00166 'value'=>$prm['value']
00167 );
00168 }
00169 if (array_search($field['name'], $this->cfg->autoValidRule) !== false && !array_key_exists($field['name'], $prm['valid']))
00170 $prm['valid'][$field['name']] = true;
00171
00172 if (array_search('hidden', $field['comment'], true) !== false)
00173 $ret = array_merge($prm, array('type'=>'hidden'));
00174 else {
00175 if (!empty($field['link'])) {
00176 $checkType = false;
00177 $type = 'list';
00178 $prm['list'] = $field['link']['list'];
00179 $prm['valueNone'] = 0;
00180 $fields = null;
00181 $order = null;
00182 $join = null;
00183 if ($field['link']['fields']) {
00184 $linkedTable = db::get('table', $field['link']['table'], array(
00185 'db'=>$this->cfg->table->getDb()
00186 ));
00187 $tmp = array();
00188 foreach(explode(',', $field['link']['fields']) as $t) {
00189 if ($linkedInfo = $linkedTable->getLinkedTableName($t)) {
00190 $alias = $field['name'].'_'.$linkedInfo['table'];
00191 $join[] = array(
00192 'table'=>$linkedInfo['table'],
00193 'alias'=>$alias,
00194 'dir'=>'left outer',
00195 'on'=>$field['link']['table'].'.'.$linkedInfo['field'].'='.$alias.'.'.$linkedInfo['ident']
00196 );
00197 $ttmp = array();
00198 foreach(explode(',', $linkedInfo['fields']) as $tt) {
00199 $ttmp[] = $alias.'.'.$tt;
00200 $ttmp[] = '"'.$linkedInfo['sep'].'"';
00201 }
00202 array_pop($ttmp);
00203 $tmp[] = 'CONCAT('.implode(',', $ttmp).')';
00204 } else
00205 $tmp[] = $field['link']['table'].'.'.$t;
00206 }
00207 $fields.= ','.implode(',', $tmp);
00208 $order = implode(' ASC, ', $tmp).' ASC';
00209 }
00210 $prm['dbList'] = array(
00211 'fields'=>$field['link']['table'].'.'.$field['link']['ident'].$fields,
00212 'i18nFields'=>$field['link']['i18nFields'],
00213 'ident'=>$field['link']['ident'],
00214 'table'=>$field['link']['table'],
00215 'join'=>$join,
00216 'sep'=>$field['link']['sep'],
00217 'where'=>$field['link']['where'],
00218 'order'=>$order,
00219 'sepGr'=>$field['link']['sepGr'],
00220 'nbFieldGr'=>$field['link']['nbFieldGr']
00221 );
00222 $ret = array_merge($prm, array('type'=>$type));
00223 } else {
00224 switch($field['type']) {
00225 case 'set':
00226 case 'enum':
00227 $type = 'radio';
00228 $prm['list'] = $field['precision'];
00229 $prm['needOut'] = true;
00230 break;
00231 case 'date':
00232 $type = 'date';
00233 $prm['valid']['different'] = '0000-00-00';
00234 break;
00235 case 'datetime':
00236 case 'timestamp':
00237 $type = 'datetime';
00238 $prm['valid']['different'] = '0000-00-00 00:00:00';
00239 break;
00240 case 'text':
00241 case 'blob':
00242 case 'tinytext':
00243 case 'tinyblob':
00244 case 'mediumtext':
00245 case 'mediumblob':
00246 case 'longtext':
00247 case 'longblob':
00248 $key = array_search('richtext', $field['comment']);
00249 if ($key !== false) {
00250 $type = 'richtext';
00251 unset($field['comment'][$key]);
00252 $prm['html'] = $field['comment'];
00253 if (array_key_exists('html', $prm['html'])) {
00254 $prm['html'] = array_merge_recursive($prm['html'], $prm['html']['html']);
00255 unset($prm['html']['html']);
00256 }
00257 if (array_key_exists('tinyMce', $field))
00258 $prm['tinyMce'] = $field['tinyMce'];
00259 unset($prm['html']['tinyMce']);
00260 } else {
00261 $type = 'multiline';
00262 $prm['maxlength'] = $field['length'];
00263 }
00264 break;
00265 case 'bool':
00266 case 'boolean':
00267 case 'tinyint':
00268 $type = 'radio';
00269 $prm['list'] = $this->cfg->listBool;
00270 $prm['inline'] = true;
00271 if ($field['type'] != 'tinyint' || ($field['type'] == 'tinyint' && $field['length'] == 1)) {
00272 $prm['valid']['required'] = false;
00273 break;
00274 }
00275 case 'year':
00276 case 'bigint':
00277 case 'mediumint':
00278 case 'smallint':
00279 case 'int':
00280 $type = 'numeric';
00281 $prm['maxlength'] = $field['length'];
00282 $prm['valid']['int'] = true;
00283 break;
00284 case 'decimal':
00285 case 'float':
00286 case 'double':
00287 case 'decimal':
00288 case 'dec':
00289 case 'numeric':
00290 case 'fixed':
00291 $type = 'numeric';
00292 $prm['maxlength'] = $field['precision']? $field['length']+1 : $field['length'];
00293 $prm['valid']['numeric'] = true;
00294 break;
00295 case 'file':
00296 $type = 'file';
00297 if (count($field['comment']) == 1 && array_key_exists(0, $field['comment']))
00298 $prm['helper'] = $field['comment'][0];
00299 else
00300 $prm = array_merge($prm, $field['comment']);
00301 break;
00302 default:
00303 $type = array_key_exists(0, $field['comment']) && !empty($field['comment'][0])? $field['comment'][0] : 'text';
00304 $prm['maxlength'] = $field['length'];
00305 }
00306
00307 $ret = array_merge($prm, array('type'=>$type));
00308 }
00309 }
00310 if (array_key_exists('formType', $field) && $field['formType'])
00311 $ret['type'] = $field['formType'];
00312 return $ret;
00313 }
00314
00315 }