12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640 |
- <?php
- /**
- * 易优CMS
- * ============================================================================
- * 版权所有 2016-2028 海口快推科技有限公司,并保留所有权利。
- * 网站地址: http://www.eyoucms.com
- * ----------------------------------------------------------------------------
- * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
- * ============================================================================
- * Author: 小虎哥 <1105415366@qq.com>
- * Date: 2018-4-3
- */
-
- namespace app\admin\controller;
-
- use think\Db;
- use think\Page;
- use think\Cache;
-
- class Citysite extends Base
- {
- public static $top_city = [
- "山东" => ["青岛","济南","烟台","潍坊","临沂","济宁","淄博","威海","东营","德州","泰安","聊城","滨州","菏泽","枣庄"],
- "江苏" => ["苏州","南京","无锡","南通","常州","徐州","扬州","盐城","泰州","镇江","淮安","连云港","宿迁"],
- "广东" => ["深圳","广州","佛山","东莞","惠州","珠海","江门","茂名","中山","湛江"],
- "浙江" => ["杭州","宁波","温州","绍兴","嘉兴","台州","金华","湖州"],
- "河北" => ["唐山","石家庄","沧州","邯郸","保定","廊坊"],
- "河南" => ["郑州","洛阳","南阳","许昌","周口","新乡"],
- "湖南" => ["长沙","岳阳","常德","衡阳","株洲","郴州"],
- "福建" => ["福州","泉州","厦门","漳州"],
- "内蒙古" => ["鄂尔多斯","呼和浩特","包头"],
- "湖北" => ["武汉","襄阳","宜昌"],
- "辽宁" => ["大连","沈阳","鞍山"],
- "陕西" => ["西安","榆林","咸阳"],
- "安徽" => ["合肥","芜湖"],
- "广西" => ["南宁","柳州"],
- "贵州" => ["贵阳","遵义"],
- "黑龙江" => ["哈尔滨","大庆"],
- "吉林" => ["长春","吉林"],
- "新疆" => ["乌鲁木齐"],
- "江西" => ["南昌"],
- "四川" => ["成都"],
- "云南" => ["昆明"],
- "甘肃" => ["兰州"],
- "山西" => ["太原"],
- "北京" => [],
- "天津" => [],
- "上海" => [],
- "重庆" => [],
- ];
-
- private $web_citysite_open;
- // 禁用的目录名称
- private $disableDirname = [];
-
- public function _initialize(){
- parent::_initialize();
- $this->disableDirname = config('global.disable_dirname');
-
- $functionLogic = new \app\common\logic\FunctionLogic;
- $functionLogic->validate_authorfile(2);
-
- $this->web_citysite_open = tpCache('global.web_citysite_open');
- $this->assign('web_citysite_open', $this->web_citysite_open);
- }
-
- public function index()
- {
- $assign_data = array();
- $condition = array();
- // 获取到所有GET参数
- $param = input('param.');
- $parent_id = input('pid/d', 0);
-
- // 应用搜索条件
- foreach (['keywords','pid'] as $key) {
- $param[$key] = addslashes(trim($param[$key]));
- if (isset($param[$key]) && $param[$key] !== '') {
- if ($key == 'keywords') {
- $condition['name'] = array('LIKE', "%{$param[$key]}%");
- } else if ($key == 'pid') {
- $condition['parent_id'] = array('eq', $param[$key]);
- } else {
- $condition[$key] = array('eq', $param[$key]);
- }
- }
- }
-
- // 上一级区域名称
- $parentInfo = Db::name('citysite')->where(['id'=>$parent_id])->find();
- $parentLevel = !empty($parentInfo['level']) ? intval($parentInfo['level']) : 0;
- $condition['level'] = $parentLevel + 1;
-
- $regionM = Db::name('citysite');
- $count = $regionM->where($condition)->count('id');// 查询满足要求的总记录数
- $Page = $pager = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数
- $list = $regionM->where($condition)->order('sort_order asc, id asc')->limit($Page->firstRow.','.$Page->listRows)->select();
- foreach ($list as $key => $val) {
- $val['siteurl'] = siteurl($val);
- $list[$key] = $val;
- }
-
- $show = $Page->show();// 分页显示输出
- $this->assign('page',$show);// 赋值分页输出
- $this->assign('list',$list);// 赋值数据集
- $this->assign('pager',$pager);// 赋值分页对象
- $this->assign('parentInfo',$parentInfo);
-
- return $this->fetch();
- }
-
- public function add(){
- if (IS_POST) {
- $post = input('post.');
- $post['name'] = trim($post['name']);
- $post['domain'] = preg_replace("/[^a-zA-Z0-9]+/", "", strtolower($post['domain']));
-
- // --存储数据
- $nowData = array(
- 'initial' => getFirstCharter($post['name']),
- 'seo_description' => !empty($post['seo_description']) ? $post['seo_description'] : '',
- 'sort_order' => 100,
- 'add_time' => getTime(),
- 'update_time' => getTime(),
- );
- if (!empty($post['city_id'])){
- $nowData['level'] = 3;
- $nowData['parent_id'] = intval($post['city_id']);
- $nowData['topid'] = intval($post['province_id']);
- } else if (!empty($post['province_id'])){
- $nowData['level'] = 2;
- $nowData['parent_id'] = intval($post['province_id']);
- $nowData['topid'] = intval($post['province_id']);
- } else {
- $nowData['level'] = 1;
- $nowData['parent_id'] = 0;
- $nowData['topid'] = 0;
- }
- $data = array_merge($post, $nowData);
-
- if (empty($data['name'])) {
- $this->error('区域名称不能为空!');
- }
-
- // 区域名称是否已存在
- $count = Db::name('citysite')->where([
- 'name' => $data['name'],
- 'parent_id' => $data['parent_id'],
- ])->count();
- if (!empty($count)) {
- $this->error('区域名称已存在,请更换!');
- }
-
- if (!empty($data['domain'])) {
- $count = Db::name('citysite')->where([
- 'domain' => $data['domain'],
- ])->count();
- if (!empty($count)) {
- $this->error('英文名称已存在!');
- }
- // 检测
- if (!empty($data['domain']) && !$this->domain_unique($data['domain'])) {
- $this->error('英文名称与系统内置冲突,请更改!');
- }
- /*--end*/
- } else {
- $this->error('英文名称不能为空!');
- }
-
- $insertId = M('citysite')->insertGetId($data);
- if (false !== $insertId) {
- \think\Cache::clear('citysite');
- // extra_cache('global_get_site_province_list', null);
- // extra_cache('global_get_site_city_list', null);
- // extra_cache('global_get_site_area_list', null);
- adminLog('新增区域:'.$data['name']);
- $this->success("操作成功");
- }else{
- $this->error("操作失败");
- }
- exit;
- }
-
- $pid = input('param.pid/d', 0);
- $region = array_reverse($this->getParentCitysiteId($pid));
- $assign_data['province_id'] = !empty($region[0]) ? $region[0] : 0;
- $assign_data['city_id'] = !empty($region[1]) ? $region[1] : 0;
-
- // 省份列表
- $province_all = $this->get_site_province_all();
- $assign_data['province_all'] = $province_all;
- $assign_data['rootDomain'] = $this->request->rootDomain().ROOT_DIR;
-
- $this->assign($assign_data);
-
- return $this->fetch();
- }
-
- //批量新增
- public function batch_add(){
- if (IS_POST) {
- $post = input('post.');
-
- $name = trim($post['name']);
- if (empty($name)) {
- $this->error('区域名称不能为空!');
- }
- $nameArr = explode("\r\n", $name);
- //去除数组空值、左右空格
- foreach ($nameArr as $key => $val) {
- $val = trim($val);
- if (empty($val)) {
- unset($nameArr[$key]);
- } else {
- $nameArr[$key] = $val;
- }
- }
- $nameArr = array_unique($nameArr); //去重
-
- if (!empty($post['city_id'])){
- $level = 3;
- $parent_id = intval($post['city_id']);
- $topid = intval($post['province_id']);
- } else if (!empty($post['province_id'])){
- $level = 2;
- $parent_id = intval($post['province_id']);
- $topid = intval($post['province_id']);
- } else {
- $level = 1;
- $parent_id = 0;
- $topid = 0;
- }
- $have_name = Db::name('citysite')->where(['parent_id' => $parent_id])->column('name');
- $addData = $insert_name = [];
- foreach ($nameArr as $key => $val) {
- if(empty($val) || in_array($val,$have_name))
- {
- continue;
- }
- $insert_name[] = $val;
- $domain = preg_replace("/[^a-zA-Z0-9]+/", "", get_pinyin($val));
- $domain = $this->rand_domain($domain);
- $addData[] = [
- 'name' => $val,
- 'domain' => $domain,
- 'level' => $level,
- 'parent_id' => $parent_id,
- 'topid' => $topid,
- 'is_open' => !empty($post['is_open']) ? intval($post['is_open']) : 0,
- 'showall' => !empty($post['showall']) ? intval($post['showall']) : 1,
- 'seoset' => !empty($post['seoset']) ? intval($post['seoset']) : 0,
- 'initial' => getFirstCharter($val),
- 'seo_title' => str_replace(['{region}','{区域}'], $val, $post['seo_title']),
- 'seo_keywords' => str_replace(['{region}','{区域}'], $val, $post['seo_keywords']),
- 'seo_description' => str_replace(['{region}','{区域}'], $val, $post['seo_description']),
- 'sort_order' => 100,
- 'add_time' => getTime(),
- 'update_time' => getTime(),
- ];
- }
- $res = Db::name('citysite')->insertAll($addData);
- if (false !== $res) {
- \think\Cache::clear('citysite');
- // extra_cache('global_get_site_province_list', null);
- // extra_cache('global_get_site_city_list', null);
- // extra_cache('global_get_site_area_list', null);
- adminLog('批量新增区域:'.implode(',',$insert_name));
- $this->success("操作成功");
- }else{
- $this->error("操作失败");
- }
- exit;
- }
-
- $pid = input('param.pid/d', 0);
- $region = array_reverse($this->getParentCitysiteId($pid));
- $assign_data['province_id'] = !empty($region[0]) ? $region[0] : 0;
- $assign_data['city_id'] = !empty($region[1]) ? $region[1] : 0;
-
- // 省份列表
- $province_all = $this->get_site_province_all();
- $assign_data['province_all'] = $province_all;
- $assign_data['rootDomain'] = $this->request->rootDomain().ROOT_DIR;
-
- $this->assign($assign_data);
-
- return $this->fetch();
- }
-
- public function edit(){
- if (IS_POST) {
- $post = input('post.');
- if(!empty($post['id'])){
- $post['id'] = intval($post['id']);
- $post['name'] = trim($post['name']);
- $post['domain'] = preg_replace("/[^a-zA-Z0-9]+/", "", strtolower($post['domain']));
-
- // --存储数据
- $nowData = array(
- 'initial' => getFirstCharter($post['name']),
- 'seo_description' => !empty($post['seo_description']) ? $post['seo_description'] : '',
- 'update_time' => getTime(),
- );
-
- if (!isset($post['province_id'])) $post['province_id'] = $post['old_province_id'];
- if (!isset($post['city_id'])) $post['city_id'] = $post['old_city_id'];
-
- if (!empty($post['city_id'])){
- $nowData['level'] = 3;
- $nowData['parent_id'] = intval($post['city_id']);
- $nowData['topid'] = intval($post['province_id']);
- } else if (!empty($post['province_id'])){
- $nowData['level'] = 2;
- $nowData['parent_id'] = intval($post['province_id']);
- $nowData['topid'] = intval($post['province_id']);
- } else {
- $nowData['level'] = 1;
- $nowData['parent_id'] = 0;
- $nowData['topid'] = 0;
- }
- $data = array_merge($post, $nowData);
-
- if (empty($data['name'])) {
- $this->error('区域名称不能为空!');
- }
-
- // 区域名称是否已存在
- $count = Db::name('citysite')->where([
- 'id' => ['NEQ', $data['id']],
- 'name' => $data['name'],
- 'parent_id' => $data['parent_id'],
- ])->count();
- if (!empty($count)) {
- $this->error('区域名称已存在,请更换!');
- }
-
- if (!empty($data['domain'])) {
- $count = Db::name('citysite')->where([
- 'domain' => $data['domain'],
- 'id' => ['NEQ', $data['id']],
- ])->count();
- if (!empty($count)) {
- $this->error('英文名称已存在!');
- }
- // 检测
- if (!empty($data['domain']) && !$this->domain_unique($data['domain'], $data['id'])) {
- $this->error('英文名称与系统内置冲突,请更改!');
- }
- /*--end*/
- } else {
- $this->error('英文名称不能为空!');
- }
-
- $r = M('citysite')->where([
- 'id' => $post['id'],
- ])
- ->cache(true, null, "citysite")
- ->update($data);
- if (false !== $r) {
- // 同步处理子级城市
- if (empty($post['province_id'])) {
- Db::name('citysite')->where([
- 'parent_id' => $post['id'],
- ])->update([
- 'level' => 2,
- 'topid' => $post['id'],
- 'update_time' => getTime(),
- ]);
- } else if (!empty($post['province_id']) && empty($post['city_id'])) {
- Db::name('citysite')->where([
- 'parent_id' => $post['id'],
- ])->update([
- 'level' => 3,
- 'topid' => $data['topid'],
- 'update_time' => getTime(),
- ]);
- }
- // extra_cache('global_get_site_province_list', null);
- // extra_cache('global_get_site_city_list', null);
- // extra_cache('global_get_site_area_list', null);
- adminLog('编辑区域:'.$data['name']);
- $this->success("操作成功");
- }
- }
- $this->error("操作失败");
- }
-
- $id = input('param.id/d', 0);
- $info = model("Citysite")->getInfo($id);
- $assign_data['field'] = $info;
- $region = array_reverse($this->getParentCitysiteId($info['parent_id']));
- $assign_data['province_id'] = !empty($region[0]) ? $region[0] : 0;
- $assign_data['city_id'] = !empty($region[1]) ? $region[1] : 0;
-
- // 省份列表
- $province_all = $this->get_site_province_all();
- $assign_data['province_all'] = $province_all;
- $assign_data['rootDomain'] = $this->request->rootDomain().ROOT_DIR;
-
- // 是否有下级以及层级
- $assign_data['childrenLevelCount'] = Db::name('citysite')->field('level')->where(['parent_id|topid'=>$id])->group('level')->count();
-
- $this->assign($assign_data);
-
- return $this->fetch();
- }
-
- public function conf(){
- if (IS_POST) {
- $post = $data = input('post.');
- foreach ($data as $key => $val) {
- $val = trim($val);
- $data[$key] = $val;
- }
- tpCache('site', $data);
- adminLog('多站点功能配置');
- $this->success("操作成功");
- }
-
- $assign_data = [];
- $row = tpCache('site');
- $assign_data['row'] = $row;
- // 站点区域
- $site_default_home = !empty($row['site_default_home']) ? intval($row['site_default_home']) : 0;
- $citysiteLogic = new \app\common\logic\CitysiteLogic;
- $assign_data['citysite_html'] = $citysiteLogic->citysite_list(0, $site_default_home, true, 0, array(), false);
- $assign_data['site_default_home'] = $site_default_home;
-
- $this->assign($assign_data);
- return $this->fetch();
- }
-
- /*
- * 开启关闭启用
- * 开启当前,判断当前是否为唯一开启,如果是,则将当前设置为默认区域
- * 关闭当前,判断当前是否为原来默认区域:如果是,则判断当前同级(相同上级)是否存在开启:如存在,设置为默认,如不存在:判断第一级是否存在开启:如存在,设置第一个为默认,如不存在,继续往下级查找。
- *
- * 至少必须存在一个开启区域
- */
- public function setStatus() {
- $id = input('id/d', 0);
- $status = input('status/d', 0);
- $list = Db::name("citysite")->where("status=1")->getField("id,status");
- if ($status == 0){
- if (count($list) == 1 && !empty($list[$id])){
- $this->error("至少存在一个开启区域!");
- }
- }
- Db::name('citysite')->where(['id'=>$id])->cache(true, null, "citysite")->update(['status'=>$status, 'update_time'=>getTime()]);
- $this->success("设置成功");
-
- /*
- $id = input('id/d', 0);
- $status = input('status/d', 0);
- $list = Db::name("citysite")->where("status=1")->order("level asc")->getField("id,parent_id,status,is_default,level");
- $count = count($list);
- $is_true = true;
- if ($status == 1){
- if ($count == 0 || ($count == 1 && empty($list[$id]))){
- $is_true = $this->setIsDefault($id);
- }
- }else{
- if ($count == 1 && !empty($list[$id])){
- $this->error("至少存在一个开启区域!".$status);
- }
- if (!empty($list[$id]) && $list[$id]['is_default'] == 1){
- $peer_id = $top_id = $any_id = 0;
- foreach ($list as $val){
- if (empty($peer_id) && $val['id']!= $id && $val['parent_id'] == $list[$id]['parent_id']){
- $peer_id = $val['id'];
- break;
- }
- if (empty($top_id) && $val['id']!= $id && $val['parent_id'] == 0){
- $top_id = $val['id'];
- }
- if (empty($any_id) && $val['id']!= $id){
- $any_id = $val['id'];
- }
- }
- if ($peer_id){
- $default_id = $peer_id;
- }else if($top_id){
- $default_id = $top_id;
- }else{
- $default_id = $any_id;
- }
- $is_true = $this->setIsDefault($default_id);
- }
- }
- if (!$is_true){
- $this->error("设置失败,请检查二级域名不能为空!");
- }
- Db::name('citysite')->where(['id'=>$id])->cache(true, null, "citysite")->update(['status'=>$status, 'update_time'=>getTime()]);
-
- $this->success("设置成功");
- */
- }
-
- /*
- * 设置默认区域
- */
- // private function setIsDefault($id){
- // $id = intval($id);
- // $subdomain = Db::name('citysite')->where(['id'=>$id])->getField('domain');
- // if ($this->web_citysite_open && empty($subdomain)) { //如果为开启状态,且二级域名为空,不允许设置
- // return false;
- // }
- // $is_true = Db::name('citysite')->where(['id'=>$id])->update(['is_default'=>1, 'update_time'=>getTime()]);
- // if ($is_true){
- // Db::name('citysite')->where(['id'=>['neq',$id]])->update(['is_default'=>0, 'update_time'=>getTime()]);
- // tpCache('site', ['site_default_home'=>$id]);
- // }
- // \think\Cache::clear('citysite');
-
- // return $is_true;
- // }
-
- /*
- * 设置是否默认
- */
- // public function setSortOrder(){
- // $id = input('id/d', 0);
- // $is_true = $this->setIsDefault($id);
- // if ($is_true){
- // $this->success("设置成功");
- // }else{
- // $this->error("设置失败,请检查二级域名不能为空!");
- // }
- // }
-
- //获取全部省份
- private function get_site_province_all()
- {
- $result = Db::name('citysite')->field('id, name')
- ->where('level',1)
- ->order("sort_order asc, id asc")
- ->getAllWithIndex('id');
-
- return $result;
- }
-
- /**
- * 获取子类列表
- */
- public function ajax_get_region($pid = 0, $level = 2, $siteid = '', $text = '--请选择--')
- {
- \think\Session::pause(); // 暂停session,防止session阻塞机制
- $data = model('Citysite')->getList($pid,'*','',$level);
- $html = "<option value=''>".urldecode($text)."</option>";
- foreach($data as $key=>$val){
- if ($val['id'] == $siteid) {
- unset($data[$key]);
- continue;
- }
- $html.="<option value='".$val['id']."'>".$val['name']."</option>";
- }
- $isempty = 0;
- if (empty($data)){
- $isempty = 1;
- }
- $this->success($html,'',['isempty'=>$isempty]);
- }
-
- /*
- * 获取区域列表(关联栏目)
- * pid 上级id
- * level 级别
- * relevance 关联模型(表名称),为空时表示不关联
- * text 不选择时显示text
- */
- public function ajax_get_region_arc($pid = 0,$level = 1,$channel = '9', $text = '--请选择--')
- {
- \think\Session::pause(); // 暂停session,防止session阻塞机制
- $regionIds = $this->getAllRegionIds($level,'',$channel);
- $data = Db::name('citysite')->field("*")
- ->where(["id"=>['in',$regionIds],'parent_id'=>$pid])
- ->select();
- if ($level == 1 && count($data) == 1){ //只存在一个省份
- $html = "<input type='hidden' id='province_id' name='province_id' value='".$data[0]['id']."'>";
- }else if ($level == 1){
- $html = "<select name='province_id' id='province_id'>";
- $html .= "<option value=''>".urldecode($text)."</option>";
- foreach($data as $key=>$val){
- $html.="<option value='".$val['id']."'>".$val['name']."</option>";
- }
- $html .= "</select>";
- }else{
- $html = "<select name='city_id' id='city_id'>";
- $html .= "<option value=''>".urldecode($text)."</option>";
- foreach($data as $key=>$val){
- $html.="<option value='".$val['id']."'>".$val['name']."</option>";
- }
- $html .= "</select>";
- }
-
- $this->success($html);
- }
-
- /*
- * 获取所有区域(id)集合
- */
- private function getAllRegionIds($level,$typeid = "",$channel = ""){
- $field = "province_id";
- if ($level == 2){
- $field = "city_id";
- }else if ($level == 3){
- $field = "area_id";
- }
- $where['status'] = 1;
- $where['is_del'] = 0;
- if (!empty($typeid)){
- $where['typeid'] = ['in',$typeid];
- }else if (!empty($channel)){
- $where['channel'] = ['in',$channel];
- }
- $regionIds = Db::name('archives')->where($where)->group($field)->getField($field,true);
-
- return $regionIds;
- }
-
- /**
- * 删除
- */
- public function del()
- {
- $id_arr = input('del_id/a');
- $id_arr = eyIntval($id_arr);
- if(IS_POST && !empty($id_arr)){
-
- // $count = Db::name('citysite')->where('parent_id','IN',$id_arr)->count();
- // if ($count > 0){
- // $this->error('所选区域有下级区域,请先删除下级区域');
- // }
-
- $result = Db::name('citysite')->where([
- 'id' => ['IN', $id_arr],
- ])->select();
- $level = 0;
- $name_list = [];
- foreach ($result as $key => $val) {
- empty($level) && $level = $val['level'];
- $name_list[] = $val['name'];
- }
-
- $r = Db::name('citysite')->where([
- 'id' => ['IN', $id_arr],
- ])
- ->cache(true, null, "citysite")
- ->delete();
- if($r !== false){
- /*默认区域被删除,自动处理主站默认区域为空*/
- $site_default_home = tpCache('global.site_default_home');
- if (!empty($site_default_home) && in_array($site_default_home, $id_arr)) {
- tpCache('site', ['site_default_home'=>0]);
- }
- /*end*/
-
- // 删除所有下级区域
- if (2 == $level) {
- Db::name('citysite')->where([
- 'parent_id' => ['IN', $id_arr],
- ])
- ->cache(true, null, "citysite")
- ->delete();
- } else if (1 == $level) {
- Db::name('citysite')->where([
- 'topid' => ['IN', $id_arr],
- ])
- ->cache(true, null, "citysite")
- ->delete();
- }
-
- // extra_cache('global_get_site_province_list', null);
- // extra_cache('global_get_site_city_list', null);
- // extra_cache('global_get_site_area_list', null);
- adminLog('删除区域:'.implode(',', $name_list));
- $this->success('删除成功');
- }
- }
- $this->error('删除失败');
- }
-
- /**
- * 判断子域名的唯一性
- */
- private function domain_unique($domain = '', $id = 0)
- {
- $result = Db::name('citysite')->field('id,domain')->getAllWithIndex('id');
- if (!empty($result)) {
- if (0 < $id) unset($result[$id]);
- !empty($result) && $result = get_arr_column($result, 'domain');
- }
- empty($result) && $result = [];
- $dirnames = Db::name('arctype')->column('dirname');
- foreach ($dirnames as $key => $val) {
- $dirnames[$key] = strtolower($val);
- }
- $disableDirname = array_merge($this->disableDirname, $dirnames, $result);
- if (in_array(strtolower($domain), $disableDirname)) {
- return false;
- }
- return true;
- }
-
- /**
- * 生成随机子域名,确保唯一性
- */
- private function rand_domain($domain = '')
- {
- if (empty($domain)) {
- $domain = strtolower(get_rand_str(6, 0, 1));
- }
- if (!$this->domain_unique($domain)) {
- $domain = $domain . mt_rand(0,9);
- return $this->rand_domain($domain);
- }
-
- return $domain;
- }
-
- /*
- * js打开获取子区域列表
- */
- public function ajaxSelectRegion(){
- $list = Db::name("citysite")->where("status=1")->select();
- $this->assign('list', $list);
- $this->assign('json_arctype_list', json_encode($list));
- $func = input('func/s');
- $assign_data['func'] = $func;
- $this->assign($assign_data);
-
- return $this->fetch();
- }
-
- /*
- * js获取region
- */
- public function ajaxGetOne($where = ""){
- return Db::name('citysite')->where($where)->find();
- }
-
- /**
- * 获取城市站点的所有上级区域id
- */
- private function getParentCitysiteId($id){
- $id = intval($id);
- static $regionArr = array();
- static $countnext = 0;
- $countnext++;
- $regionArr[] = $id;
- if(!empty($id)){
- $list = Db::name('citysite')->field('id,parent_id')->where('id',$id)->find();
- if($list && $list['parent_id']!=0){
- $this->getParentCitysiteId($list['parent_id']);
- }
- }
- $countnext--;
- $result = $regionArr;
- if($countnext == 0){
- $regionArr = array();
- }
- return $result;
- }
-
- /**
- * 获取区域的拼音
- */
- public function ajax_get_name_pinyin($name = '')
- {
- $pinyin = get_pinyin($name);
- $this->success('提取成功', null, ['pinyin'=>$pinyin]);
- }
-
- /**
- * 快速启用百强市
- */
- public function set_bqs_status()
- {
- $list = Db::name('citysite')->where(['level'=>['IN', [1,2]],'status'=>0])->select();
- if (!empty($list)) {
- $where = [];
- $top_city_arr = [];
- foreach (self::$top_city as $key => $val) {
- $where[] = " `name` LIKE '{$key}%' ";
- $top_city_arr = array_merge($top_city_arr, $val);
- }
- $where_str = implode(' OR ', $where);
- $provinceList = Db::name('citysite')->field('id,name')->where(['level'=>1])->where($where_str)->select();
- $province_ids = [];
- foreach ($provinceList as $key => $val) {
- foreach (self::$top_city as $_k => $_v) {
- if (stristr($val['name'], $_k)) {
- $provinceList[$_k] = $val;
- unset($provinceList[$key]);
- continue;
- }
- }
- $province_ids[] = $val['id'];
- }
- // 启用百强市涉及的省份
- Db::name('citysite')->where(['id'=>['IN', $province_ids]])->update(['status'=>1,'update_time'=>getTime()]);
- // 启用百强市
- foreach (self::$top_city as $key => $val) {
- $province_info = !empty($provinceList[$key]) ? $provinceList[$key] : [];
- if (empty($province_info)) {
- continue;
- }
- foreach ($val as $_k => $_v) {
- $where = [];
- foreach ($_v as $_k2 => $_v2) {
- $where[] = " `name` LIKE '{$_v2}%' ";
- }
- $where_str = implode(' OR ', $where);
- Db::name('citysite')->where([
- 'level' => 2,
- 'parent_id' => $province_info['id'],
- ])
- ->where($where_str)
- ->update(['status'=>1,'update_time'=>getTime()]);
- }
- }
- }
- $this->success('设置成功');
- }
-
- /**
- * 一键全部启用/禁用
- */
- public function set_city_status()
- {
- if (IS_AJAX_POST) {
- $status = input('param.status/d');
- $r = Db::name('citysite')->where([
- 'status' => empty($status) ? 1 : 0,
- ])->update([
- 'status' => empty($status) ? 0 : 1,
- 'update_time' => getTime(),
- ]);
- if ($r !== false) {
- delFile(RUNTIME_PATH);
- $this->success('操作成功');
- }
- }
- $this->error('操作失败');
- }
-
- /**
- * 批量设置地区
- * @return [type] [description]
- */
- public function batch_setcity()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- if (empty($post['ids'])) {
- $this->error('请至少勾选一个区域');
- }
- $post['ids'] = str_replace(',', ',', $post['ids']);
- $ids = explode(',', $post['ids']);
- $inherit_province = !empty($post['inherit_province']) ? intval($post['inherit_province']) : 0;
- $inherit_city = !empty($post['inherit_city']) ? intval($post['inherit_city']) : 0;
- $inherit_area = !empty($post['inherit_area']) ? intval($post['inherit_area']) : 0;
- if (empty($inherit_province) && empty($inherit_city) && empty($inherit_area)) {
- $this->error('请勾选要操作的区域级别');
- }
-
- $updateData = [];
- if (-1 < $post['is_open']) {
- $updateData['is_open'] = !empty($post['is_open']) ? intval($post['is_open']) : 0;
- }
-
- if (-1 < $post['showall']) {
- $updateData['showall'] = !empty($post['showall']) ? intval($post['showall']) : 0;
- }
-
- if (-1 < $post['status']) {
- $updateData['status'] = !empty($post['status']) ? intval($post['status']) : 0;
- }
-
- if (1 == $post['seoset']) {
- $updateData['seoset'] = 0;
- } else if (0 === $post['seoset']) {
- $updateData['seo_title'] = '';
- $updateData['seo_keywords'] = '';
- $updateData['seo_description'] = '';
- }
-
- if (!empty($updateData)) {
- $updateData['update_time'] = getTime();
- } else { // 都保持原设置了
- $this->success('操作成功');
- }
-
- $err = 0;
- // 在一级列表时操作区域
- if ($post['level'] == 1) {
- // 设置一级区域
- if (!empty($inherit_province)) {
- $r = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 1,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- // 设置二级区域
- if (!empty($inherit_city)) {
- $r = Db::name('citysite')->where([
- 'parent_id' => ['IN', $ids],
- 'level' => 2,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- // 设置三级区域
- if (!empty($inherit_area)) {
- $cityids = Db::name('citysite')->where([
- 'parent_id' => ['IN', $ids],
- 'level' => 2,
- ])->column('id');
- if (!empty($cityids)) {
- $r = Db::name('citysite')->where([
- 'parent_id' => ['IN', $cityids],
- 'level' => 3,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- }
- }
- // 在二级列表时操作区域
- else if ($post['level'] == 2) {
- // 设置一级区域
- if (!empty($inherit_province)) {
- $parent_ids = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 2,
- ])->column('parent_id');
- $r = Db::name('citysite')->where([
- 'id' => ['IN', $parent_ids],
- 'level' => 1,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- // 设置二级区域
- if (!empty($inherit_city)) {
- $r = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 2,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- // 设置三级区域
- if (!empty($inherit_area)) {
- $r = Db::name('citysite')->where([
- 'parent_id' => ['IN', $ids],
- 'level' => 3,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- }
- // 在三级列表时操作区域
- else if ($post['level'] == 3) {
- // 设置一级区域
- if (!empty($inherit_province)) {
- $topids = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 3,
- ])->column('topid');
- $r = Db::name('citysite')->where([
- 'id' => ['IN', $topids],
- 'level' => 1,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- // 设置二级区域
- if (!empty($inherit_city)) {
- $parent_ids = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 3,
- ])->column('parent_id');
- $r = Db::name('citysite')->where([
- 'id' => ['IN', $parent_ids],
- 'level' => 2,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- // 设置三级区域
- if (!empty($inherit_area)) {
- $r = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 3,
- ])->update($updateData);
- if ($r === false) $err++;
- }
- }
-
- if (empty($err)) {
- adminLog('批量设置区域-id:'.$post['ids']);
- $this->success('操作成功');
- } else {
- $this->error('操作失败');
- }
- }
-
- $level = input('param.level/d', 0);
- $level++;
- $assign_data = [];
- $assign_data['level'] = $level;
-
- $this->assign($assign_data);
-
- return $this->fetch();
- }
-
- /**
- * 批量设置SEO
- * @return [type] [description]
- */
- public function batch_setcityseo()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- if (empty($post['ids'])) {
- $this->error('请至少勾选一个区域');
- }
- $post['ids'] = str_replace(',', ',', $post['ids']);
- $ids = explode(',', $post['ids']);
- $inherit_province = !empty($post['inherit_province']) ? intval($post['inherit_province']) : 0;
- $inherit_city = !empty($post['inherit_city']) ? intval($post['inherit_city']) : 0;
- $inherit_area = !empty($post['inherit_area']) ? intval($post['inherit_area']) : 0;
- if (empty($inherit_province) && empty($inherit_city) && empty($inherit_area)) {
- $this->error('请勾选要操作的区域级别');
- }
-
- $err = 0;
- // 在一级列表时操作区域
- if ($post['level'] == 1) {
- // 设置一级区域
- if (!empty($inherit_province)) {
- $list = Db::name('citysite')->field('id,name')->where([
- 'id' => ['IN', $ids],
- 'level' => 1,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- // 设置二级区域
- if (!empty($inherit_city)) {
- $list = Db::name('citysite')->field('id,name')->where([
- 'parent_id' => ['IN', $ids],
- 'level' => 2,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- // 设置三级区域
- if (!empty($inherit_area)) {
- $cityids = Db::name('citysite')->where([
- 'parent_id' => ['IN', $ids],
- 'level' => 2,
- ])->column('id');
- if (!empty($cityids)) {
- $list = Db::name('citysite')->field('id,name')->where([
- 'parent_id' => ['IN', $cityids],
- 'level' => 3,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- }
- }
- // 在二级列表时操作区域
- else if ($post['level'] == 2) {
- // 设置一级区域
- if (!empty($inherit_province)) {
- $parent_ids = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 2,
- ])->column('parent_id');
- $list = Db::name('citysite')->field('id,name')->where([
- 'id' => ['IN', $parent_ids],
- 'level' => 1,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- // 设置二级区域
- if (!empty($inherit_city)) {
- $list = Db::name('citysite')->field('id,name')->where([
- 'id' => ['IN', $ids],
- 'level' => 2,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- // 设置三级区域
- if (!empty($inherit_area)) {
- $list = Db::name('citysite')->field('id,name')->where([
- 'parent_id' => ['IN', $ids],
- 'level' => 3,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- }
- // 在三级列表时操作区域
- else if ($post['level'] == 3) {
- // 设置一级区域
- if (!empty($inherit_province)) {
- $topids = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 3,
- ])->column('topid');
- $list = Db::name('citysite')->field('id,name')->where([
- 'id' => ['IN', $topids],
- 'level' => 1,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- // 设置二级区域
- if (!empty($inherit_city)) {
- $parent_ids = Db::name('citysite')->where([
- 'id' => ['IN', $ids],
- 'level' => 3,
- ])->column('parent_id');
- $list = Db::name('citysite')->field('id,name')->where([
- 'id' => ['IN', $parent_ids],
- 'level' => 2,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- // 设置三级区域
- if (!empty($inherit_area)) {
- $list = Db::name('citysite')->field('id,name')->where([
- 'id' => ['IN', $ids],
- 'level' => 3,
- ])->select();
- $this->batch_setcityseo_save($err, $list, $post);
- }
- }
-
- if (empty($err)) {
- adminLog('批量设置区域-id:'.$post['ids']);
- $this->success('操作成功');
- } else {
- $this->error('操作失败');
- }
- }
-
- $level = input('param.level/d', 0);
- $level++;
- $assign_data = [];
- $assign_data['level'] = $level;
-
- $this->assign($assign_data);
-
- return $this->fetch();
- }
-
- /**
- * 批量设置SEO - 统一更新数据
- * @param [type] &$err [description]
- * @param array $list [description]
- * @param array $post [description]
- * @return [type] [description]
- */
- private function batch_setcityseo_save(&$err, $list = [], $post = [])
- {
- if (!empty($list)) {
- $seo_title = !empty($post['seo_title']) ? trim($post['seo_title']) : '';
- $seo_keywords = !empty($post['seo_keywords']) ? trim($post['seo_keywords']) : '';
- $seo_description = !empty($post['seo_description']) ? trim($post['seo_description']) : '';
-
- $updateData = [];
- foreach ($list as $key => $val) {
- $updateData[] = [
- 'id' => $val['id'],
- 'seo_title' => str_replace(['{region}','{区域}'], $val['name'], $seo_title),
- 'seo_keywords' => str_replace(['{region}','{区域}'], $val['name'], $seo_keywords),
- 'seo_description' => str_replace(['{region}','{区域}'], $val['name'], $seo_description),
- 'update_time' => getTime(),
- ];
- }
- $r = model('Citysite')->saveAll($updateData);
- if ($r === false) $err++;
- }
- }
-
- /**
- * 获取地区表ey_region的城市列表
- */
- public function ajax_get_region_list($pid = 0, $level = 2, $region_id = '', $text = '--请选择--')
- {
- if ($pid == 1) { // 北京市
- $pid = 2;
- $level = 3;
- } else if ($pid == 338) { // 天津市
- $pid = 339;
- $level = 3;
- } else if ($pid == 10543) { // 上海市
- $pid = 10544;
- $level = 3;
- } else if ($pid == 31929) { // 重庆市
- $pid = [31930,32380];
- $level = 3;
- }
- $data = model('Region')->getList($pid,'*','',$level);
- $html = "<option value=''>".urldecode($text)."</option>";
- foreach($data as $key=>$val){
- if ($val['id'] == $region_id) {
- unset($data[$key]);
- continue;
- }
- // 当区域名称大于2两个字是,就去除末尾指定的字
- if (strlen($val['name']) >= 9) {
- $val['name'] = preg_replace('/(省|市|县|区|乡|镇|旗|州|农场)$/i', '', $val['name']);
- }
- $html.="<option value='".$val['id']."'>".$val['name']."</option>";
- }
- $isempty = 0;
- if (empty($data)){
- $isempty = 1;
- }
- $this->success($html,'',['isempty'=>$isempty]);
-
- }
-
- /**
- * 处理区域的末尾多余文字
- * @param string $name [description]
- * @return [type] [description]
- */
- private function handle_name($name = '')
- {
- // 当区域名称大于2两个字是,就去除末尾指定的字
- if (strlen($name) >= 9) {
- $name = preg_replace('/(地区|壮族自治区|维吾尔自治区|回族自治区|自治区|市辖区|特别行政区)$/i', '', $name);
- $name = preg_replace('/(省|市|县|区|乡|镇|旗|州|盟|行政单位|街道)$/i', '', $name);
- }
-
- return $name;
- }
-
- /**
- * 一键导入全国城市
- * @return [type] [description]
- */
- public function import_city()
- {
- //防止数据过程超时
- function_exists('set_time_limit') && set_time_limit(0);
- @ini_set('memory_limit','-1');
-
- if (IS_POST) {
- $post = input('post.');
- $province_name = '';
- $province_id = !empty($post['province_id']) ? intval($post['province_id']) : 0;
- $cur_province_id = input('param.cur_province_id/d', 0);
- if (!empty($cur_province_id)) {
- $province_id = $cur_province_id;
- }
- $city_name = '';
- $city_id = !empty($post['city_id']) ? intval($post['city_id']) : 0;
- $seo_title = !empty($post['seo_title']) ? trim($post['seo_title']) : '';
- $seo_keywords = !empty($post['seo_keywords']) ? trim($post['seo_keywords']) : '';
- $seo_description = !empty($post['seo_description']) ? trim($post['seo_description']) : '';
-
- /*---------------------读取要导入的城市列表 start---------------------*/
- if (empty($province_id)) { // 导入全国城市
- $level = 1;
- $parent_id = 0;
- $topid = 0;
- $regionList = Db::name('region')->order('level asc, parent_id asc, id asc')->select();
- $regionList = group_same_key($regionList, 'level');
- // 北京、天津、上海、重庆,这四个省级市的二级删掉、三级区域转成二级
- foreach ($regionList[2] as $key => $val) {
- if ($val['id'] == 2) { // 北京市
- unset($regionList[2][$key]);
- $row = Db::name('region')->field('id,name,2 as level,1 as parent_id,initial')->where(['parent_id'=>2])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 339) { // 天津市
- unset($regionList[2][$key]);
- $row = Db::name('region')->field('id,name,2 as level,338 as parent_id,initial')->where(['parent_id'=>339])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 10544) { // 上海市
- unset($regionList[2][$key]);
- $row = Db::name('region')->field('id,name,2 as level,10543 as parent_id,initial')->where(['parent_id'=>10544])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 31930) { // 重庆市 - 市
- unset($regionList[2][0]);
- $row = Db::name('region')->field('id,name,2 as level,31929 as parent_id,initial')->where(['parent_id'=>31930])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 32380) { // 重庆市 - 县
- unset($regionList[2][0]);
- $row = Db::name('region')->field('id,name,2 as level,31929 as parent_id,initial')->where(['parent_id'=>32380])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- }
- }
- // 北京、天津、上海、重庆,这四个省级市的三级删掉
- foreach ($regionList[3] as $key => $val) {
- if (in_array($val['parent_id'], [2,339,10544,31930,32380])) {
- unset($regionList[3][$key]);
- }
- }
- }
- else if (!empty($province_id) && empty($city_id)) { // 导入指定当前省份和下级的全部市县
- // 要导入的省份名称
- $province_name = Db::name('region')->where(['id'=>$province_id])->value('name');
- $province_name = preg_replace('/(省|市)$/i', '', $province_name);
-
- $level = 2;
- $parent_id = (int)Db::name('citysite')->where(['level'=>1,'name'=>['LIKE', "{$province_name}%"]])->value('id');
- $topid = $parent_id;
-
- $region_ids = [$province_id];
- $city_ids = Db::name('region')->where(['parent_id'=>$province_id])->column('id');
- if (!empty($city_ids)) {
- $region_ids = array_merge($region_ids, $city_ids);
- $area_ids = Db::name('region')->where(['parent_id'=>['IN', $city_ids]])->column('id');
- !empty($area_ids) && $region_ids = array_merge($region_ids, $area_ids);
- }
- $regionList = Db::name('region')->where(['id'=>['IN', $region_ids]])->order('level asc, parent_id asc, id asc')->select();
- $regionList = group_same_key($regionList, 'level');
- // 北京、天津、上海、重庆,这四个省级市的二级删掉、三级区域转成二级
- foreach ($regionList[2] as $key => $val) {
- if ($val['id'] == 2) { // 北京市
- unset($regionList[2][$key]);
- $row = Db::name('region')->field('id,name,2 as level,1 as parent_id,initial')->where(['parent_id'=>2])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 339) { // 天津市
- unset($regionList[2][$key]);
- $row = Db::name('region')->field('id,name,2 as level,338 as parent_id,initial')->where(['parent_id'=>339])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 10544) { // 上海市
- unset($regionList[2][$key]);
- $row = Db::name('region')->field('id,name,2 as level,10543 as parent_id,initial')->where(['parent_id'=>10544])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 31930) { // 重庆市 - 市
- unset($regionList[2][0]);
- $row = Db::name('region')->field('id,name,2 as level,31929 as parent_id,initial')->where(['parent_id'=>31930])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- } else if ($val['id'] == 32380) { // 重庆市 - 县
- unset($regionList[2][0]);
- $row = Db::name('region')->field('id,name,2 as level,31929 as parent_id,initial')->where(['parent_id'=>32380])->order('id asc')->select();
- $regionList[2] = array_merge($regionList[2], $row);
- }
- }
- // 北京、天津、上海、重庆,这四个省级市的三级删掉
- foreach ($regionList[3] as $key => $val) {
- if (in_array($val['parent_id'], [2,339,10544,31930,32380])) {
- unset($regionList[3][$key]);
- }
- }
- }
- else if (!empty($province_id) && !empty($city_id)) { // 导入指定当前省份和下级的全部市县
- $row = Db::name('region')->where(['id'=>['IN', [$province_id, $city_id]]])->getAllWithIndex('id');
- // 要导入的省份名称
- $province_name = preg_replace('/(省|市)$/i', '', $row[$province_id]['name']);
- // 要导入的二级城市名称
- $city_name = $this->handle_name($row[$province_id]['name']);
-
- $level = 3;
- $topid = (int)Db::name('citysite')->where(['level'=>1,'name'=>['LIKE', "{$province_name}%"]])->value('id');
- $parent_id = (int)Db::name('citysite')->where(['parent_id'=>$topid,'level'=>2,'name'=>['LIKE', "{$city_name}%"]])->value('id');
-
- $region_ids = [$province_id, $city_id];
- $area_ids = Db::name('region')->where(['parent_id'=>$city_id])->column('id');
- !empty($area_ids) && $region_ids = array_merge($region_ids, $area_ids);
- $regionList = Db::name('region')->where(['id'=>['IN', $region_ids]])->order('level asc, parent_id asc, id asc')->select();
- $regionList = group_same_key($regionList, 'level');
- // 北京、天津、上海、重庆,这四个省级市的三级删掉
- foreach ($regionList[3] as $key => $val) {
- if (in_array($val['parent_id'], [2,339,10544,31930,32380])) {
- unset($regionList[3][$key]);
- }
- }
- }
- /*---------------------读取要导入的城市列表 end---------------------*/
-
- /*---------------------多城市站点的树形结构、每个层级的结构 start---------------------*/
- $tree_site = $province_site = $city_site = $area_site = $domainArr = [];
- $arr1 = $arr2 = $arr3 = $arr4 = [];
- $row = Db::name('citysite')->field('id,name,parent_id,topid,level,domain')->order('level asc, parent_id asc, id asc')->select();
- foreach ($row as $key => $val) {
- $domainArr[] = $val['domain'];
- $val['name'] = $this->handle_name($val['name']);
- if ($val['level'] == 1) {
- $val['child'] = [];
- $arr1[$val['id']] = $val;
- $province_site[$val['name']] = $val;
- $tree_site[$val['name']] = $val;
- } else if ($val['level'] == 2) {
- $val['child'] = [];
- $arr2[$val['parent_id']][$val['id']] = $val;
- $arr4[$val['id']] = $val;
- $parent_info = $arr1[$val['parent_id']];
- $city_site[$parent_info['name']][$val['name']] = $val;
- $tree_site[$parent_info['name']]['child'][$val['name']] = $val;
- } else if ($val['level'] == 3) {
- $val['child'] = [];
- $arr3[$val['parent_id']][$val['id']] = $val;
- $parent_info = $arr4[$val['parent_id']];
- $top_info = $arr1[$val['topid']];
- $area_site[$top_info['name']][$parent_info['name']][$val['name']] = $val;
- $tree_site[$top_info['name']]['child'][$parent_info['name']]['child'][$val['name']] = $val;
- }
- }
- /*---------------------多城市站点的树形结构、每个层级的结构 end---------------------*/
-
- $err = 0;
- // 批量添加一级区域
- if (!empty($regionList[1])) {
- $nameArr = [];
- foreach ($regionList[1] as $key => $val) {
- $is_add = true;
- foreach ($province_site as $_k => $_v) {
- if (stristr($val['name'], $_v['name'])) {
- $is_add = false;
- break;
- }
- }
- if ($is_add) {
- $nameArr[] = $this->handle_name($val['name']);
- }
- }
- if (!empty($nameArr)) {
- $addData = [];
- foreach ($nameArr as $key => $val) {
- $domain = preg_replace("/[^a-zA-Z0-9]+/", "", get_pinyin($val));
- if (in_array($domain, $domainArr)) {
- $domain = $this->rand_domain($domain);
- }
- $addData[] = [
- 'name' => $val,
- 'domain' => $domain,
- 'level' => 1,
- 'parent_id' => 0,
- 'topid' => 0,
- 'is_open' => !empty($post['is_open']) ? intval($post['is_open']) : 0,
- 'showall' => !empty($post['showall']) ? intval($post['showall']) : 1,
- 'seoset' => !empty($post['seoset']) ? intval($post['seoset']) : 0,
- 'status' => !empty($post['status']) ? intval($post['status']) : 0,
- 'initial' => getFirstCharter($val),
- 'seo_title' => str_replace(['{region}','{区域}'], $val, $seo_title),
- 'seo_keywords' => str_replace(['{region}','{区域}'], $val, $seo_keywords),
- 'seo_description' => str_replace(['{region}','{区域}'], $val, $seo_description),
- 'sort_order' => 100,
- 'add_time' => getTime(),
- 'update_time' => getTime(),
- ];
- }
- $r = model('Citysite')->saveAll($addData);
- if ($r === false) {
- $err++;
- } else {
- foreach ($r as $k1 => $v1) {
- $arr_new = $v1->getData();
- $arr_new['child'] = [];
- $arr1[$arr_new['id']] = $arr_new;
- $province_site[$arr_new['name']] = $arr_new;
- $tree_site[$arr_new['name']] = $arr_new;
- }
- }
- }
- }
-
- // 批量添加二级区域
- if (empty($err) && !empty($regionList[2])) {
- $province_region = Db::name('region')->where(['level'=>1])->getAllWithIndex('id');
- $nameArr = $parent_ids_arr = [];
- foreach ($regionList[2] as $key => $val) {
- $is_add = true;
- $parent_info = $province_region[$val['parent_id']];
- $parent_info['name'] = $this->handle_name($parent_info['name']);
- foreach ($city_site[$parent_info['name']] as $_k => $_v) {
- if (stristr($val['name'], $_v['name'])) {
- $is_add = false;
- break;
- }
- }
- if ($is_add) {
- $nameArr[] = $this->handle_name($val['name']);
- $parent_name = $parent_info['name'];
- $parent_ids_arr[] = $province_site[$parent_name]['id'];
- }
- }
- if (!empty($nameArr)) {
- $addData = [];
- $domainArr = Db::name('citysite')->where(['id'=>['gt', 0]])->column('domain');
- foreach ($nameArr as $key => $val) {
- $domain = preg_replace("/[^a-zA-Z0-9]+/", "", get_pinyin($val));
- if (in_array($domain, $domainArr)) {
- $domain = $this->rand_domain($domain);
- }
- $addData[] = [
- 'name' => $val,
- 'domain' => $domain,
- 'level' => 2,
- 'parent_id' => $parent_ids_arr[$key],
- 'topid' => $parent_ids_arr[$key],
- 'is_open' => !empty($post['is_open']) ? intval($post['is_open']) : 0,
- 'showall' => !empty($post['showall']) ? intval($post['showall']) : 1,
- 'seoset' => !empty($post['seoset']) ? intval($post['seoset']) : 0,
- 'status' => !empty($post['status']) ? intval($post['status']) : 0,
- 'initial' => getFirstCharter($val),
- 'seo_title' => str_replace(['{region}','{区域}'], $val, $seo_title),
- 'seo_keywords' => str_replace(['{region}','{区域}'], $val, $seo_keywords),
- 'seo_description' => str_replace(['{region}','{区域}'], $val, $seo_description),
- 'sort_order' => 100,
- 'add_time' => getTime(),
- 'update_time' => getTime(),
- ];
- }
- $r = model('Citysite')->saveAll($addData);
- if ($r === false) {
- $err++;
- } else {
- foreach ($r as $k1 => $v1) {
- $arr_new = $v1->getData();
- $arr_new['child'] = [];
- $arr2[$arr_new['parent_id']][$arr_new['id']] = $arr_new;
- $parent_info = $arr1[$arr_new['parent_id']];
- $city_site[$parent_info['name']][$arr_new['name']] = $arr_new;
- $tree_site[$parent_info['name']]['child'][$arr_new['name']] = $arr_new;
- }
- }
- }
- }
-
- // 批量添加三级区域
- if (empty($err) && !empty($regionList[3])) {
- $province_region = Db::name('region')->where(['level'=>1])->getAllWithIndex('id');
- $city_region = Db::name('region')->where(['level'=>2])->getAllWithIndex('id');
- $nameArr = $topids_arr = $parent_ids_arr = [];
- foreach ($regionList[3] as $key => $val) {
- $is_add = true;
- $parent_info = $city_region[$val['parent_id']];
- $parent_info['name'] = $this->handle_name($parent_info['name']);
- $top_info = $province_region[$parent_info['parent_id']];
- $top_info['name'] = $this->handle_name($top_info['name']);
- foreach ($area_site[$top_info['name']][$parent_info['name']] as $_k => $_v) {
- if (stristr($val['name'], $_v['name'])) {
- $is_add = false;
- break;
- }
- }
- if ($is_add) {
- $handle_name = $this->handle_name($val['name']);
- if (!empty($handle_name)) {
- $nameArr[] = $handle_name;
- $top_name = $top_info['name'];
- $topids_arr[] = $province_site[$top_name]['id'];
- $parent_name = $parent_info['name'];
- $parent_ids_arr[] = $city_site[$top_name][$parent_name]['id'];
- }
- }
- }
- if (!empty($nameArr)) {
- $batch_num = 500; // 每次写入N条区域,避免写太多报500
- $nameArr = array_chunk($nameArr, $batch_num);
- $topids_arr = array_chunk($topids_arr, $batch_num);
- $parent_ids_arr = array_chunk($parent_ids_arr, $batch_num);
- foreach ($nameArr as $key_tmp => $val_tmp) {
- if (!empty($val_tmp)) {
- $addData = [];
- $domainArr = Db::name('citysite')->where(['id'=>['gt', 0]])->column('domain');
- foreach ($val_tmp as $key => $val) {
- $domain = preg_replace("/[^a-zA-Z0-9]+/", "", get_pinyin($val));
- if (in_array($domain, $domainArr)) {
- $domain = $this->rand_domain($domain);
- }
- $addData[] = [
- 'name' => $val,
- 'domain' => $domain,
- 'level' => 3,
- 'parent_id' => $parent_ids_arr[$key_tmp][$key],
- 'topid' => $topids_arr[$key_tmp][$key],
- 'is_open' => !empty($post['is_open']) ? intval($post['is_open']) : 0,
- 'showall' => !empty($post['showall']) ? intval($post['showall']) : 1,
- 'seoset' => !empty($post['seoset']) ? intval($post['seoset']) : 0,
- 'status' => !empty($post['status']) ? intval($post['status']) : 0,
- 'initial' => getFirstCharter($val),
- 'seo_title' => str_replace(['{region}','{区域}'], $val, $seo_title),
- 'seo_keywords' => str_replace(['{region}','{区域}'], $val, $seo_keywords),
- 'seo_description' => str_replace(['{region}','{区域}'], $val, $seo_description),
- 'sort_order' => 100,
- 'add_time' => getTime(),
- 'update_time' => getTime(),
- ];
- }
- $r = model('Citysite')->saveAll($addData);
- if ($r === false) {
- $err++;
- }
- }
- }
- }
- }
-
- if (empty($err)) {
- $data = [];
- // 导入全国的轮询一个个省份导入 start
- if (!empty($cur_province_id)) {
- $data['progress'] = 0;
- $data['next_province_id'] = 0;
- $num = 0;
- $regionRow = Db::name('region')->where(['level'=>1])->order('id asc')->select();
- foreach ($regionRow as $key => $val) {
- $num++;
- if ($cur_province_id < $val['id']) {
- $data['next_province_id'] = $val['id'];
- break;
- }
- }
- $progress = $num / count($regionRow);
- $progress = sprintf("%.2f", substr(sprintf("%.3f", $progress), 0, -1));
- if ($progress == intval($progress)) {
- $progress = intval($progress);
- }
- $data['progress'] = intval($progress * 100);
- }
- // 导入全国的轮询一个个省份导入 end
-
- Cache::clear('citysite');
- adminLog('一键导入全国城市');
- $this->success("操作成功", null, $data);
- }else{
- $this->error("操作失败");
- }
- exit;
- }
-
- $assign_data = [];
-
- $province_list = Db::name('region')->field('id, name')
- ->where('level',1)
- ->select();
- foreach ($province_list as $key => $val) {
- $val['name'] = preg_replace('/(省|市)$/i', '', $val['name']);
- $province_list[$key] = $val;
- }
-
- $assign_data['province_list'] = $province_list;
- $this->assign($assign_data);
-
- return $this->fetch();
- }
- }
|