Update.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. <?php namespace Manage\Api\Page;
  2. use Dever;
  3. use Manage\Lib\Page;
  4. # 更新页
  5. class Update extends Page
  6. {
  7. public function __construct($load = '', $id = false)
  8. {
  9. parent::__construct('update', $load, $id);
  10. }
  11. public function get(&$value = array(), &$option = array())
  12. {
  13. $func = $this->checkFunc();
  14. $remote = $show = $spec = array();
  15. $data['update'] = $data['field'] = $data['option'] = array();
  16. $this->setting('field', $data['update'], true, 'text');
  17. foreach ($data['update'] as $k => $v) {
  18. if ($v['type'] == 'tree' || $v['type'] == 'upload') {
  19. $v['value'] = array();
  20. }
  21. if (isset($v['remote'])) {
  22. $remote[$v['key']] = array($k, $v['remote'], $v['key']);
  23. }
  24. if (isset($v['spec_data'])) {
  25. $spec[$v['key']] = array($k, $v['spec_data'], $v['key'] . '_spec');
  26. }
  27. if (isset($v['show']) && is_string($v['show'])) {
  28. $show[$v['key']] = array($k, $v['show']);
  29. }
  30. $data['field'][$v['key']] = $v['value'];
  31. if ($v['type'] == 'sku') {
  32. $data['field'][$v['key'] . '_spec'] = [];
  33. }
  34. if (isset($v['option'])) {
  35. $data['option'][$v['key']] = $v['option'];
  36. unset($data['update'][$k]['option']);
  37. }
  38. }
  39. $this->column($data);
  40. $data['info_id'] = false;
  41. if (!$this->info && $data['column'] && $data['column']['where'] == 'id') {
  42. $this->info = $this->db->find($data['column']['active']);
  43. if ($this->info) {
  44. $data['info_id'] = $this->info['id'];
  45. if (!$func) {
  46. $func = $this->getFunc('edit', '编辑', 1);
  47. if (!$func) {
  48. Dever::error('无操作权限');
  49. }
  50. }
  51. }
  52. } elseif (!$func) {
  53. $func = $this->getFunc('update', '更新', 1);
  54. if (!$func) {
  55. Dever::error('无操作权限');
  56. }
  57. }
  58. if ($this->info) {
  59. $info = $this->info;
  60. $this->setInfo($info, $data, $remote, $show);
  61. if ($spec) {
  62. foreach ($spec as $k => $v) {
  63. $data['update'][$spec[$k][0]]['remote'] = Dever::url($spec[$k][1]);
  64. $result = Dever::call($spec[$k][1], array($this->info['id']));
  65. if ($result) {
  66. $data['field'][$spec[$k][2]] = $result;
  67. }
  68. }
  69. }
  70. } elseif ($value) {
  71. foreach ($value as $k => &$v) {
  72. $this->setInfo($v, $data, $remote, $show, 2);
  73. $option[$k] = $data['option'];
  74. }
  75. } else {
  76. if ($remote) {
  77. $info = array();
  78. foreach ($remote as $k => $v) {
  79. $data['update'][$v[0]]['remote'] = Dever::url($v[1]);
  80. if (isset($v[2]) && isset($data['option'][$v[2]]) && $data['option'][$v[2]] & $m = Dever::isset($data['option'][$v[2]][0], 'id')) {
  81. $result = Dever::call($v[1], array($m), 'api');
  82. if ($result) {
  83. $this->setUpdate($info, $data, $result);
  84. }
  85. }
  86. }
  87. }
  88. if ($show) {
  89. foreach ($show as $k => $v) {
  90. $data['update'][$v[0]]['show'] = true;
  91. }
  92. }
  93. }
  94. $data['desc'] = $this->config['desc'] ?? '';
  95. $data['drag'] = $this->config['drag'] ?? false;
  96. $this->layout($data);
  97. $this->tab($data, 'step');
  98. if (!$data['step']) {
  99. $this->tab($data);
  100. }
  101. $this->control($data);
  102. return $data;
  103. }
  104. private function setInfo(&$info, &$data, $remote, $show, $type = 1)
  105. {
  106. foreach ($info as $k => $v) {
  107. if (isset($data['field'][$k])) {
  108. if (is_array($data['field'][$k])) {
  109. if ($v) {
  110. $v = explode(',', $v);
  111. } else {
  112. $v = array();
  113. }
  114. }
  115. if (isset($this->config['field'][$k]) && isset($this->config['field'][$k]['update'])) {
  116. $v = $this->config['field'][$k]['update'];
  117. }
  118. if ($type == 1) {
  119. $data['field'][$k] = $v;
  120. }
  121. if (isset($remote[$k])) {
  122. $data['update'][$remote[$k][0]]['remote'] = Dever::url($remote[$k][1]);
  123. $result = Dever::call($remote[$k][1], array($v), 'api');
  124. if ($result) {
  125. $this->setUpdate($info, $data, $result);
  126. }
  127. }
  128. if (isset($show[$k])) {
  129. $data['update'][$show[$k][0]]['show'] = $this->getShow($show[$k][1], $info);
  130. }
  131. }
  132. }
  133. }
  134. private function setUpdate(&$info, &$data, $result)
  135. {
  136. foreach ($data['update'] as $k => $v) {
  137. if (isset($result[$v['key']])) {
  138. if (isset($result[$v['key']]['option'])) {
  139. $data['option'][$v['key']] = $result[$v['key']]['option'];
  140. unset($result[$v['key']]['option']);
  141. }
  142. if (empty($data['field'][$v['key']]) && isset($result[$v['key']]['value'])) {
  143. $data['field'][$v['key']] = $result[$v['key']]['value'];
  144. }
  145. if (isset($result[$v['key']]['set']) && $info) {
  146. $info = array_merge($info, $result[$v['key']]['set']);
  147. }
  148. $data['update'][$k] = array_merge($data['update'][$k], $result[$v['key']]);
  149. }
  150. }
  151. }
  152. private function control(&$data)
  153. {
  154. $data['control'] = array();
  155. if (isset($this->config['control']) && $data['control'] = $this->config['control']) {
  156. foreach ($data['control'] as $k => $v) {
  157. foreach ($data['update'] as $k1 => $v1) {
  158. if ($v1['key'] == $k) {
  159. $show = true;
  160. foreach ($v as $k2 => $v2) {
  161. if (is_array($v2)) {
  162. $temp = false;
  163. foreach ($v2 as $k3 => $v3) {
  164. if (is_array($data['field'][$k2]) && in_array($v3, $data['field'][$k2])) {
  165. $temp = true;
  166. } elseif ($data['field'][$k2] == $v3) {
  167. $temp = true;
  168. }
  169. }
  170. $show = $temp;
  171. } else {
  172. if (is_array($data['field'][$k2]) && !in_array($v2, $data['field'][$k2])) {
  173. $show = false;
  174. } elseif ($data['field'][$k2] != $v2) {
  175. $show = false;
  176. }
  177. }
  178. }
  179. $data['update'][$k1]['show'] = $show;
  180. }
  181. }
  182. }
  183. }
  184. }
  185. private function tab(&$data, $type = 'tab')
  186. {
  187. $field = Dever::input('field');
  188. $data[$type] = array();
  189. if (empty($data['layout']) && !$field && isset($this->config[$type])) {
  190. foreach ($this->config[$type] as $k => $v) {
  191. if (is_string($v)) {
  192. $field = array();
  193. $data[$type][] = array
  194. (
  195. 'name' => $k,
  196. 'update' => $this->getUpdate($v, $data['update'], $field),
  197. 'field' => $field,
  198. );
  199. } else {
  200. $field = array();
  201. $result = array();
  202. $result['name'] = $k;
  203. foreach ($v as $v1) {
  204. $result['layout'][] = $this->getUpdate($v1, $data['update'], $field);
  205. }
  206. $result['field'] = $field;
  207. $data[$type][] = $result;
  208. }
  209. }
  210. $data['update'] = array();
  211. }
  212. }
  213. private function layout(&$data)
  214. {
  215. $field = Dever::input('field');
  216. $data['layout'] = array();
  217. if (!$field && isset($this->config['layout'])) {
  218. foreach ($this->config['layout'] as $k => $v) {
  219. $field = array();
  220. $data['layout'][] = $this->getUpdate($v, $data['update'], $field);
  221. }
  222. $data['update'] = array();
  223. }
  224. }
  225. private function getUpdate($set, $update, &$field)
  226. {
  227. $result = array();
  228. if (is_string($set)) {
  229. $set = explode(',', $set);
  230. foreach ($set as $k => $v) {
  231. foreach ($update as $value) {
  232. if ($value['key'] == $v) {
  233. $result[] = $value;
  234. $field[] = $v;
  235. }
  236. }
  237. }
  238. } else {
  239. foreach ($set as $k => $v) {
  240. foreach ($update as $value) {
  241. if ($value['key'] == $k) {
  242. $result[] = array('span' => $v, 'update' => array($value));
  243. $field[] = $k;
  244. }
  245. }
  246. }
  247. }
  248. return $result;
  249. }
  250. public function do_commit(){}
  251. public function do()
  252. {
  253. $this->checkFunc();
  254. $update = array();
  255. $this->setting('field', $update, true, 'text');
  256. if ($update) {
  257. $data = $other = $sku = array();
  258. $input = Dever::input();
  259. $id = false;
  260. if (isset($input['id']) && $input['id'] > 0) {
  261. $id = $input['id'];
  262. }
  263. foreach ($update as $k => $v) {
  264. if (isset($input[$v['key']])) {
  265. if (isset($v['rules'])) {
  266. $this->checkRules($v, $input[$v['key']]);
  267. }
  268. if ($v['type'] == 'sku') {
  269. $sku[$v['key']] = array($v['where'], $v['content']['field'], $v['spec'], $v['spec_field'], $input[$v['key'] . '_spec'], $input[$v['key']]);
  270. } elseif (strpos($v['key'], '/')) {
  271. $other[$v['key']] = array($v['where'], $v['content']['field'], $v['content']['drag'], $input[$v['key']]);
  272. } else {
  273. $this->doData($data, $v['key'], $input[$v['key']]);
  274. }
  275. } elseif ($id) {
  276. $data[$v['key']] = '';
  277. }
  278. if (isset($data[$v['key']]) && !$data[$v['key']] && isset($v['empty']) && !$v['empty']) {
  279. unset($data[$v['key']]);
  280. }
  281. }
  282. if (!$data) {
  283. Dever::error('无效数据');
  284. }
  285. $this->exists($id, $data);
  286. $this->start($id, $data);
  287. if ($id) {
  288. $info = $this->db->find($id);
  289. if ($info) {
  290. $state = $this->db->update($info['id'], $data);
  291. if ($state) {
  292. $id = $info['id'];
  293. }
  294. } else {
  295. $data['id'] = $id;
  296. $id = $this->db->insert($data);
  297. }
  298. } else {
  299. $id = $this->db->insert($data);
  300. }
  301. if (!$id) {
  302. Dever::error('操作失败');
  303. }
  304. $this->end($id, $data);
  305. $this->other($id, $data, $other);
  306. $this->sku($id, $data, $sku);
  307. return '操作成功';
  308. }
  309. }
  310. private function doData(&$data, $key, $value)
  311. {
  312. if (is_array($value)) {
  313. if (isset($value[0])) {
  314. $value = ltrim(implode(',', $value), ',');
  315. } else {
  316. $value = Dever::json_encode($value);
  317. }
  318. }
  319. if ($value && isset($this->config['field'][$key]) && $handle = Dever::isset($this->config['field'][$key], 'handle')) {
  320. $value = Dever::call($handle, array($value));
  321. if (is_array($value) && isset($value[$key])) {
  322. foreach ($value as $k => $v) {
  323. $data[$k] = $v;
  324. }
  325. return;
  326. }
  327. }
  328. $data[$key] = $value;
  329. }
  330. private function exists($id, $data)
  331. {
  332. if (isset($this->config['check']) && $this->config['check']) {
  333. $check = explode(',', $this->config['check']);
  334. $where = array();
  335. $name = array();
  336. foreach ($check as $k => $v) {
  337. if (isset($data[$v])) {
  338. if (isset($this->config['field'][$v]) && isset($this->config['field'][$v]['name'])) {
  339. $n = $this->config['field'][$v]['name'];
  340. } elseif (isset($this->db->config['struct'][$v])) {
  341. $n = $this->db->config['struct'][$v]['name'];
  342. } else {
  343. $n = $v;
  344. }
  345. $where[$v] = $data[$v];
  346. $name[] = $n;
  347. }
  348. }
  349. if ($where) {
  350. if ($id) {
  351. $where['id'] = array('!=', $id);
  352. }
  353. $info = $this->db->find($where);
  354. if ($info) {
  355. $name = implode('、', $name);
  356. Dever::error($name . '已存在');
  357. }
  358. }
  359. }
  360. }
  361. private function start($id, &$data)
  362. {
  363. if (isset($this->config['start']) && $this->config['start']) {
  364. $data['id'] = $id;
  365. $data = Dever::call($this->config['start'], array($data));
  366. }
  367. }
  368. private function end($id, $data)
  369. {
  370. if (isset($this->config['end']) && $this->config['end']) {
  371. $data['id'] = $id;
  372. Dever::call($this->config['end'], array($data));
  373. }
  374. }
  375. private function other($rid, $data, $other)
  376. {
  377. if ($other) {
  378. foreach ($other as $k => $v) {
  379. if (strpos($k, '#')) {
  380. $k = str_replace('#', '', $k);
  381. }
  382. $common = $v[0];
  383. $update = $v[1];
  384. $drag = $v[2];
  385. $input = $v[3];
  386. $value = array();
  387. foreach ($input as $k1 => $v1) {
  388. if (isset($v1['id'])) {
  389. $value['id'] = $v1['id'];
  390. }
  391. foreach ($common as $k2 => $v2) {
  392. if (!is_array($v2)) {
  393. if ($v2 == 'id') {
  394. $value[$k2] = $rid;
  395. } elseif (isset($data[$v2])) {
  396. $value[$k2] = $data[$v2];
  397. } else {
  398. $value[$k2] = $v2;
  399. }
  400. }
  401. }
  402. foreach ($update as $k2 => $v2) {
  403. if (isset($v1[$k2])) {
  404. $value[$k2] = $v1[$k2];
  405. }
  406. }
  407. if ($drag) {
  408. $value[$drag] = $k1+1;
  409. }
  410. if (isset($value['id']) && $value['id'] > 0) {
  411. $id = $value['id'];
  412. unset($value['id']);
  413. Dever::db($k)->update($id, $value);
  414. } else {
  415. Dever::db($k)->insert($value);
  416. }
  417. }
  418. }
  419. }
  420. }
  421. private function sku($rid, $data, $sku)
  422. {
  423. if ($sku) {
  424. foreach ($sku as $k => $v) {
  425. if (strpos($k, '#')) {
  426. $k = str_replace('#', '', $k);
  427. }
  428. $common = $v[0];
  429. $update = $v[1];
  430. $spec_table = $v[2];
  431. $spec_value_table = $spec_table . '_value';
  432. $spec_field = $v[3];
  433. $spec = $v[4];
  434. $input = $v[5];
  435. $value = $spec_value = array();
  436. Dever::db($spec_table)->update(array($spec_field => $rid), array('state' => 2));
  437. Dever::db($spec_value_table)->update(array($spec_field => $rid), array('state' => 2));
  438. foreach ($spec as $k1 => &$v1) {
  439. $spec_data = array();
  440. $spec_data['state'] = 1;
  441. $spec_data[$spec_field] = $rid;
  442. $spec_data['name'] = $v1['name'];
  443. $spec_data['sort'] = $k1+1;
  444. if (isset($v1['id']) && $v1['id']) {
  445. Dever::db($spec_table)->update($v1['id'], $spec_data);
  446. } else {
  447. $v1['id'] = Dever::db($spec_table)->insert($spec_data);
  448. }
  449. if ($v1['id']) {
  450. foreach ($v1['value'] as $k2 => &$v2) {
  451. $spec_value_data = array();
  452. $spec_value_data['state'] = 1;
  453. $spec_value_data[$spec_field] = $rid;
  454. $spec_value_data['spec_id'] = $v1['id'];
  455. $spec_value_data['value'] = $v2['value'] ?? $v2['name'];
  456. $spec_value_data['sort'] = $k2+1;
  457. $spec_value_data['is_checked'] = $v2['checked'] == 'true' ? 1 : 2;
  458. if (isset($v2['id']) && $v2['id']) {
  459. Dever::db($spec_value_table)->update($v2['id'], $spec_value_data);
  460. } else {
  461. $v2['id'] = Dever::db($spec_value_table)->insert($spec_value_data);
  462. }
  463. $spec_value[$spec_data['name']][$spec_value_data['value']] = array($v1['id'] . '_' . $v2['id'], $spec_data['sort']);
  464. }
  465. }
  466. }
  467. Dever::db($spec_table)->delete(array($spec_field => $rid, 'state' => 2));
  468. Dever::db($spec_value_table)->delete(array($spec_field => $rid, 'state' => 2));
  469. Dever::db($k)->update(array($spec_field => $rid), array('state' => 2));
  470. foreach ($input as $k1 => $v1) {
  471. if (isset($v1['id'])) {
  472. $value['id'] = $v1['id'];
  473. }
  474. foreach ($common as $k2 => $v2) {
  475. if (!is_array($v2)) {
  476. if ($v2 == 'id') {
  477. $value[$k2] = $rid;
  478. } elseif (isset($data[$v2])) {
  479. $value[$k2] = $data[$v2];
  480. } else {
  481. $value[$k2] = $v2;
  482. }
  483. }
  484. }
  485. foreach ($update as $k2 => $v2) {
  486. if (isset($v1[$k2])) {
  487. $value[$k2] = $v1[$k2];
  488. }
  489. }
  490. $value['key'] = array();
  491. foreach ($v1 as $k2 => $v2) {
  492. if (isset($spec_value[$k2]) && isset($spec_value[$k2][$v2])) {
  493. $value['key'][$spec_value[$k2][$v2][1]] = $spec_value[$k2][$v2][0];
  494. }
  495. }
  496. if ($value['key']) {
  497. $value['key'] = implode(',' , $value['key']);
  498. }
  499. $value['state'] = 1;
  500. if (isset($value['id']) && $value['id'] > 0) {
  501. $id = $value['id'];
  502. unset($value['id']);
  503. Dever::db($k)->update($id, $value);
  504. } else {
  505. Dever::db($k)->insert($value);
  506. }
  507. }
  508. Dever::db($k)->delete(array($spec_field => $rid, 'state' => 2));
  509. }
  510. }
  511. }
  512. }