| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574 | 
							- <?php namespace Manage\Api\Page;
 
- use Dever;
 
- use Manage\Lib\Page;
 
- # 更新页
 
- class Update extends Page
 
- {
 
-     public function __construct($load = '', $input = true)
 
-     {
 
-         parent::__construct('update', $load, $input);
 
-     }
 
-     public function get(&$value = array(), &$option = array())
 
-     {
 
-         $func = $this->checkFunc();
 
-         $remote = $show = $spec = $source = $default = array();
 
-         $data['update'] = $data['field'] = $data['option'] = array();
 
-         $this->setting('field', $data['update'], true, 'text');
 
-         foreach ($data['update'] as $k => $v) {
 
-             if ($v['type'] == 'tree' || $v['type'] == 'upload' || $v['type'] == 'cascader' || $v['type'] == 'checkbox' || isset($v['multiple'])) {
 
-                 $v['value'] = array();
 
-             }
 
-             if (isset($v['source'])) {
 
-                 $source[$v['key']] = $v['source'];
 
-             }
 
-             if (isset($v['remote'])) {
 
-                 $remote[$v['key']] = array($k, $v['remote'], $v['key']);
 
-                 if (isset($v['remote_default']) && !$v['remote_default']) {
 
-                     unset($remote[$v['key']][2]);
 
-                 }
 
-             }
 
-             if (isset($v['spec_data'])) {
 
-                 $spec[$v['key']] = array($k, $v['spec_data'], $v['key'] . '_spec');
 
-             }
 
-             if (isset($v['show']) && is_string($v['show'])) {
 
-                 $show[$v['key']] = array($k, $v['show']);
 
-             }
 
-             if (isset($v['default']) && is_string($v['default']) && strstr($v['default'], '{')) {
 
-                 $default[$v['key']] = array($k, $v['default']);
 
-             }
 
-             $data['field'][$v['key']] = $v['value'];
 
-             if ($v['type'] == 'sku') {
 
-                 $data['field'][$v['key'] . '_spec'] = [];
 
-             }
 
-             if (isset($v['option'])) {
 
-                 $data['option'][$v['key']] = $v['option'];
 
-                 unset($data['update'][$k]['option']);
 
-             }
 
-         }
 
-         $this->column($data);
 
-         $data['info_id'] = false;
 
-         if (!$this->info && $data['column'] && $data['column']['where'] == 'id') {
 
-             $this->info = $this->db->find($data['column']['active']);
 
-             if ($this->info) {
 
-                 $data['info_id'] = $this->info['id'];
 
-                 if (!$func) {
 
-                     $func = $this->getFunc('edit', '编辑', 1);
 
-                     if (!$func) {
 
-                         Dever::error('无操作权限');
 
-                     }
 
-                 }
 
-             }
 
-         } elseif (!$func) {
 
-             $func = $this->getFunc('update', '更新', 1);
 
-             if (!$func) {
 
-                 Dever::error('无操作权限');
 
-             }
 
-         }
 
-         if ($this->info) {
 
-             $info = $this->info;
 
-             $this->setInfo($info, $data, $remote, $show, $source, $default);
 
-             if ($spec) {
 
-                 foreach ($spec as $k => $v) {
 
-                     $data['update'][$spec[$k][0]]['remote'] = Dever::url($spec[$k][1]);
 
-                     $result = Dever::call($spec[$k][1], array($this->info['id']));
 
-                     if ($result) {
 
-                         $data['field'][$spec[$k][2]] = $result;
 
-                     }
 
-                 }
 
-             }
 
-         } elseif ($value) {
 
-             foreach ($value as $k => &$v) {
 
-                 $this->setInfo($v, $data, $remote, $show, $source, $default, 2);
 
-                 $option[$k] = $data['option'];
 
-             }
 
-             if (isset($data['reset'])) {
 
-                 foreach ($data['reset'] as $k1 => $v1) {
 
-                     if (isset($data['option'][$k1])) {
 
-                         unset($data['option'][$k1]);
 
-                         $data['field'][$k1] = $v1;
 
-                     }
 
-                 }
 
-             }
 
-         } else {
 
-             if ($remote) {
 
-                 $info = array();
 
-                 foreach ($remote as $k => $v) {
 
-                     $data['update'][$v[0]]['remote'] = Dever::url($v[1]);
 
-                     if (isset($v[2]) && isset($data['option'][$v[2]]) && $data['option'][$v[2]] && $m = Dever::isset($data['option'][$v[2]][0], 'id')) {
 
-                         $result = Dever::call($v[1], array($m), 'api');
 
-                         if ($result) {
 
-                             $this->setUpdate($info, $data, $result);
 
-                         }
 
-                     }
 
-                 }
 
-             }
 
-             if ($show) {
 
-                 foreach ($show as $k => $v) {
 
-                     $data['update'][$v[0]]['show'] = true;
 
-                 }
 
-             }
 
-         }
 
-         
 
-         $data['desc'] = $this->config['desc'] ?? '';
 
-         $data['drag'] = $this->config['drag'] ?? false;
 
-         $this->layout($data);
 
-         $this->control($data);
 
-         $this->tab($data, 'step');
 
-         if (!$data['step']) {
 
-             $this->tab($data);
 
-         }
 
-         return $data;
 
-     }
 
-     private function setInfo(&$info, &$data, $remote, $show, $source, $default, $type = 1)
 
-     {
 
-         if ($source) {
 
-             foreach ($source as $k => $v) {
 
-                 $t = array();
 
-                 foreach ($v as $v1) {
 
-                     $t[] = $info[$v1] ?? '';
 
-                 }
 
-                 $info[$k] = implode(',', $t);
 
-             }
 
-         }
 
-         foreach ($info as $k => $v) {
 
-             if (isset($data['field'][$k])) {
 
-                 if (is_array($data['field'][$k])) {
 
-                     if ($v) {
 
-                         $v = explode(',', $v);
 
-                     } else {
 
-                         $v = array();
 
-                     }
 
-                     $info[$k] = $v;
 
-                 }
 
-                 if (isset($this->config['field'][$k]) && isset($this->config['field'][$k]['update'])) {
 
-                     $v = $this->config['field'][$k]['update'];
 
-                 }
 
-                 if (strstr($k, 'date')) {
 
-                     $v = date('Y-m-d H:i:s', $v);
 
-                 }
 
-                 if ($type == 1) {
 
-                     $data['field'][$k] = $v;
 
-                 }
 
-                 if (isset($remote[$k])) {
 
-                     $data['update'][$remote[$k][0]]['remote'] = Dever::url($remote[$k][1]);
 
-                     $result = Dever::call($remote[$k][1], array($v), 'api');
 
-                     if ($result) {
 
-                         $this->setUpdate($info, $data, $result);
 
-                     }
 
-                 }
 
-                 if (isset($show[$k])) {
 
-                     $data['update'][$show[$k][0]]['show'] = $this->getShow($show[$k][1], $info);
 
-                 }
 
-             }
 
-         }
 
-         if ($default) {
 
-             foreach ($default as $k => $v) {
 
-                 $data['update'][$v[0]]['value'] = $this->getShow($v[1], $info);
 
-                 $data['field'][$k] = $this->getShow($v[1], $info);
 
-             }
 
-         }
 
-     }
 
-     private function setUpdate(&$info, &$data, $result, $remote = array())
 
-     {
 
-         foreach ($data['update'] as $k => $v) {
 
-             if (isset($result[$v['key']])) {
 
-                 # 批量更新时,默认数据需要重置
 
-                 if (!isset($data['reset'][$v['key']])) {
 
-                     $data['reset'][$v['key']] = $data['field'][$v['key']];
 
-                 }
 
-                 if (isset($result[$v['key']]['option'])) {
 
-                     $data['option'][$v['key']] = $result[$v['key']]['option'];
 
-                     unset($result[$v['key']]['option']);
 
-                 }
 
-                 if (empty($data['field'][$v['key']]) && isset($result[$v['key']]['value'])) {
 
-                     if (is_array($data['field'][$v['key']]) && !is_array($result[$v['key']]['value'])) {
 
-                         $data['field'][$v['key']] = explode(',', $result[$v['key']]['value']);
 
-                     } else {
 
-                         $data['field'][$v['key']] = $result[$v['key']]['value'];
 
-                     }
 
-                 }
 
-                 if (isset($result[$v['key']]['set']) && $info) {
 
-                     $info = array_merge($info, $result[$v['key']]['set']);
 
-                 }
 
-                 $data['update'][$k] = array_merge($data['update'][$k], $result[$v['key']]);
 
-             }
 
-         }
 
-     }
 
-     private function control(&$data)
 
-     {
 
-         $data['control'] = array();
 
-         if (isset($this->config['control']) && $data['control'] = $this->config['control']) {
 
-             foreach ($data['control'] as $k => $v) {
 
-                 foreach ($data['update'] as $k1 => $v1) {
 
-                     if ($v1['key'] == $k) {
 
-                         $show = true;
 
-                         foreach ($v as $k2 => $v2) {
 
-                             if (is_array($v2)) {
 
-                                 $temp = false;
 
-                                 foreach ($v2 as $k3 => $v3) {
 
-                                     if (is_array($data['field'][$k2]) && in_array($v3, $data['field'][$k2])) {
 
-                                         $temp = true;
 
-                                     } elseif ($data['field'][$k2] == $v3) {
 
-                                         $temp = true;
 
-                                     }
 
-                                 }
 
-                                 $show = $temp;
 
-                             } else {
 
-                                 if (is_array($data['field'][$k2]) && !in_array($v2, $data['field'][$k2])) {
 
-                                     $show = false;
 
-                                 } elseif ($data['field'][$k2] != $v2) {
 
-                                     $show = false;
 
-                                 }
 
-                             }
 
-                         }
 
-                         $data['update'][$k1]['show'] = $show;
 
-                     }
 
-                 } 
 
-             }
 
-         }
 
-     }
 
-     private function tab(&$data, $type = 'tab')
 
-     {
 
-         $field = $this->input('field', '');
 
-         $data[$type] = array();
 
-         if (empty($data['layout']) && !$field && isset($this->config[$type])) {
 
-             foreach ($this->config[$type] as $k => $v) {
 
-                 if (is_string($v)) {
 
-                     $field = array();
 
-                     $data[$type][] = array
 
-                     (
 
-                         'name' => $k,
 
-                         'update' => $this->getUpdate($v, $data['update'], $field),
 
-                         'field' => $field,
 
-                     );
 
-                 } else {
 
-                     $field = array();
 
-                     $result = array();
 
-                     $result['name'] = $k;
 
-                     foreach ($v as $v1) {
 
-                         $result['layout'][] = $this->getUpdate($v1, $data['update'], $field);
 
-                     }
 
-                     $result['field'] = $field;
 
-                     $data[$type][] = $result;
 
-                 }
 
-             }
 
-             $data['update'] = array();
 
-         }
 
-     }
 
-     private function layout(&$data)
 
-     {
 
-         $field = $this->input('field', '');
 
-         $data['layout'] = array();
 
-         if (!$field && isset($this->config['layout'])) {
 
-             foreach ($this->config['layout'] as $k => $v) {
 
-                 $field = array();
 
-                 $data['layout'][] = $this->getUpdate($v, $data['update'], $field);
 
-             }
 
-             $data['update'] = array();
 
-         }
 
-     }
 
-     private function getUpdate($set, $update, &$field)
 
-     {
 
-         $result = array();
 
-         if (is_string($set)) {
 
-             $set = explode(',', $set);
 
-             foreach ($set as $k => $v) {
 
-                 foreach ($update as $value) {
 
-                     if ($value['key'] == $v) {
 
-                         $result[] = $value;
 
-                         $field[] = $v;
 
-                     }
 
-                 }
 
-             }
 
-         } else {
 
-             foreach ($set as $k => $v) {
 
-                 foreach ($update as $value) {
 
-                     if ($value['key'] == $k) {
 
-                         $result[] = array('span' => $v, 'update' => array($value));
 
-                         $field[] = $k;
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-         return $result;
 
-     }
 
-     public function do_commit(){}
 
-     public function do()
 
-     {
 
-         $this->checkFunc();
 
-         $update = array();
 
-         $this->setting('field', $update, true, 'text');
 
-         if ($update) {
 
-             $data = $other = $sku = array();
 
-             $input = Dever::input();
 
-             $id = false;
 
-             if (isset($input['id']) && $input['id'] > 0) {
 
-                 $id = $input['id'];
 
-             }
 
-             foreach ($update as $k => $v) {
 
-                 if (isset($input[$v['key']])) {
 
-                     if (isset($v['rules'])) {
 
-                         $this->checkRules($v, $input[$v['key']]);
 
-                     }
 
-                     if ($v['type'] == 'sku') {
 
-                         $sku[$v['key']] = array($v['where'], $v['content']['field'], $v['spec'], $v['spec_field'], $input[$v['key'] . '_spec'], $input[$v['key']]);
 
-                     } elseif (strpos($v['key'], '/')) {
 
-                         $other[$v['key']] = array($v['where'], $v['content']['field'], $v['content']['drag'], $input[$v['key']]);
 
-                     } else {
 
-                         $this->doData($data, $v['key'], $input[$v['key']]);
 
-                     }
 
-                 } elseif ($id) {
 
-                     $data[$v['key']] = '';
 
-                 }
 
-                 if (isset($data[$v['key']]) && !$data[$v['key']] && isset($v['empty']) && !$v['empty']) {
 
-                     unset($data[$v['key']]);
 
-                 }
 
-             }
 
-             if (!$data && !$other && !$sku) {
 
-                 Dever::error('无效数据');
 
-             }
 
-             if ($data) {
 
-                 $this->exists($id, $data);
 
-                 $this->start($id, $data);
 
-                 if ($id) {
 
-                     $info = $this->db->find($id);
 
-                     if ($info) {
 
-                         $state = $this->db->update($info['id'], $data);
 
-                         if ($state) {
 
-                             $id = $info['id'];
 
-                         }
 
-                     } else {
 
-                         $data['id'] = $id;
 
-                         $id = $this->db->insert($data);
 
-                     }
 
-                 } else {
 
-                     $id = $this->db->insert($data);
 
-                 }
 
-             }
 
-             if (!$id) {
 
-                 Dever::error('操作失败');
 
-             }
 
-             $this->other($id, $data, $other);
 
-             $this->sku($id, $data, $sku);
 
-             $this->end($id, $data);
 
-             return '操作成功';
 
-         }
 
-     }
 
-     private function doData(&$data, $key, $value)
 
-     {
 
-         if (is_array($value)) {
 
-             if (isset($value[0])) {
 
-                 $value = ltrim(implode(',', $value), ',');
 
-             } else {
 
-                 $value = Dever::json_encode($value);
 
-             }
 
-         }
 
-         if ($value && isset($this->config['field'][$key]) && $handle = Dever::isset($this->config['field'][$key], 'handle')) {
 
-             $value = Dever::call($handle, array($value));
 
-             if (is_array($value) && isset($value[$key])) {
 
-                 foreach ($value as $k => $v) {
 
-                     $data[$k] = trim($v);
 
-                 }
 
-                 return;
 
-             }
 
-         }
 
-         $data[$key] = trim($value);
 
-     }
 
-     private function exists($id, $data)
 
-     {
 
-         if (isset($this->config['check']) && $this->config['check']) {
 
-             $check = explode(',', $this->config['check']);
 
-             $where = array();
 
-             $name = array();
 
-             foreach ($check as $k => $v) {
 
-                 if (isset($data[$v])) {
 
-                     if (isset($this->config['field'][$v]) && isset($this->config['field'][$v]['name'])) {
 
-                         $n = $this->config['field'][$v]['name'];
 
-                     } elseif (isset($this->db->config['struct'][$v])) {
 
-                         $n = $this->db->config['struct'][$v]['name'];
 
-                     } else {
 
-                         $n = $v;
 
-                     }
 
-                     $where[$v] = $data[$v];
 
-                     $name[] = $n;
 
-                 }
 
-             }
 
-             if ($where) {
 
-                 if ($id) {
 
-                     $where['id'] = array('!=', $id);
 
-                 }
 
-                 $info = $this->db->find($where);
 
-                 if ($info) {
 
-                     $name = implode('、', $name);
 
-                     Dever::error($name . '已存在');
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     private function start($id, &$data)
 
-     {
 
-         if (isset($this->config['start']) && $this->config['start']) {
 
-             $data['id'] = $id;
 
-             $data = Dever::call($this->config['start'], array($data));
 
-         }
 
-     }
 
-     private function end($id, $data)
 
-     {
 
-         if (isset($this->config['end']) && $this->config['end']) {
 
-             $data['id'] = $id;
 
-             Dever::call($this->config['end'], array($data));
 
-         }
 
-     }
 
-     private function other($rid, $data, $other)
 
-     {
 
-         if ($other) {
 
-             foreach ($other as $k => $v) {
 
-                 if (strpos($k, '#')) {
 
-                     $k = str_replace('#', '', $k);
 
-                 }
 
-                 $common = $v[0];
 
-                 $update = $v[1];
 
-                 $drag = $v[2];
 
-                 $input = $v[3];
 
-                 $value = array();
 
-                 foreach ($input as $k1 => $v1) {
 
-                     if (isset($v1['id'])) {
 
-                         $value['id'] = $v1['id'];
 
-                     }
 
-                     foreach ($common as $k2 => $v2) {
 
-                         if (!is_array($v2)) {
 
-                             if ($v2 == 'id') {
 
-                                 $value[$k2] = $rid;
 
-                             } elseif (isset($data[$v2])) {
 
-                                 $value[$k2] = $data[$v2];
 
-                             } else {
 
-                                 $value[$k2] = $v2;
 
-                             }
 
-                         }
 
-                     }
 
-                     foreach ($update as $k2 => $v2) {
 
-                         if (isset($v1[$k2])) {
 
-                             $this->doData($value, $k2, $v1[$k2]);
 
-                         } else {
 
-                             $value[$k2] = '';
 
-                         }
 
-                     }
 
-                     if ($drag) {
 
-                         $value[$drag] = $k1+1;
 
-                     }
 
-                     if (isset($value['id']) && $value['id'] > 0) {
 
-                         $id = $value['id'];
 
-                         unset($value['id']);
 
-                         Dever::db($k)->update($id, $value);
 
-                     } else {
 
-                         Dever::db($k)->insert($value);
 
-                     }
 
-                 }
 
-             }
 
-         }
 
-     }
 
-     private function sku($rid, $data, $sku)
 
-     {
 
-         if ($sku) {
 
-             foreach ($sku as $k => $v) {
 
-                 if (strpos($k, '#')) {
 
-                     $k = str_replace('#', '', $k);
 
-                 }
 
-                 $common = $v[0];
 
-                 $update = $v[1];
 
-                 $spec_table = $v[2];
 
-                 $spec_value_table = $spec_table . '_value';
 
-                 $spec_field = $v[3];
 
-                 $spec = $v[4];
 
-                 $input = $v[5];
 
-                 $value = $spec_value = array();
 
-                 Dever::db($spec_table)->update(array($spec_field => $rid), array('state' => 2));
 
-                 Dever::db($spec_value_table)->update(array($spec_field => $rid), array('state' => 2));
 
-                 foreach ($spec as $k1 => &$v1) {
 
-                     $spec_data = array();
 
-                     $spec_data['state'] = 1;
 
-                     $spec_data[$spec_field] = $rid;
 
-                     $spec_data['name'] = $v1['name'];
 
-                     $spec_data['sort'] = $k1+1;
 
-                     if (isset($v1['id']) && $v1['id']) {
 
-                         Dever::db($spec_table)->update($v1['id'], $spec_data);
 
-                     } else {
 
-                         $v1['id'] = Dever::db($spec_table)->insert($spec_data);
 
-                     }
 
-                     if ($v1['id']) {
 
-                         foreach ($v1['value'] as $k2 => &$v2) {
 
-                             $spec_value_data = array();
 
-                             $spec_value_data['state'] = 1;
 
-                             $spec_value_data[$spec_field] = $rid;
 
-                             $spec_value_data['spec_id'] = $v1['id'];
 
-                             $spec_value_data['value'] = $v2['value'] ?? $v2['name'];
 
-                             $spec_value_data['sort'] = $k2+1;
 
-                             $spec_value_data['is_checked'] = $v2['checked'] == 'true' ? 1 : 2;
 
-                             if (isset($v2['id']) && $v2['id']) {
 
-                                 Dever::db($spec_value_table)->update($v2['id'], $spec_value_data);
 
-                             } else {
 
-                                 $v2['id'] = Dever::db($spec_value_table)->insert($spec_value_data);
 
-                             }
 
-                             $spec_value[$v1['key']][$spec_value_data['value']] = array($v2['id'], $spec_data['sort']);
 
-                         }
 
-                     }
 
-                 }
 
-                 Dever::db($spec_table)->delete(array($spec_field => $rid, 'state' => 2));
 
-                 Dever::db($spec_value_table)->delete(array($spec_field => $rid, 'state' => 2));
 
-                 Dever::db($k)->update(array($spec_field => $rid), array('state' => 2));
 
-                 foreach ($input as $k1 => $v1) {
 
-                     if (isset($v1['id'])) {
 
-                         $value['id'] = $v1['id'];
 
-                     }
 
-                     foreach ($common as $k2 => $v2) {
 
-                         if (!is_array($v2)) {
 
-                             if ($v2 == 'id') {
 
-                                 $value[$k2] = $rid;
 
-                             } elseif (isset($data[$v2])) {
 
-                                 $value[$k2] = $data[$v2];
 
-                             } else {
 
-                                 $value[$k2] = $v2;
 
-                             }
 
-                         }
 
-                     }
 
-                     foreach ($update as $k2 => $v2) {
 
-                         if (isset($v1[$k2])) {
 
-                             $value[$k2] = $v1[$k2];
 
-                         }
 
-                     }
 
-                     $value['key'] = array();
 
-                     foreach ($v1 as $k2 => $v2) {
 
-                         if (isset($spec_value[$k2]) && isset($spec_value[$k2][$v2])) {
 
-                             $value['key'][$spec_value[$k2][$v2][1]] = $spec_value[$k2][$v2][0];
 
-                         }
 
-                     }
 
-                     if ($value['key']) {
 
-                         $value['key'] = implode(',' , $value['key']);
 
-                     }
 
-                     $value['state'] = 1;
 
-                     if (isset($value['id']) && $value['id'] > 0) {
 
-                         $id = $value['id'];
 
-                         unset($value['id']);
 
-                         Dever::db($k)->update($id, $value);
 
-                     } else {
 
-                         Dever::db($k)->insert($value);
 
-                     }
 
-                 }
 
-                 Dever::db($k)->delete(array($spec_field => $rid, 'state' => 2));
 
-             }
 
-         }
 
-     }
 
- }
 
 
  |