dataviewstate.class.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. <?php
  2. class dataviewState
  3. {
  4. /**
  5. * id
  6. *
  7. * @var int
  8. * @access public
  9. */
  10. public $id;
  11. /**
  12. * group
  13. *
  14. * @var string
  15. * @access public
  16. */
  17. public $group;
  18. /**
  19. * name
  20. *
  21. * @var string
  22. * @access public
  23. */
  24. public $name;
  25. /**
  26. * code
  27. *
  28. * @var string
  29. * @access public
  30. */
  31. public $code;
  32. /**
  33. * mode
  34. *
  35. * @var string
  36. * @access public
  37. */
  38. public $mode;
  39. /**
  40. * view
  41. *
  42. * @var string
  43. * @access public
  44. */
  45. public $view;
  46. /**
  47. * sql
  48. *
  49. * @var string
  50. * @access public
  51. */
  52. public $sql;
  53. /**
  54. * fields
  55. *
  56. * @var array
  57. * @access public
  58. */
  59. public $fields;
  60. /**
  61. * langs
  62. *
  63. * @var array
  64. * @access public
  65. */
  66. public $langs;
  67. /**
  68. * fieldSettings
  69. *
  70. * @var array
  71. * @access public
  72. */
  73. public $fieldSettings;
  74. /**
  75. * clientLang
  76. *
  77. * @var string
  78. * @access public
  79. */
  80. public $clientLang;
  81. /**
  82. * error
  83. *
  84. * @var bool
  85. * @access public
  86. */
  87. public $error = false;
  88. /**
  89. * errorMsg
  90. *
  91. * @var string
  92. * @access public
  93. */
  94. public $errorMsg = '';
  95. /**
  96. * queryCols
  97. *
  98. * @var array
  99. * @access public
  100. */
  101. public $queryCols = array();
  102. /**
  103. * queryData
  104. *
  105. * @var array
  106. * @access public
  107. */
  108. public $queryData = array();
  109. /**
  110. * pager
  111. *
  112. * @var int
  113. * @access public
  114. */
  115. public $pager;
  116. /**
  117. * canChangeMode
  118. *
  119. * @var bool
  120. * @access public
  121. */
  122. public $canChangeMode = true;
  123. /**
  124. * sqlbuilder
  125. *
  126. * @var array
  127. * @access public
  128. */
  129. public $sqlbuilder = array();
  130. /**
  131. * triggerQuery
  132. *
  133. * @var bool
  134. * @access public
  135. */
  136. public $triggerQuery = false;
  137. /**
  138. * __construct method.
  139. *
  140. * @access public
  141. * @return void
  142. */
  143. public function __construct($dataview, $clientLang = 'zh-cn', $sqlbuilder = array())
  144. {
  145. $this->id = $dataview->id;
  146. $this->group = $dataview->group;
  147. $this->name = $dataview->name;
  148. $this->code = $dataview->code;
  149. $this->mode = $dataview->mode;
  150. $this->view = $dataview->view;
  151. $this->sql = $dataview->sql;
  152. $this->fields = $this->json2Array($dataview->fields);
  153. $this->langs = $this->json2Array($dataview->langs);
  154. $this->sqlbuilder = $sqlbuilder;
  155. $this->clientLang = $clientLang;
  156. $this->fieldSettings = array_merge_recursive((array)$this->fields, $this->langs);
  157. $this->setPager();
  158. }
  159. /**
  160. * Update from $_POST.
  161. *
  162. * @param array $post
  163. * @access public
  164. * @return void
  165. */
  166. public function updateFromPost($post)
  167. {
  168. if(!isset($post['data'])) return;
  169. $data = json_decode($post['data'], true);
  170. foreach($data as $key => $value)
  171. {
  172. if(!empty($value['sql'])) $value['sql'] = base64_encode($value['sql']);
  173. $this->$key = $key == 'sql' ? base64_decode($value) : $value;
  174. }
  175. $this->processFieldSettingsLang();
  176. $this->canChangeMode = $this->setCanChangeMode();
  177. }
  178. /**
  179. * Set can change mode.
  180. *
  181. * @access public
  182. * @return bool
  183. */
  184. public function setCanChangeMode()
  185. {
  186. if($this->mode == 'builder') return true;
  187. if($this->mode == 'text' && empty($this->sql)) return true;
  188. return false;
  189. }
  190. /**
  191. * Clear properies before query sql.
  192. *
  193. * @access public
  194. * @return void
  195. */
  196. public function beforeQuerySql()
  197. {
  198. $this->error = false;
  199. $this->errorMsg = '';
  200. $this->queryCols = array();
  201. $this->queryData = array();
  202. }
  203. /**
  204. * Set fieldSettings with merge.
  205. *
  206. * @param array $settings
  207. * @access public
  208. * @return void
  209. */
  210. public function setFieldSettings($settings)
  211. {
  212. $settings = (array)$settings;
  213. $oldFieldSettings = !empty($this->fieldSettings) ? $this->fieldSettings : array();
  214. $newFieldSettings = array();
  215. foreach($settings as $field => $setting)
  216. {
  217. $oldSetting = isset($oldFieldSettings[$field]) ? $oldFieldSettings[$field] : array();
  218. if(!empty($oldSetting) && isset($oldSetting['type']))
  219. {
  220. $newFieldSettings[$field] = $this->processFieldSettingLang($field, $oldSetting, $setting);
  221. if($setting['type'] != $oldSetting['type'] && in_array($setting['type'], array('user', 'type'))) $newFieldSettings[$field]['type'] = $setting['type'];
  222. }
  223. else
  224. {
  225. $newFieldSettings[$field] = $this->matchFieldSettingFromBuilder($field, $setting);
  226. }
  227. }
  228. $this->fields = $this->json2Array($newFieldSettings);
  229. $this->fieldSettings = $newFieldSettings;
  230. }
  231. /**
  232. * Set field related object.
  233. *
  234. * @param array $relatedObject
  235. * @access public
  236. * @return void
  237. */
  238. public function setFieldRelatedObject($relatedObject)
  239. {
  240. $this->relatedObject = $relatedObject;
  241. }
  242. /**
  243. * Build cols for query sql with lang.
  244. *
  245. * @access public
  246. * @return object
  247. */
  248. public function buildQuerySqlCols()
  249. {
  250. $cols = array();
  251. $lang = $this->clientLang;
  252. foreach($this->fieldSettings as $field => $settings)
  253. {
  254. $settings = (array)$settings;
  255. $title = isset($settings[$lang]) ? $settings[$lang] : $field;
  256. $cols[] = array('name' => $field, 'title' => $title, 'sortType' => false);
  257. }
  258. $this->queryCols = $cols;
  259. return $this;
  260. }
  261. /**
  262. * Match field setting from builder.
  263. *
  264. * @param string $key
  265. * @param array $setting
  266. * @access public
  267. * @return array
  268. */
  269. public function matchFieldSettingFromBuilder($key, $setting)
  270. {
  271. if($this->mode == 'text') return $setting;
  272. $selects = array_merge($this->sqlbuilder->getSelects(), $this->sqlbuilder->getFuncSelects());
  273. foreach($selects as $select)
  274. {
  275. list($table, $field, $alias) = $select;
  276. if($key != $alias) continue;
  277. $fieldList = $this->sqlbuilder->getTableDescList($table);
  278. $name = zget($fieldList, $field, $field);
  279. $setting[$this->clientLang] = $name;
  280. $setting['field'] = $field;
  281. }
  282. return $setting;
  283. }
  284. /**
  285. * Process fieldSettings lang.
  286. *
  287. * @access public
  288. * @return void
  289. */
  290. public function processFieldSettingsLang()
  291. {
  292. if(empty($this->fieldSettings)) return;
  293. foreach($this->fieldSettings as $field => $fieldSetting)
  294. {
  295. $this->fieldSettings[$field] = $this->processFieldSettingLang($field, $fieldSetting);
  296. }
  297. }
  298. /**
  299. * Process fieldSetting lang.
  300. *
  301. * @param string $field
  302. * @param array $fieldSetting
  303. * @param array $newSetting
  304. * @access public
  305. * @return array
  306. */
  307. public function processFieldSettingLang($field, $oldSetting, $newSetting = array())
  308. {
  309. $lang = $this->clientLang;
  310. if(!empty($oldSetting[$lang])) return $oldSetting;
  311. if(!empty($newSetting[$lang]))
  312. {
  313. $oldSetting[$lang] = $newSetting[$lang];
  314. return $oldSetting;
  315. }
  316. $oldSetting[$lang] = isset($oldSetting['name']) ? $oldSetting['name'] : $field;
  317. return $oldSetting;
  318. }
  319. /**
  320. * Get langs.
  321. *
  322. * @param string $type
  323. * @access public
  324. * @return object|string
  325. */
  326. public function getFields($type = 'object')
  327. {
  328. $fieldSettings = $this->fieldSettings;
  329. if(empty($fieldSettings)) return null;
  330. $fields = array();
  331. $keys = array('object', 'field', 'type');
  332. foreach($fieldSettings as $fieldKey => $fieldSetting)
  333. {
  334. $field = array();
  335. foreach($keys as $key)
  336. {
  337. if(isset($fieldSetting[$key])) $field[$key] = $fieldSetting[$key];
  338. }
  339. $fields[$fieldKey] = $field;
  340. }
  341. return $type == 'object' ? $fields : json_encode($fields);
  342. }
  343. /**
  344. * Get langs.
  345. *
  346. * @param string $type
  347. * @access public
  348. * @return object|string
  349. */
  350. public function getLangs($type = 'object')
  351. {
  352. $fieldSettings = $this->fieldSettings;
  353. if(empty($fieldSettings)) return null;
  354. $langs = array();
  355. $keys = array('object', 'field', 'type');
  356. foreach($fieldSettings as $fieldKey => $fieldSetting)
  357. {
  358. $lang = array();
  359. foreach($fieldSetting as $key => $value)
  360. {
  361. if(!in_array($key, $keys)) $lang[$key] = $value;
  362. }
  363. $langs[$fieldKey] = $lang;
  364. }
  365. return $type == 'object' ? $langs : json_encode($langs);
  366. }
  367. /**
  368. * Judge is error.
  369. *
  370. * @access public
  371. * @return bool
  372. */
  373. public function isError()
  374. {
  375. return $this->error;
  376. }
  377. /**
  378. * Get error message.
  379. *
  380. * @access public
  381. * @return string
  382. */
  383. public function getError()
  384. {
  385. return $this->errorMsg;
  386. }
  387. /**
  388. * Set error.
  389. *
  390. * @param string $msg
  391. * @access public
  392. * @return object
  393. */
  394. public function setError($msg)
  395. {
  396. $this->error = true;
  397. $this->errorMsg = $msg;
  398. return $this;
  399. }
  400. /**
  401. * Set pager
  402. *
  403. * @param int $total
  404. * @param int $recPerPage
  405. * @param int $pageID
  406. * @access public
  407. * @return void
  408. */
  409. public function setPager($total = 0, $recPerPage = 10, $pageID = 1)
  410. {
  411. $this->pager = array();
  412. $this->pager['total'] = $total;
  413. $this->pager['recPerPage'] = $recPerPage;
  414. $this->pager['pageID'] = $pageID;
  415. $this->pager['pageTotal'] = $total % $recPerPage == 0 ? (int)($total / $recPerPage) : (int)($total / $recPerPage) + 1;
  416. }
  417. /**
  418. * Convert json string to array.
  419. *
  420. * @param string|object|array|null $json
  421. * @access public
  422. * @return array
  423. */
  424. private function json2Array($json)
  425. {
  426. if(empty($json)) return array();
  427. if(is_string($json)) return json_decode($json, true);
  428. if(is_object($json) || is_array($json)) return json_decode(json_encode($json), true);
  429. return $json;
  430. }
  431. }