Column.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. <?php
  2. /**
  3. * TODO: columns in $_SESSION['columns'][Table][Field] = array(Type, Type_value, Default, Null)
  4. * legacy: $_SESSION[Table . '_COLUMN'][TYPE], ...
  5. * $_SESSION['columns'][Table]
  6. *
  7. * add column config to config/.cnf--column_init_{TBL_NAME}.ini.php
  8. * @see method is_allowed
  9. */
  10. class Column {
  11. var $_table;
  12. var $_data;
  13. var $_initialized;
  14. function __construct($table, &$col_data) {
  15. $this->_table = $table;
  16. $this->_data = $col_data;
  17. $this->_initialized = (V::get('_checked', '', $col_data))? true : false;
  18. }
  19. function initialized() {
  20. return $this->_initialized;
  21. }
  22. function type($field_name) {
  23. $type = V::get($field_name, '', $this->_data['TYPESPECIAL']);
  24. if (!$type) $type = V::get($field_name, '', $this->_data['TYPE']);
  25. return $type;
  26. }
  27. function desc($field_name) {
  28. return V::get($field_name, '', $this->_data['DESC_TO_LANG']);
  29. }
  30. function perm($field_name) {
  31. return V::get($field_name, '', $this->_data['PERMEDIT']);
  32. }
  33. function allowWrite($field_name) {
  34. return (strpos($this->perm($field_name), 'W') !== false)? true : false;
  35. }
  36. function allowRead($field_name) {
  37. return (strpos($this->perm($field_name), 'R') !== false)? true : false;
  38. }
  39. function allowCreate($field_name) {
  40. return (strpos($this->perm($field_name), 'C') !== false)? true : false;
  41. }
  42. /**
  43. * @returns array to store in session
  44. */
  45. function toArray() {
  46. return $this->_data;
  47. }
  48. /**
  49. * Initialize column and store data i session.
  50. *
  51. * static
  52. */
  53. public static function init($table, $force = false) {
  54. $col = Column::getInstance($table);
  55. if ($col && $col->initialized() && $force == false) {
  56. return;
  57. }
  58. Lib::loadClass('Config');
  59. $tbl_config = Config::getColumnConf($table);
  60. /**
  61. * conf_file(CRM_PROCES): Array(
  62. * [CONFIG] => Array(
  63. * [database] => default
  64. * [table] => CRM_PROCES
  65. * [hist_table] => CRM_PROCES_HIST
  66. * [extra_column] =>
  67. * [perm_mask] =>
  68. * )
  69. * [DESC_TO_LANG] => Array(
  70. * [ID] =>
  71. * )
  72. * [DEFAULT_VALUE] => Array(
  73. * [A_STATUS] => WAITING
  74. * )
  75. * [PERMEDIT] => Array(
  76. * [ID] => R
  77. * )
  78. * [TYPESPECIAL] => Array(
  79. * )
  80. */
  81. if (!$tbl_config) {
  82. return;
  83. }
  84. if (!self::is_allowed($table)) {
  85. return;
  86. }
  87. $col_data = self::get_table_struct($table, $tbl_config);
  88. // DESC_TO_LANG
  89. $col_data['DESC_TO_LANG'] = V::get('DESC_TO_LANG', array(), $tbl_config);
  90. // TYPESPECIAL
  91. $col_data['TYPESPECIAL'] = V::get('TYPESPECIAL', array(), $tbl_config);
  92. $col_data['_checked'] = true;
  93. self::saveColumn($table, $col_data);
  94. }
  95. function init_old(){
  96. return;
  97. // wymagane struktura tabeli `CRM_LISTA_ZASOBOW` w tej wersji aplikacji:
  98. $column_struct = array();
  99. //ZAP_SQL("show fields from $COLUMN");// Field, Type, Null, Key, Default, Extra
  100. //$column_struct[Field] = array( Type, Type_value, Default, Null, Extra );
  101. function column_struct_create_type_obj($type, $type_value=null, $default=null, $null=null, $extra=null) {
  102. return (object)array('Type'=>$type, 'Type_value'=>$type_value, 'Default'=>$default, 'Null'=>$null, 'Extra'=>$extra);
  103. }
  104. $column_struct['ID'] = column_struct_create_type_obj('int', 11, null, 'NO', 'auto_increment');
  105. $column_struct['TYPE'] = column_struct_create_type_obj('enum', array('KONTO-KSIEGOWE-OLD', 'KONTO-KSIEGOWE-ZESPOL', 'KONTO-KSIEGOWE', 'KONTO-KSIEGOWE-GRUPA', 'DANE', 'WYNIK_ZAPYTANIA', 'NARZEDZIE', 'PLIK', 'ZASOB_PLIKOW', 'TABELA', 'KOMORKA', 'BAZA_DANYCH', 'DATABASE_MYSQL', 'SERWER', 'DOKUMENTY', 'MAGAZYN', 'SEGREGATOR', 'POMIESZCZENIE', 'MATERIAL_REKLAMOWY', 'DZIAL', 'STANOWISKO', 'INNE', 'CZYNNOSC', 'PODMIOT', 'ALARM-SATEL', 'NOTATKA'), 'INNE');
  106. $column_struct['DESC'] = column_struct_create_type_obj('varchar', 255, '');
  107. $column_struct['OPIS'] = column_struct_create_type_obj('text');
  108. $column_struct['SORT_PRIO'] = column_struct_create_type_obj('int', 11, 0);
  109. $column_struct['PARENT_ID'] = column_struct_create_type_obj('int', 11, 0);
  110. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;">';
  111. $table = "CRM_LISTA_ZASOBOW";
  112. echo"column `$table`:\n";
  113. ZAP_SQL("show fields from `$table`;");// Field, Type, Null, Key, Default, Extra
  114. while ($h = mysql_fetch_object($result)) {
  115. /* [Field] => ID
  116. [Type] => int(11)
  117. [Null] => NO
  118. [Key] => PRI
  119. [Default] =>
  120. [Extra] => auto_increment
  121. */
  122. if (array_key_exists($h->Field, $column_struct)) {
  123. echo'<b>ok Field in struct "'.$h->Field.'"</b> ' . "\n";;
  124. $d =& $column_struct[$h->Field];// application definition
  125. $h->Type_value = '';
  126. if (substr($h->Type, 0, 3) == 'int') {
  127. $h->Type_value = (int)str_replace(array(' ','(',')'), '', substr($h->Type, 4));
  128. $h->Type = 'int';
  129. } else if (substr($h->Type, 0, 7) == 'varchar') {
  130. $h->Type_value = (int)str_replace(array(' ','(',')'), '', substr($h->Type, 8));
  131. $h->Type = 'varchar';
  132. } else if (substr($h->Type, 0, 4) == 'enum') {
  133. $h->Type_value = explode(',', str_replace(array('(',')',"'",'"'), '', substr($h->Type, 5)));
  134. $h->Type = 'enum';
  135. } else if (substr($h->Type, 0, 4) == 'text') {
  136. $h->Type = 'text';
  137. } else echo'unknown Type "'.$h->Type.'"';
  138. //} else if (substr($h->Type, 0, 3) == 'int') $h->Type_value = '';
  139. // $sql = "ALTER TABLE `".$table."` CHANGE `ID` `ID` INT NOT NULL AUTO_INCREMENT; ";
  140. if ($h->Type != $d->Type) {
  141. echo'<b style="color:red">Field Type error - "'.$h->Type.'" expected "'.$d->Type.'"</b>'."\n";
  142. //TODO: try convert type ? float->double, int->float, varchar->text, ...
  143. } else if ($h->Type_value != $d->Type_value) {
  144. echo'<b style="color:red">Field Type_value error - "'.$h->Type_value.'" expected "'.$d->Type_value.'"</b>'."\n";
  145. //TODO: try to alter table
  146. } else if ($h->Default != $d->Default) {
  147. echo'<b style="color:red">Field Type_value error - "'.$h->Type_value.'" expected "'.$d->Type_value.'"</b>'."\n";
  148. //TODO: try to alter table
  149. }
  150. print_r($h);
  151. } else {
  152. echo'<em>Unknown Field "'.$h->Field.'"</em> ';
  153. //print_r($h);
  154. }
  155. echo "\n";
  156. }
  157. echo'</pre>';
  158. //$_SESSION['CRM_LISTA_ZASOBOW_COLUMN']['_checked'] = true;
  159. $COLUMN="CRM_LISTA_ZASOBOW";
  160. ZAP_SQL("show fields from $COLUMN");
  161. $KEY=0;
  162. while ($h=mysql_fetch_row($result)) {
  163. $_SESSION[$COLUMN."_COLUMN"]['DESC']["$KEY"] = $h[0];
  164. $_SESSION[$COLUMN."_COLUMN"]['TYPE'][$_SESSION[$COLUMN."_COLUMN"]['DESC']["$KEY"]] = $h[1];
  165. if(!isset($_SESSION[$COLUMN."_COLUMN"]['PERMEDIT'][$h[0]])) $_SESSION[$COLUMN."_COLUMN"]['PERMEDIT'][$h[0]] = "RW" ;
  166. $_SESSION[$COLUMN."_COLUMN"]['DESC_TO_KEY'][$h[0]] = $KEY;
  167. $_SESSION[$COLUMN."_COLUMN"]['ID']["$KEY"]=$KEY;
  168. if($_SESSION['USER_PROFILE'][$COLUMN."_COLUMN"]["$KEY"] == "HIDE") {
  169. $_SESSION[$COLUMN."_COLUMN"]['HIDE']["$KEY"]='HIDE';
  170. }
  171. $KEY++;
  172. }
  173. // echo "<br>Zainicjalizowano kolumne $COLUMN<br>";
  174. }
  175. public static function get_table_struct($tbl_name, $tbl_conf) {
  176. $col = array();
  177. //$COLUMN = $INIT_TABLE;
  178. // clean session data
  179. //$_SESSION[$COLUMN."_COLUMN"] = array();
  180. //$EXTRACOLUMN=" ";
  181. //$EXTRACOLUMN = (!empty($EXTRACOLUMN))? explode(" ", $EXTRACOLUMN) : array();
  182. //TODO2006-03 zapytanie w foreach
  183. //inicjalizacja podrecznikowych zapytan do tabel dla jednej sesji
  184. //if ($_SESSION['USERS2_MARKETING_COLUMN']['RELATIVEDB']['SQL_QUERY'][1]) {
  185. // foreach ($_SESSION['USERS2_MARKETING_COLUMN']['RELATIVEDB']['SQL_QUERY'] as $value_key => $value) {
  186. // echo "<br> Zainicjalizowano zapytanie value $value key $value_key <br> ";
  187. // ZAP_SQL($value);
  188. // }
  189. //}
  190. $database = V::get('database', null, $tbl_config['CONFIG']);
  191. $db = DB::getDB($database);
  192. $res = $db->query("show fields from `{$tbl_name}` ");
  193. $KEY = 0;
  194. $col['PERMEDIT']['ID'] = "R";
  195. $col['PERMEDIT']['A_RECORD_CREATE_DATE'] = "R";
  196. $col['PERMEDIT']['A_RECORD_UPDATE_DATE'] = "R";
  197. $col['PERMEDIT']['A_RECORD_UPDATE_AUTHOR'] = "R";
  198. $col['PERMEDIT']['A_RECORD_CREATE_AUTHOR'] = "R";
  199. while ($h = $db->fetch_row($res)) {
  200. $field_name = $h[0];
  201. $field_type = $h[1];
  202. if (empty($tbl_conf['PERMEDIT'][$field_name])) {
  203. continue;
  204. }
  205. $col['DESC']["$KEY"] = $field_name;
  206. $col['TYPE'][$col['DESC']["$KEY"]] = $field_type;
  207. //if (!isset($tbl_conf['PERMEDIT'][$field_name])) {
  208. $col['PERMEDIT'][$field_name] = $tbl_conf['PERMEDIT'][$field_name];
  209. //}
  210. $col['DESC_TO_KEY'][$field_name] = $KEY;
  211. $col['ID']["$KEY"] = $KEY;
  212. //if ($_SESSION['USER_PROFILE'][$COLUMN."_COLUMN"]["$KEY"] == "HIDE") {
  213. // $col['HIDE']["$KEY"] = 'HIDE';
  214. //}
  215. $KEY++;
  216. }
  217. if(0){
  218. foreach ($EXTRACOLUMN as $h) {
  219. $col['DESC']["$KEY"] = $h;
  220. $col['DESC_TO_KEY'][$h] = $KEY;
  221. if (!isset($col['PERMEDIT'][$h])) {
  222. $col['PERMEDIT'][$h] = "N";
  223. }
  224. $col['ID']["$KEY"] = $KEY;
  225. $TEMP1 = $col['DESC']["$KEY"];
  226. $col['TYPE'][$_SESSION[$COLUMN."_COLUMN"]['DESC']["$KEY"]] = "varchar(245)";
  227. if ($col["$KEY"] == "HIDE") {
  228. $col['HIDE']["$KEY"] = 'HIDE';
  229. }
  230. $KEY++;
  231. }
  232. }
  233. return $col;
  234. }
  235. function get_table_hist_struct($tbl_name) {
  236. $col = array();
  237. $tbl_hist_name = "{$tbl_name}_HIST";
  238. $res = DB::query("show fields from `{$tbl_hist_name}` ");
  239. $KEY = 0;
  240. while ($h = mysql_fetch_row($res)) {
  241. $col['DESC']["{$KEY}"] = $h[0];
  242. $col['TYPE'][$col['DESC']["{$KEY}"]] = $h[1];
  243. if (!isset($col['PERMEDIT'][$h[0]])) {
  244. $col['PERMEDIT'][$h[0]] = "RW";
  245. }
  246. $col['DESC_TO_KEY'][$h[0]] = $KEY;
  247. $col['ID']["{$KEY}"] = $KEY;
  248. //if ($_SESSION['USER_PROFILE'][$COLUMN."_COLUMN"]["$KEY"] == "HIDE") {
  249. // $_SESSION[$COLUMN."_COLUMN"]['HIDE']["$KEY"] = 'HIDE';
  250. //}
  251. $KEY++;
  252. }
  253. return $col;
  254. }
  255. /**
  256. * TODO: read from config file for column! @see sew
  257. * @return Boolean
  258. */
  259. public static function is_allowed($column_name) {
  260. if (empty($column_name)) {
  261. return false;
  262. }
  263. switch ($column_name) {
  264. case 'CRM_PROCES':
  265. case 'CRM_LISTA_ZASOBOW':
  266. case 'CRM_TESTY':
  267. return true;
  268. break;
  269. default:
  270. return true;// TODO: use zasoby
  271. if (is_numeric($column_name)) {
  272. // TODO: pobierz dane ProcesLog_ID
  273. return false;
  274. }
  275. }
  276. return false;
  277. }
  278. function getVisibleFieldList() {
  279. $cols = array();
  280. foreach ($this->_data['ID'] as $field_id) {
  281. $field_name = $this->_data['DESC'][$field_id];
  282. if (User::getProfileColumn($this->_table, $field_id) == 'HIDE') {
  283. continue;
  284. }
  285. $cols[$field_id] = $field_name;
  286. }
  287. return $cols;
  288. }
  289. function getFieldList() {
  290. $cols = array();
  291. foreach ($this->_data['ID'] as $field_id) {
  292. $field_name = $this->_data['DESC'][$field_id];
  293. $cols[$field_id] = $field_name;
  294. }
  295. return $cols;
  296. }
  297. /**
  298. * Get column object. Not initialize
  299. * @returns object - column instance if exists else null
  300. *
  301. * static
  302. */
  303. public static function getInstance($table) {
  304. static $_cache;
  305. if (!$_cache) $_cache = array();
  306. if (array_key_exists($table, $_cache)) {
  307. return $_cache[$table];
  308. }
  309. if (!empty($_SESSION['columns'][$table])) {
  310. $col = new Column($table, $_SESSION['columns'][$table]);
  311. if ($col->initialized()) {
  312. $_cache[$table] = $col;
  313. return $_cache[$table];
  314. }
  315. }
  316. return null;
  317. }
  318. public static function saveColumn($table, $data) {
  319. // TODO: is_allowed
  320. if (is_numeric($table)) {
  321. // TODO: $_SESSION['PROCES_LOG'][$column_name] = $data;
  322. } else {
  323. $_SESSION['columns'][$table] = $data;
  324. }
  325. if(User::isAdmin())
  326. self::saveToAcl($table,$data); //@2014-03-17 nalezy admina permy nadpisac do ACLi jezeli jest adminem
  327. }
  328. public static function saveToAcl($table,$data) {
  329. //wykrywamy czy ma dostepny proces do jakiejs komorki w tej tabeli
  330. $userAcl = User::getAcl();
  331. $tblAcl = $userAcl->getTableAcl(ProcesHelper::getZasobTableID($table));
  332. if($tblAcl)
  333. foreach($data['PERMEDIT'] as $FIELD => $PERM) {
  334. $tblAcl->setFieldPerms($tblAcl->getFieldIdByName($FIELD), $PERM);
  335. }
  336. }
  337. }