PageRenderTime 206ms CodeModel.GetById 25ms RepoModel.GetById 53ms app.codeStats 0ms

/lib/FORM_DynTable.inc

https://bitbucket.org/joaoborsoi/avalanche
PHP | 2707 lines | 2214 code | 382 blank | 111 comment | 415 complexity | 1a185d6c9d288c8367261bdb43aab11d MD5 | raw file

Large files files are truncated, but you can click here to view the full file

  1. <?php
  2. require_once('LANG_Label.inc');
  3. require_once('FORM_Object.inc');
  4. require_once('AV_ModObject.inc');
  5. require_once('LIB_Document.inc');
  6. require_once('AV_Exception.inc');
  7. require_once('FORM_LexAnalyzer.inc');
  8. require_once('AV_ArrayObject.inc');
  9. require_once('AV_FaultTolerantFS.inc');
  10. //--Class: FORM_DynTable
  11. //--Desc: Manages dynamic tables. Dynamic table have property tables
  12. //--Desc: associated.
  13. class FORM_DynTable
  14. {
  15. protected $table; //--Desc: Table's name
  16. protected $dbDriver; //--Desc: Database driver handler
  17. protected $module; //--Desc: Module's handler
  18. protected $pageBuilder;
  19. protected $fieldsDef; //--Desc: Keeps dynamic table fields
  20. //--Desc: definition
  21. protected $keyFields;
  22. protected $oldValues; //--Desc: Array of old values kept
  23. //--Desc: after an update
  24. protected $formulaFieldsDef;
  25. protected $formulas;
  26. protected $formulaType;
  27. protected $lang;
  28. private $lockedField;
  29. //
  30. //--Public
  31. //
  32. function __construct($table, &$module)
  33. {
  34. $this->table = $table;
  35. $this->module = & $module;
  36. $this->lang = $module->pageBuilder->lang;
  37. $this->pageBuilder = & $this->module->pageBuilder;
  38. $this->dbDriver = & $module->dbDriver;
  39. $this->lockedField = NULL;
  40. $this->fieldsDef = NULL;
  41. $this->formulaFieldsDef = NULL;
  42. $this->keyFields = array();
  43. }
  44. function GetReadableFields()
  45. {
  46. // Find readble fields
  47. $SQL = 'SELECT fieldName FROM FORM_Field ';
  48. $SQL .= "WHERE (accessMode = 'r' OR accessMode = 'rw') ";
  49. $SQL .= "AND tableName ='". $this->table ."' AND ";
  50. $SQL .= "type <> 'selectMult' ";
  51. return $this->dbDriver->GetCol($SQL);
  52. }
  53. function LoadFieldsDef($disableFileRequired = false,$disableRequired = false)
  54. {
  55. // prevents fieldsdef reload
  56. if($this->fieldsDef != NULL)
  57. return $this->fieldsDef;
  58. // load fieldsdef from database
  59. $fieldsDef = $this->GetFieldsDef();
  60. // prepare fieldsDef
  61. foreach($fieldsDef as & $fieldDef)
  62. $this->ParseFieldDef($fieldDef,$disableFileRequired,$disableRequired);
  63. return $this->fieldsDef;
  64. }
  65. function Duplicate($sourceKey, $fields, $extraFields = array())
  66. {
  67. // do insertion
  68. $SQL = "INSERT INTO " . $this->table . " (";
  69. $first = true;
  70. foreach($this->fieldsDef as $field)
  71. {
  72. if ($field['keyField'] != 1)
  73. {
  74. if (strpos($field['accessMode'],'w')!==false &&
  75. ((isset($field['list']) && !$field['list']) ||
  76. !isset($field['list'])) &&
  77. $field['type'] != 'selectMult' &&
  78. $field['type'] != 'descr')
  79. {
  80. if(!$first)
  81. {
  82. $SQL .= ', ';
  83. $VALS .= ', ';
  84. }
  85. $first = false;
  86. if($field['type'] == 'file')
  87. {
  88. $SQL .= $field['fieldName'].'FileName, ';
  89. $SQL .= $field['fieldName'].'Type, ';
  90. $VALS .= $field['fieldName'].'FileName, ';
  91. $VALS .= $field['fieldName'].'Type, ';
  92. }
  93. $SQL .= $field['fieldName'];
  94. if(isset($fields[$field['fieldName']]))
  95. $VALS .= "'".$fields[$field['fieldName']]."'";
  96. else
  97. $VALS .= $field['fieldName'];
  98. }
  99. }
  100. else
  101. {
  102. if(isset($fields[$field['fieldName']]))
  103. {
  104. if(!$first)
  105. {
  106. $SQL .= ', ';
  107. $VALS .= ', ';
  108. }
  109. $first = false;
  110. $SQL .= $field['fieldName'];
  111. $VALS .= "'".$fields[$field['fieldName']]."'";
  112. }
  113. }
  114. }
  115. foreach($extraFields as $key => $field)
  116. {
  117. if(!$first)
  118. {
  119. $SQL .= ', ';
  120. $VALS .= ', ';
  121. }
  122. $first = false;
  123. $SQL .= $key;
  124. $VALS .= "$field";
  125. }
  126. $SQL .= ") SELECT " . $VALS;
  127. $SQL .= " FROM " . $this->table;
  128. $SQL .= " WHERE ".$sourceKey['fieldName']."='".$sourceKey['fieldValue']."'";
  129. $this->dbDriver->ExecSQL($SQL);
  130. foreach($this->fieldsDef as $field)
  131. {
  132. switch($field['type'])
  133. {
  134. case "selectMult":
  135. case "selectMultiple":
  136. $this->DuplicateOptions($sourceKey,$field);
  137. break;
  138. case "fileList":
  139. $this->DuplicateFileList($sourceKey,$field);
  140. break;
  141. case "emailList":
  142. $this->DuplicateEmailList($sourceKey,$field);
  143. break;
  144. case "langLabel":
  145. case "langTextArea":
  146. case "langHtmlArea":
  147. $this->DuplicateLabel($sourceKey,$field);
  148. break;
  149. }
  150. }
  151. }
  152. function Insert(& $fields, $extraFields = array())
  153. {
  154. // checks for violated fields
  155. $this->CheckIndexes($fields);
  156. // prevents locale problems inserting float fields
  157. setlocale(LC_ALL, 'en_US');
  158. // do insertion
  159. $SQL = "INSERT INTO " . $this->table . " (";
  160. $first = true;
  161. $fileFields = array();
  162. foreach($this->fieldsDef as $field)
  163. {
  164. if ($field['keyField'] != 1)
  165. {
  166. if($field['type'] == 'file' &&
  167. $fields[$field['fieldName']]['error']==UPLOAD_ERR_OK &&
  168. $fields[$field['fieldName']]['tmp_name'] != NULL)
  169. {
  170. $this->SetFile($field,$fields[$field['fieldName']],$extraFields);
  171. if($this->dbDriver->type=='oracle')
  172. $fileFields[] = $field['fieldName'];
  173. }
  174. if (strpos($field['accessMode'],'w')!==false &&
  175. ((isset($field['list']) && !$field['list']) ||
  176. !isset($field['list'])) &&
  177. $field['type'] != 'selectMult' &&
  178. $field['type'] != 'descr' &&
  179. $fields[$field['fieldName']] !== NULL &&
  180. $fields[$field['fieldName']] !== '')
  181. {
  182. if(!$first)
  183. {
  184. $SQL .= ', ';
  185. $VALS .= ', ';
  186. }
  187. $first = false;
  188. $SQL .= $field['fieldName'];
  189. if(($field['type'] == 'select' ||
  190. $field['type'] == 'readOnlySelect')
  191. && (! isset($fields[$field['fieldName']]) ||
  192. $fields[$field['fieldName']] === 0 ||
  193. $fields[$field['fieldName']] === NULL))
  194. $VALS .= 'NULL';
  195. else
  196. {
  197. if($field['maxValue']!=NULL && $fields[$field['fieldName']] > $field['maxValue'])
  198. $VALS .= "'" .$field['maxValue']. "'";
  199. elseif($field['minValue']!=NULL && $fields[$field['fieldName']] < $field['minValue'])
  200. $VALS .= "'" .$field['minValue']. "'";
  201. else
  202. $VALS .= "'" . $fields[$field['fieldName']]. "'";
  203. }
  204. }
  205. }
  206. else
  207. {
  208. $fieldKey = $field['fieldName'];
  209. }
  210. }
  211. foreach($extraFields as $key => $field)
  212. {
  213. if(!$first)
  214. {
  215. $SQL .= ', ';
  216. $VALS .= ', ';
  217. }
  218. $first = false;
  219. $SQL .= $key;
  220. $VALS .= "$field";
  221. }
  222. // reverts default locale
  223. setlocale(LC_ALL, $this->lang.'.utf8');
  224. $SQL .= ") VALUES (" . $VALS . ")";
  225. if($this->dbDriver->type=='oracle' && count($fileFields)>0)
  226. {
  227. foreach($fileFields as $key=>$file)
  228. {
  229. if($key>0)
  230. {
  231. $FIELDS .= ',';
  232. $VARS .= ',';
  233. }
  234. $FIELDS .= $file;
  235. $VARS .= ':'.$file;
  236. $this->dbDriver->BindBlob($file,$fields[$file]['content']);
  237. }
  238. $SQL .= 'RETURNING '.$FIELDS;
  239. $SQL .= ' INTO '.$VARS;
  240. }
  241. $this->dbDriver->ExecSQL($SQL);
  242. // determine key value
  243. if($fields[$fieldKey]!=NULL)
  244. $keyValue = $fields[$fieldKey];
  245. elseif($extraFields[$fieldKey]!=NULL)
  246. $keyValue = $extraFields[$fieldKey];
  247. else
  248. $keyValue = 'LAST_INSERT_ID()';
  249. foreach($this->fieldsDef as $field)
  250. {
  251. switch($field['type'])
  252. {
  253. case "selectMult":
  254. $this->SetOptions($fields[$field['fieldName']], $field,
  255. $keyValue,$fieldKey);
  256. break;
  257. case "selectMultiple":
  258. $this->SetSelectMultiple($fields[$field['fieldName']], $field,
  259. $keyValue,$fieldKey);
  260. break;
  261. case "fileList":
  262. $this->SetFileList($fields[$field['fieldName']],$field,
  263. $keyValue);
  264. break;
  265. case "objectList":
  266. $this->SetObjectList($fields[$field['fieldName']],$field,
  267. $keyValue,$fieldKey,true);
  268. break;
  269. case "emailList":
  270. $this->SetEmailList($fields[$field['fieldName']],$field,
  271. $keyValue);
  272. break;
  273. case 'schedule':
  274. $this->SetSchedule($fields[$field['fieldName']], $field,
  275. $keyValue,$fieldKey);
  276. break;
  277. case "langLabel":
  278. case "langTextArea":
  279. case "langHtmlArea":
  280. $this->SetLabel($field, $fields[$field['fieldName']], $keyValue,
  281. $fieldKey);
  282. break;
  283. }
  284. }
  285. }
  286. function Set($fields, $extraFields = array())
  287. {
  288. // checks for violated fields
  289. $this->CheckIndexes($fields);
  290. // prevents locale problems inserting float fields
  291. setlocale(LC_ALL, 'en_US');
  292. $blobToFS = $this->pageBuilder->siteConfig->getVar('admin','blobToFS');
  293. // do update operation
  294. $SQL = "UPDATE " . $this->table . " SET ";
  295. $WHERE .= ' WHERE ';
  296. $first = true;
  297. $firstWhere = true;
  298. $fileFields = array();
  299. foreach($this->fieldsDef as $field)
  300. {
  301. if($field['type'] == 'file' &&
  302. $fields[$field['fieldName']]['error']==UPLOAD_ERR_OK &&
  303. $fields[$field['fieldName']]['tmp_name'] != NULL)
  304. {
  305. $this->SetFile($field,$fields[$field['fieldName']],$extraFields);
  306. if($this->dbDriver->type=='oracle' || $blobToFS)
  307. $fileFields[] = $field['fieldName'];
  308. }
  309. if($field['keyField'] == '0')
  310. {
  311. if (strpos($field['accessMode'],'w')!==false &&
  312. ((isset($field['list']) && !$field['list']) ||
  313. !isset($field['list'])) &&
  314. $field['type'] != 'selectMult' &&
  315. $field['type'] != 'descr')
  316. {
  317. if($fields[$field['fieldName']] !== NULL)
  318. {
  319. if(!$first)
  320. $SQL .= ', ';
  321. else
  322. $first = false;
  323. $SQL .= $field['fieldName'] . " = ";
  324. if($fields[$field['fieldName']] === '')
  325. $SQL .= 'NULL';
  326. else
  327. {
  328. if($field['maxValue']!=NULL && $fields[$field['fieldName']] > $field['maxValue'])
  329. $SQL .= "'" .$field['maxValue']. "'";
  330. elseif($field['minValue']!=NULL && $fields[$field['fieldName']] < $field['minValue'])
  331. $SQL .= "'" .$field['minValue']. "'";
  332. else
  333. $SQL .= "'" . $fields[$field['fieldName']] . "'";
  334. }
  335. }
  336. }
  337. }
  338. else
  339. {
  340. $fieldKey = $field['fieldName'];
  341. $fieldName = $field['fieldName'];
  342. if(!$firstWhere)
  343. $WHERE .= ' AND ';
  344. else
  345. $firstWhere = false;
  346. $WHERE .= $fieldName . " = '" . $fields[$fieldName] . "'";
  347. $fieldKeyValue = $fields[$fieldName];
  348. } // if($field['keyField'] == 0)
  349. } // foreach($this->fieldsDef as $field)
  350. foreach($extraFields as $field => $value)
  351. {
  352. if(!$first)
  353. $SQL .= ', ';
  354. else
  355. $first = false;
  356. $SQL .= "$field = $value";
  357. }
  358. // reverts default locale
  359. setlocale(LC_ALL, $this->lang.'.utf8');
  360. // lock rows
  361. $LOCK = 'SELECT * FROM ' . $this->table . $WHERE . ' FOR UPDATE';
  362. $this->oldValues = $this->dbDriver->GetRow($LOCK);
  363. if(count($this->oldValues) == 0)
  364. throw new AV_Exception(NOT_FOUND, $this->lang);
  365. // do update
  366. if(!$first)
  367. {
  368. $SQL .= $WHERE;
  369. if($this->dbDriver->type=='oracle' && count($fileFields)>0 && !$blobToFS)
  370. {
  371. foreach($fileFields as $key=>$file)
  372. {
  373. if($key>0)
  374. {
  375. $FIELDS .= ',';
  376. $VARS .= ',';
  377. }
  378. $FIELDS .= $file;
  379. $VARS .= ':'.$file;
  380. $this->dbDriver->BindBlob($file,$fields[$file]['content']);
  381. }
  382. $SQL .= 'RETURNING '.$FIELDS;
  383. $SQL .= ' INTO '.$VARS;
  384. }
  385. $this->dbDriver->ExecSQL($SQL);
  386. }
  387. // mark old blob filesystem files to be deleted if they were updated
  388. if($blobToFS && count($fileFields)>0)
  389. {
  390. $SQL = "UPDATE LIB_BlobFS SET deleted='1' ";
  391. $SQL .= 'WHERE id IN (';
  392. $firstBlob = true;
  393. foreach($fileFields as $key=>$file)
  394. {
  395. if($firstBlob)
  396. $firstBlob = false;
  397. else
  398. $SQL .= ',';
  399. $SQL .= "'".$this->oldValues[$file]."'";
  400. }
  401. $SQL .= ')';
  402. $this->dbDriver->ExecSQL($SQL);
  403. }
  404. foreach($this->fieldsDef as $field)
  405. {
  406. switch($field['type']){
  407. case "selectMult":
  408. $this->SetOptions($fields[$field['fieldName']], $field,
  409. $fieldKeyValue, $fieldKey);
  410. break;
  411. case "selectMultiple":
  412. $this->SetSelectMultiple($fields[$field['fieldName']], $field,
  413. $fieldKeyValue, $fieldKey);
  414. break;
  415. case "fileList":
  416. $this->oldValues[$field['fieldName']] =
  417. $this->SetFileList($fields[$field['fieldName']],$field,
  418. $fieldKeyValue);
  419. break;
  420. case "objectList":
  421. $this->oldValues[$field['fieldName']] =
  422. $this->SetObjectList($fields[$field['fieldName']],$field,
  423. $fieldKeyValue,$fieldKey,false);
  424. break;
  425. case "emailList":
  426. $this->oldValues[$field['fieldName']] =
  427. $this->SetEmailList($fields[$field['fieldName']],$field,
  428. $fieldKeyValue);
  429. break;
  430. case 'schedule':
  431. $this->SetSchedule($fields[$field['fieldName']], $field,
  432. $fieldKeyValue,$fieldKey);
  433. break;
  434. case "langLabel":
  435. case "langTextArea":
  436. case "langHtmlArea":
  437. $this->SetLabel($field, $fields[$field['fieldName']],
  438. $fieldKeyValue, $fieldKey);
  439. break;
  440. }
  441. }
  442. return $this->oldValues;
  443. }
  444. function Del($fields)
  445. {
  446. // do update operation
  447. $SQL = "DELETE FROM " . $this->table . " WHERE ";
  448. $first = true;
  449. foreach($this->fieldsDef as $field)
  450. {
  451. if($field['keyField'] != '0')
  452. {
  453. $fieldName = $field['fieldName'];
  454. if(!$first)
  455. $SQL .= 'AND ';
  456. else
  457. $first = false;
  458. $SQL .= $fieldName . " = '" . $fields[$fieldName] . "' ";
  459. }
  460. }
  461. if($first)
  462. throw new AV_Exception(FAILED, $this->lang);
  463. // does delete operation
  464. $this->dbDriver->ExecSQL($SQL);
  465. }
  466. function GetForm($keyFields, $fieldName, $sourceId, & $templates,
  467. & $formObject, $defValues = array(),$dateFormat = NULL,
  468. $numberFormat = true, $short = false)
  469. {
  470. // load formula defs
  471. $this->LoadFormulaDefs();
  472. foreach($this->formulaFieldsDef as $value)
  473. {
  474. $fields[$value['fieldName']] = $this->ConvertIf($value['expression']);
  475. $this->formulaType[$value['fieldName']] = $value['formulaType'];
  476. }
  477. $parms['locale'] = localeconv();
  478. foreach($fields as $field => $expression)
  479. $this->formulas[$field] = $this->Decompose($this->formulas, $expression,
  480. $fields,$parms);
  481. $this->LoadFieldsDef();
  482. if($keyFields != NULL)
  483. $values = $this->Get($keyFields);
  484. else
  485. $values = $this->GetDefValues();
  486. $values = ArrayObjectMerge($defValues, $values);
  487. $langLabel = new LANG_Label($this->module);
  488. foreach ($this->fieldsDef as $key=>$value)
  489. {
  490. if($fieldName == '' || $fieldName == $value['fieldName'] || strstr($fieldName,'.',true)==$value['fieldName'])
  491. {
  492. // desabilita template da base em caso de carregamento de campo único
  493. if($fieldName == $value['fieldName'])
  494. unset($this->fieldsDef[$key]['template']);
  495. // ajusta label para todos os campos
  496. if($value['labelId']!=NULL)
  497. $this->fieldsDef[$key]['label'] =
  498. $langLabel->GetLabel($value['labelId'],
  499. $this->lang);
  500. // ajusta outros labels do campo
  501. $this->SetFieldLabels($this->fieldsDef[$key]);
  502. // ajusta xhtmlRequired para todos os campos
  503. if($value['required'])
  504. {
  505. $this->fieldsDef[$key]['xhtmlRequired'] = "class='required'";
  506. $this->fieldsDef[$key]['required'] = "required";
  507. }
  508. else
  509. unset($this->fieldsDef[$key]['required']);
  510. // desabilita campo caso não seja para escrita
  511. if(strpos($value['accessMode'],'w')==false)
  512. $this->fieldsDef[$key]['xhtmlDisabled'] = "disabled='disabled'";
  513. // ajusta versão do avalanche para uso nos campos
  514. $this->fieldsDef[$key]['avVersion'] = $this->pageBuilder->avVersion;
  515. $child = & $this->GetField($this->fieldsDef[$key],$values,$keyFields,
  516. $templates,$sourceId,$dateFormat,
  517. $numberFormat,$fieldName,$short);
  518. if($child != NULL)
  519. {
  520. $formObject->children[$value['orderby']] = & $child;
  521. $formObject->attrs[$value['fieldName']] = $child->attrs['value'];
  522. if($short)
  523. unset($child->attrs['value']);
  524. }
  525. else if(isset($values[$value['fieldName']]))
  526. {
  527. $formObject->attrs[$value['fieldName']] = $values[$value['fieldName']];
  528. }
  529. }
  530. }
  531. return $formObject;
  532. }
  533. function Get($keyFields)
  534. {
  535. $where = NULL;
  536. $select = NULL;
  537. foreach($this->fieldsDef as $key => $value)
  538. {
  539. if($value['type'] != 'selectMult' &&
  540. $value['type'] != 'descr' &&
  541. strpos($value['accessMode'],'r')!==false)
  542. {
  543. if($select != NULL)
  544. $select .= ',';
  545. $select .= $value['fieldName'];
  546. }
  547. if($value['keyField'] == 1)
  548. {
  549. if (!isset($keyFields[$value['fieldName']]))
  550. throw new AV_Exception(INVALID_FIELD, $this->lang,
  551. Array('fieldName'=>$value['fieldName'],
  552. 'table'=>$this->table,
  553. 'addMsg'=>' ('.$value['fieldName']. ')'));
  554. if($where != NULL)
  555. $where .= ' AND ';
  556. $where .= $value['fieldName']. " = '";
  557. $where .= $keyFields[$value['fieldName']]. "'";
  558. }
  559. }
  560. $from = $this->table;
  561. // no fields to be returned
  562. if($select == NULL)
  563. return NULL;
  564. if($where == NULL)
  565. {
  566. throw new AV_Exception(INVALID_FIELD, $this->lang,
  567. Array('fieldName'=>'keyFields',
  568. 'table'=>$this->table,
  569. 'addMsg'=>' (keyFields)'));
  570. }
  571. $SQL = ' SELECT ' .$select. ' FROM ' .$from. ' WHERE ' ;
  572. $SQL .= $where. ' LOCK IN SHARE MODE';
  573. // Executes SQL statement
  574. $values = $this->dbDriver->GetRow($SQL);
  575. if($values==NULL)
  576. {
  577. throw new AV_Exception(NOT_FOUND, $this->lang,
  578. Array('table'=>$this->table));
  579. }
  580. return $values;
  581. }
  582. function GetDefValues()
  583. {
  584. try
  585. {
  586. $desc = $this->dbDriver->GetAll('DESC '.$this->table);
  587. $values = array();
  588. foreach($desc as $field)
  589. {
  590. if($field['Default']!==NULL && $field['Default']!=='' &&
  591. !in_array($field['Field'],$this->keyFields))
  592. $values[$field['Field']] = $field['Default'];
  593. }
  594. return $values;
  595. }
  596. catch(Exception $e)
  597. {
  598. // table may not exist (search fields form)
  599. return array();
  600. }
  601. }
  602. function GetAll($orderBy = NULL)
  603. {
  604. $returnFields = $this->GetReadableFields();
  605. if(count($returnFields)==0)
  606. throw new AV_Exception(FAILED, $this->lang);
  607. $returnFields = implode(',', $returnFields);
  608. $SQL = "SELECT $returnFields FROM ".$this->table.' ';
  609. if($orderBy != NULL)
  610. $SQL .= "ORDER BY $orderBy ";
  611. $SQL .= 'LOCK IN SHARE MODE';
  612. return $this->dbDriver->GetAll($SQL);
  613. }
  614. function AddField($fieldName, $dbType, $labels, $type, $size, $prevField,
  615. $consistType, $required, $allowNull,$accessMode)
  616. {
  617. if($prevField != '')
  618. {
  619. $SQL = 'SELECT orderby FROM FORM_Field WHERE ';
  620. $SQL .= "tableName='".$this->table."' AND fieldName = '$prevField' ";
  621. $SQL .= 'LOCK IN SHARE MODE ';
  622. $order = $this->dbDriver->GetOne($SQL);
  623. if($order == NULL)
  624. throw new AV_Exception(INVALID_FIELD, $this->lang);
  625. $SQL = 'SELECT orderby from FORM_Field WHERE ';
  626. $SQL .= "tableName='".$this->table."' AND orderby > $order ";
  627. $SQL .= 'FOR UPDATE ';
  628. $this->dbDriver->GetCol($SQL);
  629. $SQL = 'UPDATE FORM_Field SET orderby=orderby+1 WHERE ';
  630. $SQL .= "tableName='".$this->table."' AND orderby > $order";
  631. $this->dbDriver->ExecSQL($SQL);
  632. $order++;
  633. }
  634. else
  635. $order = 1;
  636. $labelMan = new LANG_Label($this->module);
  637. $labelId = $this->table . '_' . $fieldName;
  638. $labelMan->SetLabel($labelId, $labels);
  639. $SQL = 'INSERT INTO FORM_Field ';
  640. $SQL .= '(tableName,fieldName,labelId,type,size,orderby,';
  641. $SQL .= 'consistType,required,allowNull,trimField,';
  642. $SQL .= 'uniq,keyField,accessMode,staticProp) VALUES ';
  643. $SQL .= "('".$this->table."','$fieldName','$labelId','$type',$size,";
  644. $SQL .= "$order,'$consistType','$required','$allowNull','1',";
  645. $SQL .= "'0','0','$accessMode','0')";
  646. $this->dbDriver->ExecSQL($SQL);
  647. // clears fieldsDef to force new load
  648. $this->fieldsDef = NULL;
  649. $SQL = 'ALTER TABLE ' . $this->table;
  650. $SQL .= " ADD $fieldName $dbType;";
  651. return $SQL;
  652. }
  653. function ChangeField($newName, $dbType, $labels, $type, $size,
  654. $consistType, $required, $allowNull,$accessMode)
  655. {
  656. if($this->lockedField==NULL)
  657. throw new AV_Exception(FAILED, $this->lang);
  658. if($this->lockedField['staticProp']=='1')
  659. throw new AV_Exception(PERMISSION_DENIED, $this->lang);
  660. $SQL = NULL;
  661. if($labels != NULL)
  662. {
  663. $labelMan = new LANG_Label($this->module);
  664. $labelId = $this->table . '_' . $this->lockedField['fieldName'];
  665. $labelMan->SetLabel($labelId, $labels);
  666. $SQL = "labelId='$labelId'";
  667. }
  668. if($type != NULL)
  669. {
  670. if($SQL != NULL)
  671. $SQL .= ',';
  672. $SQL .= "type='$type'";
  673. }
  674. if($size != NULL)
  675. {
  676. if($SQL != NULL)
  677. $SQL .= ',';
  678. $SQL .= "size=$size";
  679. }
  680. if($consistType != NULL)
  681. {
  682. if($SQL != NULL)
  683. $SQL .= ',';
  684. $SQL .= "consistType='$consistType'";
  685. }
  686. if($required != NULL)
  687. {
  688. if($SQL != NULL)
  689. $SQL .= ',';
  690. $SQL .= "required='$required'";
  691. }
  692. if($allowNull != NULL)
  693. {
  694. if($SQL != NULL)
  695. $SQL .= ',';
  696. $SQL .= "allowNull='$allowNull'";
  697. }
  698. if($accessMode != NULL)
  699. {
  700. if($SQL != NULL)
  701. $SQL .= ',';
  702. $SQL .= "accessMode='$accessMode'";
  703. }
  704. if($SQL != NULL)
  705. {
  706. $SQL = "UPDATE FORM_Field SET $SQL WHERE ";
  707. $SQL .= "tableName='".$this->table."' AND ";
  708. $SQL .= "fieldName='".$this->lockedField['fieldName']."' ";
  709. $this->dbDriver->ExecSQL($SQL);
  710. // clears fieldsDef to force new load
  711. $this->fieldsDef = NULL;
  712. }
  713. if($newName != NULL && $dbType != NULL)
  714. {
  715. $SQL = 'ALTER TABLE ' . $this->table;
  716. $SQL .= " CHANGE ".$this->lockedField['fieldName']." $newName $dbType;";
  717. $this->lockedField = NULL;
  718. return $SQL;
  719. }
  720. else if($newName != NULL || $dbType != NULL)
  721. throw new AV_Exception(INVALID_FIELD, $this->lang);
  722. $this->lockedField = NULL;
  723. return NULL;
  724. }
  725. function DropField($fieldName)
  726. {
  727. $SQL = 'DELETE FROM FORM_Field WHERE ';
  728. $SQL .= "tableName='".$this->table."' AND fieldName='$fieldName' ";
  729. $this->dbDriver->ExecSQL($SQL);
  730. // clears fieldsDef to force new load
  731. $this->fieldsDef = NULL;
  732. $SQL = 'ALTER TABLE ' . $this->table;
  733. $SQL .= " DROP $fieldName";
  734. return $SQL;
  735. }
  736. function SetOrder($fieldName, $up)
  737. {
  738. $SQL = 'SELECT MAX(orderby) FROM FORM_Field WHERE ';
  739. $SQL .= "tableName = '" . $this->table . "' ";
  740. $SQL .= "LOCK IN SHARE MODE";
  741. $last = $this->dbDriver->GetOne($SQL);
  742. if($last == NULL)
  743. throw new AV_Exception(FAILED, $this->lang);
  744. $SQL = 'SELECT orderby FROM FORM_Field WHERE ';
  745. $SQL .= "tableName = '" . $this->table . "' AND fieldName = '$fieldName' ";
  746. $SQL .= "FOR UPDATE";
  747. $order = $this->dbDriver->GetOne($SQL);
  748. if($order == NULL)
  749. return;
  750. //up ou down
  751. if($up)
  752. {
  753. if($order == 1)
  754. return;
  755. $nextOrder = $order-1;
  756. }
  757. else
  758. {
  759. if($last == $order)
  760. return;
  761. $nextOrder = $order+1;
  762. }
  763. $SQL = 'SELECT orderby FROM FORM_Field WHERE ';
  764. $SQL .= "tableName = '" . $this->table . "' AND orderby = $nextOrder ";
  765. $SQL .= "FOR UPDATE";
  766. $nextOrder = $this->dbDriver->GetOne($SQL);
  767. if($nextOrder == NULL)
  768. throw new AV_Exception(FAILED, $this->lang);
  769. $SQL = "UPDATE FORM_Field SET orderby=$order WHERE ";
  770. $SQL .= "tableName = '" . $this->table . "' AND orderby = $nextOrder ";
  771. $this->dbDriver->ExecSQL($SQL);
  772. $SQL = "UPDATE FORM_Field SET orderby=$nextOrder WHERE ";
  773. $SQL .= "tableName = '" . $this->table . "' AND fieldName = '$fieldName' ";
  774. $this->dbDriver->ExecSQL($SQL);
  775. // clears fieldsDef to force new load
  776. $this->fieldsDef = NULL;
  777. }
  778. function GetFieldInfo($fieldName)
  779. {
  780. $SQL = 'SELECT labelId,type,template,langTemplate,size,orderby,';
  781. $SQL .= 'consistType,required,allowNull ';
  782. $SQL .= 'FROM FORM_Field WHERE ';
  783. $SQL .= "tableName = '" . $this->table . "' AND fieldName = '$fieldName' ";
  784. $SQL .= 'LOCK IN SHARE MODE ';
  785. $field = $this->dbDriver->GetRow($SQL);
  786. if(count($field) == 0)
  787. throw new AV_Exception(NOT_FOUND, $this->lang);
  788. $labelMan = new LANG_Label($this->module);
  789. $labelList = $labelMan->GetLabelList($field['labelId']);
  790. foreach($labelList as $label)
  791. $field['descr_'.$label['lang']] = $label['value'];
  792. return $field;
  793. }
  794. function GetNextFieldValue($fieldName, $prefix)
  795. {
  796. $offset = mb_strlen($prefix) + 1;
  797. $SQL = "SELECT MAX(SUBSTR($fieldName,$offset)+0) ";
  798. $SQL .= 'FROM '. $this->table .' WHERE ';
  799. $SQL .= "$fieldName like '$prefix%' ";
  800. $SQL .= 'LOCK IN SHARE MODE';
  801. $num = $this->dbDriver->GetOne($SQL);
  802. if($num == NULL)
  803. return $prefix.'1';
  804. return $prefix . ++$num;
  805. }
  806. function GetSelectFieldInfo($fieldName)
  807. {
  808. $SQL = 'SELECT * FROM FORM_SelectField WHERE ';
  809. $SQL .= "tableName = '".$this->table."' AND fieldName = '$fieldName' ";
  810. $SQL .= 'LOCK IN SHARE MODE ';
  811. return $this->dbDriver->GetRow($SQL);
  812. }
  813. //
  814. //--Protected
  815. //
  816. protected function ParseFieldDef(& $fieldDef,$disableFileRequired,$disableRequired)
  817. {
  818. $key = $fieldDef['orderby'];
  819. $this->fieldsDef[$key] = & $fieldDef;
  820. // sets default stripSlashes to false
  821. $this->fieldsDef[$key]['stripSlashes'] = false;
  822. if($disableRequired)
  823. $fieldDef['required'] = '0';
  824. if($fieldDef['keyField']=='1')
  825. $this->keyFields[] = $fieldDef['fieldName'];
  826. if($fieldDef['attributes'] != NULL)
  827. $fieldDef['attributes'] = json_decode($fieldDef['attributes'],true);
  828. switch($fieldDef['type'])
  829. {
  830. // sets langLabel field as list
  831. case 'langLabel':
  832. case "langTextArea":
  833. case "langHtmlArea":
  834. $this->fieldsDef[$key]['list'] = true;
  835. $this->fieldsDef[$key]['sizeVarName'] = $fieldDef['fieldName'].
  836. '_numOfOptions';
  837. $subfieldDef = array();
  838. $subfieldDef[0]['fieldName'] = 'lang';
  839. $subfieldDef[0]['required'] = $fieldDef['required'];
  840. $subfieldDef[0]['allowNull'] = $fieldDef['allowNull'];
  841. $subfieldDef[0]['stripSlashes'] = false;
  842. $subfieldDef[1]['fieldName'] = 'value';
  843. $subfieldDef[1]['required'] = $fieldDef['required'];
  844. $subfieldDef[1]['allowNull'] = $fieldDef['allowNull'];
  845. $subfieldDef[1]['stripSlashes'] = false;
  846. $subfieldDef[1]['consistType'] = $fieldDef['consistType'];
  847. $this->fieldsDef[$key]['fieldsDef'] = $subfieldDef;
  848. break;
  849. case 'schedule':
  850. $this->fieldsDef[$key]['list'] = true;
  851. $this->fieldsDef[$key]['required'] = $fieldDef['required'];
  852. $this->fieldsDef[$key]['sizeVarName'] = $fieldDef['fieldName'].
  853. '_numOfOptions';
  854. $subfieldDef = array();
  855. $subfieldDef[0]['fieldName'] = 'start';
  856. $subfieldDef[0]['required'] = false;
  857. $subfieldDef[0]['allowNull'] = true;
  858. $subfieldDef[0]['consistType'] = 'datetime';
  859. $subfieldDef[1]['fieldName'] = 'numOfHours';
  860. $subfieldDef[1]['required'] = false;
  861. $subfieldDef[1]['allowNull'] = true;
  862. $subfieldDef[1]['consistType'] = 'integer';
  863. $this->fieldsDef[$key]['fieldsDef'] = $subfieldDef;
  864. break;
  865. case 'selectMult':
  866. $this->fieldsDef[$key]['list'] = true;
  867. $this->fieldsDef[$key]['sizeVarName'] = $fieldDef['fieldName'].
  868. '_numOfOptions';
  869. $subfieldDef = array();
  870. $subfieldDef[0]['fieldName'] = 'value';
  871. $subfieldDef[0]['required'] = false;
  872. $subfieldDef[0]['allowNull'] = true;
  873. $subfieldDef[0]['consistType'] = 'integer';
  874. $this->fieldsDef[$key]['fieldsDef'] = $subfieldDef;
  875. break;
  876. case 'selectMultiple':
  877. // gambiarra pra evitar addslashes
  878. $this->fieldsDef[$key]['stripSlashes'] = true;
  879. break;
  880. case 'fileList':
  881. $subfieldDef = array();
  882. $subfieldDef[0]['fieldName'] = 'docId';
  883. $subfieldDef[0]['required'] = true;
  884. $subfieldDef[0]['allowNull'] = false;
  885. $subfieldDef[0]['consistType'] = 'integer';
  886. $this->fieldsDef[$key]['fieldsDef'] = $subfieldDef;
  887. // gambiarra pra evitar addslashes
  888. $this->fieldsDef[$key]['stripSlashes'] = true;
  889. break;
  890. case 'objectList':
  891. $subfields = $this->LoadObjectListDefs($fieldDef);
  892. $this->fieldsDef[$key]['fieldsDef'] = $subfields;
  893. // gambiarra pra evitar addslashes
  894. $this->fieldsDef[$key]['stripSlashes'] = true;
  895. break;
  896. case 'file':
  897. // gambiarra pra evitar addslashes
  898. $this->fieldsDef[$key]['stripSlashes'] = true;
  899. if($disableFileRequired)
  900. $this->fieldsDef[$key]['required'] = '0';
  901. $this->fieldsDef[$key]['allowNull'] = '1';
  902. break;
  903. case 'emailList':
  904. // gambiarra pra evitar addslashes
  905. $this->fieldsDef[$key]['stripSlashes'] = true;
  906. }
  907. }
  908. protected function LoadObjectListDefs($fieldDef)
  909. {
  910. $data = $this->GetObjectListInfo($fieldDef);
  911. $libDoc = new LIB_Document($this->module);
  912. $fieldsDef = $libDoc->LoadFieldsDef(NULL, $data['path']);
  913. $excludeFields = array('userId','groupId','userRight','groupRight',
  914. 'otherRight','creationDate','lastChanged',
  915. 'lastChangedUserId','keywords');
  916. foreach($fieldsDef as $key => &$field)
  917. if(in_array($field['fieldName'],$excludeFields))
  918. unset($fieldsDef[$key]);
  919. return $fieldsDef;
  920. }
  921. protected function GetObjectListInfo($fieldDef)
  922. {
  923. $SQL = 'SELECT path, ol.folderId, parentIdField ';
  924. $SQL .= 'FROM FORM_ObjectListField ol, LIB_Folder f ';
  925. $SQL .= "WHERE tableName='".$this->table."' ";
  926. $SQL .= "AND fieldName='".$fieldDef['fieldName']."' ";
  927. $SQL .= 'AND ol.folderId=f.folderId ';
  928. $data = $this->dbDriver->GetRow($SQL);
  929. if(count($data) == NULL)
  930. throw new AV_Exception(NOT_FOUND, $this->lang);
  931. return $data;
  932. }
  933. protected function GetFieldsDef()
  934. {
  935. $SQL = 'SELECT labelId,fieldName,type,template,langTemplate,outputFuncRef,';
  936. $SQL .= 'size,attributes,consistType,`maxValue`,minValue,allowNull,trimField,required,uniq,';
  937. $SQL .= 'staticProp,accessMode, keyField, orderby ';
  938. $SQL .= 'FROM FORM_Field ';
  939. $SQL .= "WHERE tableName ='". $this->table;
  940. $SQL .= "' ORDER BY orderby";
  941. $SQL .= ' LOCK IN SHARE MODE ';
  942. // Executes SQL statement
  943. return $this->dbDriver->GetAll($SQL);
  944. }
  945. protected function GetTemplate($templates, $fieldName)
  946. {
  947. if(is_array($templates[$fieldName]))
  948. return $templates[$fieldName]['fileName'];
  949. else
  950. return $templates[$fieldName];
  951. }
  952. protected function &GetField(& $fieldDef, & $values, $keyFields,
  953. & $templates, $sourceId, $dateFormat = NULL,
  954. $numberFormat = true, $fieldName = NULL,
  955. $short = false)
  956. {
  957. switch ($fieldDef['type'])
  958. {
  959. case "langLabel":
  960. case "langTextArea":
  961. case "langHtmlArea":
  962. return $this->GetLangField($fieldDef, $values, $templates);
  963. case 'descr':
  964. case "password":
  965. case 'textArea':
  966. case "text":
  967. case 'hidden':
  968. case 'integer':
  969. case 'dateFilter':
  970. case 'currencyFilter':
  971. case 'integerFilter':
  972. return $this->GetTextField($fieldDef, $values);
  973. case 'authSecret':
  974. return $this->GetAuthSecretField($fieldDef, $values);
  975. case 'htmlArea':
  976. if($short)
  977. return $this->GetTextField($fieldDef, $values);
  978. return $this->GetHtmlField($fieldDef, $values);
  979. case 'boolean':
  980. return $this->GetBooleanField($fieldDef, $values);
  981. case "accessRight":
  982. return $this->GetAccessRightField($fieldDef, $values);
  983. case "date":
  984. case "datetime":
  985. return $this->GetDateField($fieldDef, $values, $dateFormat);
  986. case "cpf":
  987. return $this->GetCpfField($fieldDef, $values);
  988. case "cnpj":
  989. return $this->GetCnpjField($fieldDef, $values);
  990. case "cep":
  991. return $this->GetCepField($fieldDef, $values);
  992. case 'schedule':
  993. return $this->GetScheduleField($fieldDef, $values, $keyFields);
  994. case "select":
  995. case "radio":
  996. return $this->GetSelectField($fieldDef, $values, $keyFields,
  997. $templates, $sourceId);
  998. case 'readOnlySelect':
  999. return $this->GetReadOnlySelectField($fieldDef, $values);
  1000. case "selectMult":
  1001. case "selectMultiple":
  1002. return $this->GetSelectMultField($fieldDef, $values, $keyFields,
  1003. $templates, $sourceId);
  1004. case 'float':
  1005. case 'currency':
  1006. return $this->GetFloatField($fieldDef, $values, $numberFormat);
  1007. case 'percent':
  1008. return $this->GetPercentField($fieldDef, $values, $numberFormat);
  1009. case 'file':
  1010. return $this->GetFileField($fieldDef, $values);
  1011. case 'usageTerms':
  1012. return $this->GetUsageTermsField($fieldDef, $values);
  1013. case 'legalEntityRef':
  1014. return $this->GetLEOrNPEntityRef($fieldDef, $values,
  1015. 'legalEntity');
  1016. case 'naturalPersonRef':
  1017. return $this->GetLEOrNPEntityRef($fieldDef, $values,
  1018. 'naturalPerson');
  1019. case 'leOrNpEntityRef':
  1020. return $this->GetLEOrNPEntityRef($fieldDef, $values, NULL);
  1021. case 'fileList':
  1022. return $this->GetFileListField($fieldDef,$keyFields,$templates);
  1023. case 'objectList':
  1024. return $this->GetObjectListField($fieldDef,$keyFields,$dateFormat,
  1025. $numberFormat,$fieldName,$short);
  1026. case 'emailList':
  1027. return $this->GetEmailListField($fieldDef,$keyFields,$templates);
  1028. case 'folder':
  1029. return $this->GetFolderField($fieldDef, $values);
  1030. case 'formula':
  1031. return $this->GetFormulaField($fieldDef, $values);
  1032. default:
  1033. return NULL;
  1034. }
  1035. }
  1036. //--Method: GetLangLabel
  1037. protected function GetLangField(& $fieldDef, & $values, & $templates)
  1038. {
  1039. // retrieves all registered languages
  1040. $langLabel = new LANG_Label($this->module);
  1041. $langList = $langLabel->GetLangList();
  1042. // creates lang field
  1043. $langField = new FORM_Object('field', $this->pageBuilder,
  1044. $templates, 'nextLangField');
  1045. $langField->attrs['fieldName'] = $fieldDef['fieldName'];
  1046. $langField->attrs['numOfOptions'] = count($langList);
  1047. $langField->attrs['type'] = 'langField';
  1048. // creates lang subfields
  1049. foreach($langList as $key => $lang)
  1050. {
  1051. $field = new AV_ModObject('field', $this->pageBuilder);
  1052. // fieldDef pode ser AV_OCIArray no caso de conexão oracle
  1053. if(gettype($fieldDef)=='object')
  1054. $field->attrs = clone $fieldDef;
  1055. else
  1056. $field->attrs = $fieldDef;
  1057. $field->attrs['lang'] = $lang['lang'];
  1058. $field->attrs['langLabel'] = mb_substr($lang['lang'],0,2);
  1059. $field->attrs['fieldIndex'] = $key+1;
  1060. $keys[$lang['lang']] = $key;
  1061. $langField->children[$key] = $field;
  1062. // initiate new html to have at least a <p>&nbsp;</p>
  1063. if($fieldDef['type'] == 'langHtmlArea')
  1064. $field->attrs['value'] = "<p>&nbsp;</p>";
  1065. }
  1066. // set's lang subfields values
  1067. $list = $langLabel->GetLabelList($values[$fieldDef['fieldName']],
  1068. $fieldDef['type']!='langLabel');
  1069. foreach($list as $key=>$value)
  1070. {
  1071. $langField->children[$keys[$value['lang']]]->attrs['value'] =
  1072. $value['value'];
  1073. if($value['lang'] == $this->lang)
  1074. $langField->attrs['value'] = $value['value'];
  1075. }
  1076. return $langField;
  1077. }
  1078. //--Method: GetTextField
  1079. protected function &GetTextField(& $fieldDef, $values)
  1080. {
  1081. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1082. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1083. $modobj->attrs = $fieldDef;
  1084. return $modobj;
  1085. }
  1086. protected function &GetAuthSecretField(& $fieldDef, $values)
  1087. {
  1088. global $SM_siteID;
  1089. $ga = new PHPGangsta_GoogleAuthenticator();
  1090. if($values[$fieldDef['fieldName']]==NULL)
  1091. $fieldDef['value'] = $ga->createSecret();
  1092. else
  1093. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1094. $name = $SM_siteID;
  1095. $fieldDef['qrCodeUrl'] = $ga->getQRCodeGoogleUrl($SM_siteID.'-'.$values['login'],
  1096. $fieldDef['value']);
  1097. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1098. $modobj->attrs = $fieldDef;
  1099. return $modobj;
  1100. }
  1101. //--Method: GetTextField
  1102. protected function GetHtmlField(& $fieldDef, $values)
  1103. {
  1104. // initiate new html to have at least a <p>&nbsp;</p>
  1105. if($values[$fieldDef['fieldName']] == NULL)
  1106. $values[$fieldDef['fieldName']] = "<p>&nbsp;</p>";
  1107. return $this->GetTextField($fieldDef,$values);
  1108. }
  1109. //--Method: GetTextField
  1110. protected function &GetBooleanField(& $fieldDef, $values)
  1111. {
  1112. if($values[$fieldDef['fieldName']])
  1113. $fieldDef['xhtmlCheckedAttr'] = "checked='checked'";
  1114. return $this->GetTextField($fieldDef, $values);
  1115. }
  1116. //--Method: GetTextField
  1117. protected function &GetPercentField(& $fieldDef, $values, $numberFormat)
  1118. {
  1119. if($numberFormat)
  1120. $values[$fieldDef['fieldName']] *= 100;
  1121. return $this->GetFloatField($fieldDef, $values,$numberFormat);
  1122. }
  1123. //--Method: GetTextField
  1124. protected function &GetFloatField(& $fieldDef, $values, $numberFormat)
  1125. {
  1126. if($numberFormat)
  1127. {
  1128. $locale = localeconv();
  1129. if(isset($values[$fieldDef['fieldName']]))
  1130. {
  1131. $fieldDef['value'] = number_format($values[$fieldDef['fieldName']],
  1132. $locale['frac_digits'],
  1133. $locale['mon_decimal_point'],
  1134. $locale['mon_thousands_sep']);
  1135. }
  1136. }
  1137. else
  1138. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1139. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1140. $modobj->attrs = $fieldDef;
  1141. return $modobj;
  1142. }
  1143. protected function GetAccessRightField(& $fieldDef, $values)
  1144. {
  1145. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1146. $fieldDef['read'] = (strpos($fieldDef['value'],'r')===false)?'0':'1';
  1147. $fieldDef['write'] = (strpos($fieldDef['value'],'w')===false)?'0':'1';
  1148. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1149. $modobj->attrs = $fieldDef;
  1150. return $modobj;
  1151. }
  1152. protected function &GetDateField(& $fieldDef, $values, $dateFormat)
  1153. {
  1154. if($values[$fieldDef['fieldName']] != 0)
  1155. {
  1156. $timestamp = strtotime($values[$fieldDef['fieldName']]);
  1157. if($dateFormat != NULL)
  1158. {
  1159. $fieldDef['value'] = strftime($dateFormat,$timestamp);
  1160. $fieldDef['valueUTS'] = $values[$fieldDef['fieldName']];
  1161. }
  1162. else
  1163. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1164. $fieldDef['year'] = date('Y',$timestamp);
  1165. $fieldDef['month'] = date('m',$timestamp);
  1166. $fieldDef['day'] = date('d',$timestamp);
  1167. $fieldDef['hour'] = date('H',$timestamp);
  1168. $fieldDef['minute'] = date('i',$timestamp);
  1169. $fieldDef['second'] = date('s',$timestamp);
  1170. }
  1171. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1172. $modobj->attrs = $fieldDef;
  1173. return $modobj;
  1174. }
  1175. //--Method: GetCpfField
  1176. protected function &GetCpfField(& $fieldDef, $values)
  1177. {
  1178. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1179. $fieldDef['cpf_1'] = mb_substr($values[$fieldDef['fieldName']],0,-2);
  1180. $fieldDef['cpf_2'] = mb_substr($values[$fieldDef['fieldName']],-2);
  1181. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1182. $modobj->attrs = $fieldDef;
  1183. return $modobj;
  1184. }
  1185. //--Method: GetCnpjField
  1186. protected function &GetCnpjField(& $fieldDef, $values)
  1187. {
  1188. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1189. $fieldDef['cnpj_1'] = mb_substr($values[$fieldDef['fieldName']],0,-6);
  1190. $fieldDef['cnpj_2'] = mb_substr($values[$fieldDef['fieldName']],-6, 4);
  1191. $fieldDef['cnpj_3'] = mb_substr($values[$fieldDef['fieldName']],-2);
  1192. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1193. $modobj->attrs = $fieldDef;
  1194. return $modobj;
  1195. }
  1196. //--Method: GetCepField
  1197. protected function &GetCepField(& $fieldDef, $values)
  1198. {
  1199. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1200. $fieldDef['cep_1'] = mb_substr($values[$fieldDef['fieldName']],0,-3);
  1201. $fieldDef['cep_2'] = mb_substr($values[$fieldDef['fieldName']],-3);
  1202. $modobj = new AV_ModObject('field', $this->pageBuilder);
  1203. $modobj->attrs = $fieldDef;
  1204. return $modobj;
  1205. }
  1206. //--Method: GetSchedule
  1207. protected function &GetScheduleField(& $fieldDef, $values, $keyFields)
  1208. {
  1209. $SQL = "SELECT LPAD(DAY(start),2,'0') as startDay, ";
  1210. $SQL .= "LPAD(MONTH(start),2,'0') as startMonth, ";
  1211. $SQL .= "LPAD(YEAR(start),4,'0') as startYear, ";
  1212. $SQL .= "LPAD(HOUR(start),2,'0') as startHour, ";
  1213. $SQL .= "LPAD(MINUTE(start),2,'0') as startMinute, numOfHours ";
  1214. $SQL .= 'FROM AV_Schedule ';
  1215. $SQL .= "WHERE docId='".$keyFields['docId']."' ";
  1216. $SQL .= 'ORDER BY start ';
  1217. $scheduleList = $this->dbDriver->GetAll($SQL);
  1218. $values[$fieldDef['fieldName']] = json_encode($scheduleList);
  1219. return $this->GetTextField($fieldDef,$values);
  1220. }
  1221. //--Method: GetSelectField
  1222. function &GetSelectField(& $fieldDef,$values,$keyFields,$templates,
  1223. $sourceId)
  1224. {
  1225. // retrieves information from FORM_SelectField
  1226. $SQL = ' SELECT * FROM FORM_SelectField WHERE ';
  1227. $SQL .= "tableName='" .$this->table. "' AND ";
  1228. $SQL .= "(fieldName='" . $fieldDef['fieldName']. "' OR ";
  1229. $SQL .= "FIND_IN_SET('".$fieldDef['fieldName']."',targetField)<>0) ";
  1230. $selectFields = $this->dbDriver->GetAll($SQL);
  1231. foreach($selectFields as $key=>$sField)
  1232. {
  1233. if($selectFields[$key]['fieldName']==$fieldDef['fieldName'])
  1234. $field = $selectFields[$key];
  1235. else
  1236. {
  1237. $targetFields = explode(',',$selectFields[$key]['targetField']);
  1238. if(in_array($fieldDef['fieldName'],$targetFields))
  1239. $sourceField=$selectFields[$key]['fieldName'];
  1240. }
  1241. }
  1242. $fieldDef['targetField'] = $field['targetField'];
  1243. $fieldDef['sourceField'] = $field['sourceField'];
  1244. $modobj = new FORM_Object('field', $this->pageBuilder,
  1245. $templates, $fieldDef['type'].'Option');
  1246. $modobj->attrs = & $fieldDef;
  1247. if($field['sourceField'] != NULL)
  1248. {
  1249. if($sourceId != '')
  1250. $sourceValue = $sourceId;
  1251. else
  1252. $sourceValue = $values[$sourceField];
  1253. //$fieldDef['value'] = $sourceValue;
  1254. }
  1255. // else
  1256. $fieldDef['value'] = $values[$fieldDef['fieldName']];
  1257. // retrieves select options if sourceField is NULL (no dependence)
  1258. // or if sourceValue is set (dependence solved)
  1259. if($field['sourceField'] == NULL || $sourceValue != '')
  1260. {
  1261. $currValue = $values[$fieldDef['fieldName']];
  1262. $SQL = "SELECT ";
  1263. if($field['optionTableValue'] == NULL)
  1264. $SQL .= 'value, ';
  1265. else
  1266. $SQL .= $field['optionTableValue'] . ' as value, ';
  1267. $SQL .= $field['optionTableKey'] . " as id,";
  1268. $SQL .= "IF(" . $field['optionTableKey'] . " ='".$currValue;
  1269. $SQL .= "',1,0) as selected, '";
  1270. $SQL .= $fieldDef['type']."Option' as type FROM ";
  1271. $SQL .= $field['optionTable'];
  1272. if($field['optionTableValue'] == NULL)
  1273. $SQL .= " ,LANG_Label";
  1274. $WHERE = '';
  1275. if($sourceValue != '')
  1276. $WHERE = $field['sourceField'] . " = '$sourceValue' ";
  1277. if($field['optionTableValue'] == NULL)
  1278. {
  1279. if($WHERE != '')
  1280. $WHERE .= ' AND ';
  1281. $WHERE .= "labelId = name AND lang = '";
  1282. $WHERE .= $this->lang."'";
  1283. }
  1284. if($WHERE != '')
  1285. $SQL .= ' WHERE ' . $WHERE;
  1286. if($field['orderField'] != NULL)
  1287. {
  1288. $SQL .= ' ORDER BY ' . $field['orderField'];
  1289. $SQL .= ' '.($field['ascOrder']=='1'?'ASC':'DESC');
  1290. }
  1291. $rows = $this->dbDriver->GetAll($SQL);
  1292. $i = 0;
  1293. foreach($rows as & $row)
  1294. {
  1295. $modobj->children[$i] = new AV_ModObject('option',
  1296. $this->pageBuilder);
  1297. if($row['selected'] == 1)
  1298. {
  1299. $row['xhtmlSelectedAttr'] = "selected='selected'";
  1300. $row['xhtmlCheckedAttr'] = "checked='checked'";
  1301. $modobj->attrs['text'] = $row['value'];
  1302. $fieldDef['text'] = $row['value'];
  1303. }
  1304. $modobj->children[$i]->attrs = & $row;
  1305. $modobj->children[$i]->attrs['fieldIndex'] = $i+1;
  1306. $modobj->children[$i]->attrs['fieldName'] = $fieldDef['fieldName'];
  1307. $modobj->children[$i]->attrs['lang'] = $this->lang;
  1308. $i++;
  1309. }
  1310. $modobj->attrs['numOfOptions'] = $i;
  1311. }
  1312. return $modobj;
  1313. }
  1314. protected function GetReadOnlySelectField(& $fieldDef, $values)
  1315. {
  1316. // retrieves information from FORM_SelectField
  1317. $SQL = ' SELECT * FROM FORM_SelectField WHERE ';
  1318. $SQL .= "tableName='" .$this->table. "' AND ";
  1319. $SQL .= "fieldName='" . $fieldDef['fieldName']. "' ";
  1320. $SQL .= 'LOCK IN SHARE MODE';
  1321. $selectField = $this->dbDriver->GetRow($SQL);
  1322. $SQL = "SELECT ";
  1323. if($selectField['optionTableValue'] == NULL)
  1324. $SQL .= 'value ';
  1325. else
  1326. $SQL .= $selectField['optionTableValue'] . ' as value ';
  1327. $SQL .= 'FROM ' . $selectField['optionTable'];
  1328. if($field['optionTableValue'] == NULL)
  1329. $SQL .= " ,LANG_Label";
  1330. $SQL .= ' WHERE ';
  1331. $SQL .= $selectField['optionTableKey'];
  1332. $SQL .= "='".$values[$fieldDef['fieldName']]."' ";
  1333. if($selectField['optionTableValue'] == NULL)
  1334. {
  1335. $SQL .= "AND labelId = name AND lang = '";
  1336. $SQL .= $this->pageBuilder->lang . "'";
  1337. }
  1338. $fieldDef['text'] = $this->dbDriver->GetOne($SQL);
  1339. return $this->GetTextField($fieldDef, $values);
  1340. }
  1341. //--Method: GetSelectMultField
  1342. protected function &GetSelectMultField(&$fieldDef,$values,$keyFields,
  1343. $templates,$sourceId)
  1344. {
  1345. // retrieves information from FORM_SelectField
  1346. $SQL = ' SELECT * FROM FORM_SelectField WHERE ';
  1347. $SQL .= "tableName='" .$this->table. "' AND ";
  1348. $SQL .= "(fieldName='" . $fieldDef['fieldName']. "' OR ";
  1349. $SQL .= "FIND_IN_SET('".$fieldDef['fieldName']."',targetField)<>0) ";
  1350. $selectFields = $this->dbDriver->GetAll($SQL);
  1351. foreach($selectFields as $key=>$sField)
  1352. {
  1353. if($selectFields[$key]['fieldName']==$fieldDef['fieldName'])
  1354. $field = $selectFields[$key];
  1355. else
  1356. {
  1357. $targetFields = explode(',',$selectFields[$key]['targetField']);
  1358. if(in_array($fieldDef['fieldName'],$targetFields))
  1359. $sourceField=$selectFields[$key]['fieldName'];
  1360. }
  1361. }
  1362. $fieldDef['targetField'] = $field['targetField'];
  1363. $fieldDef['sourceField'] = $field['sourceField'];
  1364. $modobj = new FORM_Object('field', $this->pageBuilder,
  1365. $templates, 'selectMultOption');
  1366. if($field['sourceField'] != NULL)
  1367. {
  1368. if($sourceId != '')
  1369. $sourceValue = $sourceId;
  1370. else
  1371. $sourceValue = $values[$sourceField];
  1372. }
  1373. // retrieves select options if sourceField is NULL (no dependence)
  1374. // or if sourceValue is set (dependence solved)
  1375. if($field['sourceField'] == NULL || $sourceValue != '')
  1376. {
  1377. $SQL = 'SELECT ';
  1378. if($field['optionTableValue'] == NULL)
  1379. $SQL .= 'value, ';
  1380. else
  1381. $SQL .= $field['optionTableValue'] . ' as value, ';
  1382. $SQL .= $field['optionTableKey']." as id, ";
  1383. $SQL .= "'selectMultOption' as type ";
  1384. $SQL .= "FROM ".$field['optionTable'];
  1385. if($field['optionTableValue'] == NULL)
  1386. $SQL .= " ,LANG_Label ";
  1387. $WHERE = '';
  1388. if($sourceValue != '')
  1389. $WHERE = $field['sourceField'] . " = '$sourceValue' ";
  1390. if($field['optionTableValue'] == NULL)
  1391. {
  1392. if($WHERE != '')
  1393. $WHERE .= ' AND ';
  1394. $WHERE .= "labelId = name AND lang = '";
  1395. $WHERE .= $this->lang."'";
  1396. }
  1397. if($WHERE != '')
  1398. $SQL .= ' WHERE ' . $WHERE;
  1399. if($field['orderField'] != NULL)
  1400. {
  1401. $SQL .= ' ORDER BY ' . $field['orderField'];
  1402. $SQL .= ' '.($field['ascOrder']=='1'?'ASC':'DESC');
  1403. }
  1404. $rows = $this->dbDriver->GetAll($SQL);
  1405. if($keyFields != NULL)
  1406. {
  1407. // retrieves selected options
  1408. $control = TRUE;
  1409. foreach($keyFields as $key => $value)
  1410. {
  1411. if($control = TRUE)
  1412. {
  1413. $WHERE = $key. " = '" .$value. "'";
  1414. $control = FALSE;
  1415. }
  1416. else
  1417. $WHERE .=" AND " .$key. " = '" .$value. "'";
  1418. }
  1419. $SQL = ' SELECT '.$field['optionTableKey'].' FROM ';
  1420. $SQL .= $field['selectedTable'].' WHERE '.$WHERE;
  1421. $temp1 = $this->dbDriver->GetCol($SQL);
  1422. }
  1423. foreach ($rows as $key => $value)
  1424. {
  1425. if (in_array($value['id'],$temp1))
  1426. {
  1427. $rows[$key]['selected'] = 1;
  1428. $rows[$key]['xhtmlCheckedAttr'] = "checked='checked'";
  1429. $selected[] = $value['id'];
  1430. $selectedText[] = $value['value'];
  1431. }
  1432. else
  1433. $rows[$key]['selected'] = 0;
  1434. $rows[$key]['fieldName'] = $fieldDef['fieldName'];
  1435. }
  1436. $fieldDef['value'] = $selected;
  1437. $fieldDef['text'] = implode(',', $selectedText);
  1438. $modobj->LoadChildrenFromRows($rows, "option", "numOfOptions");
  1439. }
  1440. else
  1441. $fieldDef['numOfOptions'] = '0';
  1442. $modobj->attrs = ArrayObjectMerge($modobj->attrs,$fieldDef);
  1443. return $modobj;
  1444. }
  1445. protected function &GetFileListField(&$fieldDef,&$keyFields,&$templates)
  1446. {
  1447. $fileListField = new AV_ModObject('file', $this->pageBuilder,
  1448. $this->GetTemplate($templates,
  1449. 'fileListItem'),
  1450. 'imageListItem');
  1451. $fileListField->attrs = & $fieldDef;
  1452. $fileListField->isArray = true;
  1453. $SQL = 'SELECT path,contentFileTable,contentFileFK,maxFiles ';
  1454. $SQL .= 'FROM LIB_Folder f, LIB_FileListField cif ';
  1455. $SQL .= "WHERE tableName='".$this->table."' ";
  1456. $SQL .= "AND fieldName='".$fieldDef['fieldName']."' ";
  1457. $SQL .= 'AND f.folderId = cif.folderId ';
  1458. $data = $this->dbDriver->GetRow($SQL);
  1459. if(count($data) == NULL)
  1460. throw new AV_Exception(NOT_FOUND, $this->lang);
  1461. $fileListField->attrs['path'] = $data['path'];
  1462. $fileListField->attrs['maxFiles'] = $data['maxFiles'];
  1463. // retrives file list
  1464. if($keyFields != NULL)
  1465. {
  1466. $SQL = "SELECT fieldName,fileId as docId,value as title,contentType,";
  1467. $SQL .= 'creationDate, lastChanged ';
  1468. $SQL .= 'FROM '.$data['contentFileTable'].' ci, ';
  1469. $SQL .= 'LIB_FileDocument d, LIB_Node n, LANG_Label l ';
  1470. $SQL .= "WHERE tableName='".$this->table."' ";
  1471. $SQL .= "AND fieldName='".$fieldDef['fieldName']."'";
  1472. reset($keyFields);
  1473. $SQL .= "AND ci.".$data['contentFileFK']."='".current($keyFields)."' ";
  1474. $SQL .= 'AND fileId=d.docId AND d.docId=n.nodeId AND d.title=l.labelId ';
  1475. $SQL .= "AND lang='".$this->lang."' ";
  1476. $SQL .= 'ORDER BY idx';
  1477. $fileListField->attrs['value'] = $this->dbDriver->GetAll($SQL);
  1478. }
  1479. return $fileListField;
  1480. }
  1481. protected function &GetObjectListField(&$fieldDef,&$keyFields,$dateFormat,
  1482. $numberFormat,$fieldName,$short)
  1483. {
  1484. $objectListField = new AV_ModObject('object', $this->pageBuilder);
  1485. $objectListField->attrs = & $fieldDef;
  1486. $objectListField->isArray = true;
  1487. $data = $this->GetObjectListInfo($fieldDef);
  1488. $

Large files files are truncated, but you can click here to view the full file