Exemple #1
0
 /**
  * 提交编辑的物流
  */
 function do_edit()
 {
     $request_data = $this->input->post();
     //流程
     $submit_target = intval($this->input->post('submit_target'));
     if ($_POST) {
         $delivery_service = DeliveryService::get_instance();
         $delivery_country_service = Delivery_countryService::get_instance();
         //数据验证
         $validation = Validation::factory($request_data)->pre_filter('trim')->add_rules('delivery_id', 'required', 'digit')->add_rules('name', 'required', 'length[0,100]')->add_rules('url', 'required', 'length[0,200]')->add_rules('first_unit', 'required', 'numeric')->add_rules('continue_unit', 'required', 'numeric')->add_rules('use_exp', 'required', 'digit')->add_rules('type', 'required', 'digit')->add_rules('position', 'required', 'numeric')->add_rules('active', 'required', 'digit');
         //验证物流表的数据
         $delivery = $delivery_service->get($request_data['delivery_id']);
         if (empty($delivery) || !isset($delivery)) {
             remind::set(Kohana::lang('o_global.bad_request'), request::referrer(), 'error');
         }
         //验证物流国家表的数据
         if (!empty($delivery['type']) && $delivery['type'] == 1) {
             $delivery_countries = $delivery_country_service->get_delivery_countries_by_id($delivery['id']);
             if (empty($delivery_countries) || !isset($delivery_countries)) {
                 remind::set(Kohana::lang('o_global.bad_request'), request::referrer(), 'error');
             }
             //验证物流国家表里面的数据是否与物流表的数据统一
             $old_country_ids = array();
             foreach ($delivery_countries as $item) {
                 if (!is_array($item) || count($item) < 0) {
                     remind::set(Kohana::lang('o_global.access_denied'), request::referrer(), 'error');
                     break;
                 }
                 foreach ($item as $k => $v) {
                     if ($v['delivery_id'] != $delivery['id']) {
                         remind::set(Kohana::lang('o_global.bad_request'), request::referrer(), 'error');
                     }
                     //保存已存在的物流国家的信息
                     $old_country_ids[$v['country_id']] = $v['id'];
                 }
             }
         }
         //检测物流名称是否存在
         if ($delivery_service->name_is_exist($request_data['name'], $request_data['delivery_id'])) {
             remind::set(Kohana::lang('o_site.carrier_has_exist'), request::referrer(), 'error');
         }
         $is_default = isset($request_data['is_default']) ? $request_data['is_default'] : 0;
         $set_data = array('name' => $request_data['name'], 'url' => $request_data['url'], 'first_unit' => $request_data['first_unit'], 'continue_unit' => $request_data['continue_unit'], 'type' => $request_data['type'], 'is_default' => $is_default, 'use_exp' => $request_data['use_exp'], 'expression' => $request_data['expression'], 'position' => $request_data['position'], 'delay' => $request_data['delay'], 'active' => $request_data['active']);
         //处理统一设置或启用默认费用
         if ($request_data['use_exp'] == 1) {
             $validation->add_rules('expression', 'required');
         } else {
             if (isset($request_data['is_default']) && $request_data['is_default'] == 1) {
                 $validation->add_rules('first_price', 'required', 'numeric');
                 $validation->add_rules('continue_price', 'required', 'numeric');
                 $set_data['first_price'] = $request_data['first_price'];
                 $set_data['continue_price'] = $request_data['continue_price'];
                 $set_data['expression'] = delivery::create_exp($request_data['first_unit'], $request_data['continue_unit'], $request_data['first_price'], $request_data['continue_price']);
             } else {
                 $set_data['expression'] = delivery::create_exp($request_data['first_unit'], $request_data['continue_unit']);
             }
         }
         if (!$validation->validate()) {
             remind::set(Kohana::lang('o_global.input_error'), request::referrer(), 'error');
         }
         //更新物流表的信息
         $delivery_service->set($delivery['id'], $set_data);
         //处理地区费用类型改变的情况
         if ($delivery['type'] == 1) {
             //处理支持的配送国家的情况
             if ($request_data['type'] == 1) {
                 if (!empty($request_data['des_indexs']) and is_array($request_data['des_indexs'])) {
                     $whole_country_ids = array();
                     foreach ($request_data['des_indexs'] as $i => $index) {
                         // 验证国家数据
                         $validation = Validation::factory($request_data)->pre_filter('trim')->add_rules('country_names_' . $index, 'required')->add_rules('countries_use_exp_' . $index, 'required', 'digit')->add_rules('country_ids_' . $index, 'required');
                         // 生成 支配的国家数据
                         $country_data = array('delivery_id' => $delivery['id'], 'first_price' => $request_data['first_price_' . $index], 'continue_price' => $request_data['continue_price_' . $index], 'use_exp' => $request_data['countries_use_exp_' . $index], 'expression' => $request_data['expression_' . $index]);
                         $country_ids = explode('-', $request_data['country_ids_' . $index]);
                         $country_names = explode(',', $request_data['country_names_' . $index]);
                         //判断提交的国家id个数是否于国家名称的个数一致
                         if (empty($country_ids)) {
                             remind::set(Kohana::lang('o_global.bad_request'), request::referrer(), 'error');
                         }
                         //使用公式
                         if ($request_data['countries_use_exp_' . $index] == 1) {
                             $validation->add_rules('expression_' . $index, 'required');
                         } else {
                             $validation->add_rules('first_price_' . $index, 'required', 'numeric');
                             $validation->add_rules('continue_price_' . $index, 'required', 'numeric');
                             $country_data['expression'] = delivery::create_exp($request_data['first_unit'], $request_data['continue_unit'], $request_data['first_price_' . $index], $request_data['continue_price_' . $index]);
                         }
                         $country_data['position'] = $index - 1;
                         $ids_index = 'ids_' . $index;
                         $de_countries[$index] = $country_data;
                         $de_countries[$index]['ids'] = array();
                         if (!empty($request_data[$ids_index])) {
                             $de_countries[$index]['ids'] = $request_data[$ids_index];
                         }
                         $countries_ids[$index] = $request_data['country_ids_' . $index];
                         $whole_country_ids = array_merge($country_ids, $whole_country_ids);
                     }
                     foreach ($countries_ids as $i => $v) {
                         $country_ids = explode('-', $v);
                         foreach ($country_ids as $value) {
                             $de_countries[$i]['country_id'] = $value;
                             if (!isset($old_country_ids[$value])) {
                                 $delivery_country_service->add($de_countries[$i]);
                             } else {
                                 $delivery_country_service->set($old_country_ids[$value], $de_countries[$i]);
                             }
                         }
                     }
                     foreach ($old_country_ids as $key => $id) {
                         if (!in_array($key, $whole_country_ids)) {
                             $delivery_country_service->remove($id);
                         }
                     }
                 }
             } else {
                 $delivery_country_service->delete_delivery_countries_by_delivery_id($delivery['id']);
             }
         } else {
             //处理支持的配送国家
             if ($request_data['type'] == 1) {
                 if (!empty($request_data['des_indexs']) and is_array($request_data['des_indexs'])) {
                     foreach ($request_data['des_indexs'] as $i => $index) {
                         // 验证国家数据
                         $validation = Validation::factory($request_data)->pre_filter('trim')->add_rules('country_names_' . $index, 'required', 'length[0,512]')->add_rules('countries_use_exp_' . $index, 'required', 'digit')->add_rules('country_ids_' . $index, 'required', 'length[0,256]');
                         // 生成 支配国家数据
                         $country_data = array('delivery_id' => $delivery['id'], 'first_price' => $request_data['first_price_' . $index], 'continue_price' => $request_data['continue_price_' . $index], 'use_exp' => $request_data['countries_use_exp_' . $index], 'expression' => $request_data['expression_' . $index]);
                         $country_ids = explode('-', $request_data['country_ids_' . $index]);
                         $country_names = explode(',', $request_data['country_names_' . $index]);
                         //判断提交的国家id个数是否于国家名称的个数一致
                         if (empty($country_ids)) {
                             remind::set(Kohana::lang('o_global.bad_request'), request::referrer(), 'error');
                         }
                         //使用公式
                         if ($request_data['countries_use_exp_' . $index] == 1) {
                             $validation->add_rules('expression_' . $index, 'required');
                         } else {
                             $validation->add_rules('first_price_' . $index, 'required', 'numeric');
                             $validation->add_rules('continue_price_' . $index, 'required', 'numeric');
                             $country_data['expression'] = delivery::create_exp($request_data['first_unit'], $request_data['continue_unit'], $request_data['first_price_' . $index], $request_data['continue_price_' . $index]);
                         }
                         $country_data['position'] = $index - 1;
                         foreach ($country_ids as $i) {
                             $country_data['country_id'] = $i;
                             if (!$delivery_country_service->add($country_data)) {
                                 remind::set(Kohana::lang('o_global.add_error'), 'site/delivery/add');
                                 break;
                             }
                         }
                     }
                 }
             }
         }
         //判断走向
         switch ($submit_target) {
             case 1:
                 remind::set(Kohana::lang('o_global.update_success'), 'site/delivery/edit/' . $delivery['id'], 'success');
             default:
                 remind::set(Kohana::lang('o_global.update_success'), 'site/delivery/', 'success');
         }
     } else {
         remind::set(Kohana::lang('o_global.update_error'), 'site/delivery');
     }
 }
 /**
  * Construct load data
  *
  * @param Int $site_id
  */
 public function __construct($site_id)
 {
     $this->db = Database::instance('default');
     $sql = "SELECT `carriers`.* FROM (`carriers`) WHERE `site_id` = {$site_id} ORDER BY `carriers`.`id` ASC";
     $carriers = $this->db->query($sql);
     foreach ($carriers as $keyc => $_carrier) {
         $delivery_temp = array();
         $delivery_temp['id'] = $_carrier->id;
         $delivery_temp['site_id'] = $_carrier->site_id;
         $delivery_temp['name'] = $_carrier->name;
         $delivery_temp['url'] = $_carrier->url;
         $delivery_temp['type'] = $_carrier->country_relative;
         $delivery_temp['first_unit'] = 1000000;
         $delivery_temp['continue_unit'] = 1000;
         $delivery_temp['is_default'] = 1;
         $delivery_temp['continue_price'] = 0;
         $delivery_temp['position'] = $_carrier->position;
         $delivery_temp['delay'] = $_carrier->delay;
         $delivery_temp['active'] = $_carrier->active;
         if ($_carrier->type == 0) {
             $delivery_temp['use_exp'] = 0;
             $delivery_temp['first_price'] = $_carrier->price;
             $delivery_temp['expression'] = delivery::create_exp(1000000, 1000, $_carrier->price, 0);
             $delivery_temp['delivery_country'] = array();
             $sql = "SELECT `carrier_countries`.* FROM (`carrier_countries`) WHERE `site_id` = {$site_id} AND `carrier_id` = {$_carrier->id} ORDER BY `carrier_countries`.`id` ASC";
             $countries = $this->db->query($sql);
             $j = 0;
             $price_j = array();
             foreach ($countries as $key_c => $_country) {
                 if ($_country->shipping_add != 0) {
                     if (!isset($price_j[$_country->shipping_add])) {
                         $delivery_temp['delivery_country'][$key_c]['position'] = $j;
                         $price_j[$_country->shipping_add] = $j;
                         $j++;
                     } else {
                         $delivery_temp['delivery_country'][$key_c]['position'] = $price_j[$_country->shipping_add];
                     }
                     $delivery_temp['delivery_country'][$key_c]['id'] = $_country->id;
                     $delivery_temp['delivery_country'][$key_c]['site_id'] = $_country->site_id;
                     $delivery_temp['delivery_country'][$key_c]['country_id'] = $_country->country_id;
                     $delivery_temp['delivery_country'][$key_c]['delivery_id'] = $_country->carrier_id;
                     $delivery_temp['delivery_country'][$key_c]['first_price'] = $_country->shipping_add + $delivery_temp['first_price'];
                     $delivery_temp['delivery_country'][$key_c]['continue_price'] = 0;
                     $first_price = $_country->shipping_add + $delivery_temp['first_price'];
                     $delivery_temp['delivery_country'][$key_c]['use_exp'] = 0;
                     $delivery_temp['delivery_country'][$key_c]['expression'] = delivery::create_exp(1000000, 1000, $first_price, 0);
                 }
             }
             if ($j == 0) {
                 $delivery_temp['type'] = 0;
             }
         } else {
             $delivery_temp['use_exp'] = 1;
             $delivery_temp['first_price'] = 0;
             $sql_range = "SELECT `carrier_ranges`.* FROM (`carrier_ranges`) WHERE `site_id` = {$site_id} AND `carrier_id` = {$_carrier->id} ORDER BY `carrier_ranges`.`id` ASC";
             $ranges = $this->db->query($sql_range)->as_array();
             $str = '';
             foreach ($ranges as $key_c => $_range) {
                 if ($_range == end($ranges)) {
                     if ($_range->parameter_from == 0) {
                         $str .= "{{" . $_range->parameter_to . "-p}-0.6}*" . $_range->shipping;
                     } else {
                         $str .= "{{p-" . $_range->parameter_from . "}-0.1}*{{" . $_range->parameter_to . "-p}-0.6}*" . $_range->shipping;
                     }
                 } else {
                     if ($_range->parameter_from == 0) {
                         $str .= "{{" . $_range->parameter_to . "-p}-0.6}*" . $_range->shipping . '+';
                     } else {
                         $str .= "{{p-" . $_range->parameter_from . "}-0.1}*{{" . $_range->parameter_to . "-p}-0.6}*" . $_range->shipping . '+';
                     }
                 }
             }
             $delivery_temp['expression'] = $str;
             $delivery_temp['delivery_country'] = array();
             $sql = "SELECT `carrier_countries`.* FROM (`carrier_countries`) WHERE `site_id` = {$site_id} AND `carrier_id` = {$_carrier->id} ORDER BY `carrier_countries`.`id` ASC";
             $countries = $this->db->query($sql);
             $i = 0;
             $price = array();
             foreach ($countries as $key_c => $_country) {
                 if ($_country->shipping_add != 0) {
                     if (!isset($price[$_country->shipping_add])) {
                         $delivery_temp['delivery_country'][$key_c]['position'] = $i;
                         $price[$_country->shipping_add] = $i;
                         $i++;
                     } else {
                         $delivery_temp['delivery_country'][$key_c]['position'] = $price[$_country->shipping_add];
                     }
                     $str_country = '';
                     $delivery_temp['delivery_country'][$key_c]['id'] = $_country->id;
                     $delivery_temp['delivery_country'][$key_c]['site_id'] = $_country->site_id;
                     $delivery_temp['delivery_country'][$key_c]['country_id'] = $_country->country_id;
                     $delivery_temp['delivery_country'][$key_c]['delivery_id'] = $_country->carrier_id;
                     $delivery_temp['delivery_country'][$key_c]['first_price'] = 0;
                     $delivery_temp['delivery_country'][$key_c]['continue_price'] = 0;
                     $delivery_temp['delivery_country'][$key_c]['use_exp'] = 1;
                     foreach ($ranges as $k_c => $_r) {
                         if ($_r == end($ranges)) {
                             if ($_r->parameter_from == 0) {
                                 $str_country .= "{{" . $_r->parameter_to . "-p}-0.6}*" . ($_r->shipping + $_country->shipping_add);
                             } else {
                                 $str_country .= "{{p-" . $_r->parameter_from . "}-0.1}*{{" . $_r->parameter_to . "-p}-0.6}*" . ($_r->shipping + $_country->shipping_add);
                             }
                         } else {
                             if ($_r->parameter_from == 0) {
                                 $str_country .= "{{" . $_r->parameter_to . "-p}-0.6}*" . ($_r->shipping + $_country->shipping_add) . '+';
                             } else {
                                 $str_country .= "{{p-" . $_r->parameter_from . "}-0.1}*{{" . $_r->parameter_to . "-p}-0.6}*" . ($_r->shipping + $_country->shipping_add) . '+';
                             }
                         }
                     }
                     $delivery_temp['delivery_country'][$key_c]['expression'] = $str_country;
                 }
             }
             if ($i == 0) {
                 $delivery_temp['type'] = 0;
             }
         }
         $this->data[$keyc] = $delivery_temp;
     }
     $this->end = count($this->data);
 }