* 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 = "";
foreach($data as $key=>$val){
if ($val['id'] == $siteid) {
unset($data[$key]);
continue;
}
$html.="";
}
$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 = "";
}else if ($level == 1){
$html = "";
}else{
$html = "";
}
$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 = "";
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.="";
}
$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();
}
}