vr-shopxo-source/application/service/NavigationService.php

806 lines
28 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service;
use think\Db;
use think\facade\Hook;
/**
* 导航服务层
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class NavigationService
{
/**
* 获取导航
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-08-29
* @desc description
* @param [array] $params [输入参数]
*/
public static function Nav($params = [])
{
// 读取缓存数据
$header = cache(config('shopxo.cache_common_home_nav_header_key'));
$footer = cache(config('shopxo.cache_common_home_nav_footer_key'));
// 导航模型
$field = array('id', 'pid', 'name', 'url', 'value', 'data_type', 'is_new_window_open');
// 缓存没数据则从数据库重新读取,顶部菜单
if(empty($header))
{
$header = self::NavDataDealWith(Db::name('Navigation')->field($field)->where(array('nav_type'=>'header', 'is_show'=>1, 'pid'=>0))->order('sort')->select());
if(!empty($header))
{
foreach($header as &$v)
{
$v['items'] = self::NavDataDealWith(Db::name('Navigation')->field($field)->where(array('nav_type'=>'header', 'is_show'=>1, 'pid'=>$v['id']))->order('sort')->select());
}
}
// 大导航钩子
$hook_name = 'plugins_service_navigation_header_handle';
$ret = Hook::listen($hook_name, [
'hook_name' => $hook_name,
'is_backend' => true,
'params' => &$params,
'header' => &$header,
]);
cache(config('shopxo.cache_common_home_nav_header_key'), $header);
}
// 底部导航
if(empty($footer))
{
$footer = self::NavDataDealWith(Db::name('Navigation')->field($field)->where(array('nav_type'=>'footer', 'is_show'=>1, 'pid'=>0))->order('sort')->select());
if(!empty($footer))
{
foreach($footer as &$v)
{
$v['items'] = self::NavDataDealWith(Db::name('Navigation')->field($field)->where(array('nav_type'=>'footer', 'is_show'=>1, 'pid'=>$v['id']))->order('sort')->select());
}
}
// 底部导航钩子
$hook_name = 'plugins_service_navigation_footer_handle';
$ret = Hook::listen($hook_name, [
'hook_name' => $hook_name,
'is_backend' => true,
'params' => &$params,
'footer' => &$footer,
]);
cache(config('shopxo.cache_common_home_nav_footer_key'), $footer);
}
//print_r($header);
return [
'header' => $header,
'footer' => $footer,
];
}
/**
* [NavDataDealWith 导航数据处理]
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2017-02-05T21:36:46+0800
* @param [array] $data [需要处理的数据]
* @return [array] [处理好的数据]
*/
public static function NavDataDealWith($data)
{
if(!empty($data) && is_array($data))
{
foreach($data as $k=>$v)
{
// url处理
switch($v['data_type'])
{
// 文章分类
case 'article':
$v['url'] = MyUrl('index/article/index', ['id'=>$v['value']]);
break;
// 自定义页面
case 'customview':
$v['url'] = MyUrl('index/customview/index', ['id'=>$v['value']]);
break;
// 商品分类
case 'goods_category':
$v['url'] = MyUrl('index/search/index', ['category_id'=>$v['value']]);
break;
}
$data[$k] = $v;
}
}
return $data;
}
/**
* 获取导航列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-12-18
* @desc description
* @param [array] $params [输入参数]
*/
public static function NavList($params = [])
{
if(empty($params['nav_type']))
{
return [];
}
$field = 'id,pid,name,url,value,data_type,sort,is_show,is_new_window_open';
$data = self::NavDataDealWith(Db::name('Navigation')->field($field)->where(['nav_type'=>$params['nav_type'], 'pid'=>0])->order('sort')->select());
if(!empty($data))
{
foreach($data as &$v)
{
$v['items'] = self::NavDataDealWith(Db::name('Navigation')->field($field)->where(['nav_type'=>$params['nav_type'], 'pid'=>$v['id']])->order('sort')->select());
}
}
return $data;
}
/**
* 获取一级导航列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-12-18
* @desc description
* @param [array] $params [输入参数]
*/
public static function LevelOneNav($params = [])
{
if(empty($params['nav_type']))
{
return [];
}
return Db::name('Navigation')->field('id,name')->where(['is_show'=>1, 'pid'=>0, 'nav_type'=>$params['nav_type']])->select();
}
/**
* 导航保存
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-07T21:58:19+0800
* @param [array] $params [输入参数]
*/
public static function NavSave($params = [])
{
if(empty($params['data_type']))
{
return DataReturn('操作类型有误', -1);
}
// 请求类型
$p = [
[
'checked_type' => 'length',
'key_name' => 'sort',
'checked_data' => '4',
'error_msg' => '顺序 0~255 之间的数值',
],
[
'checked_type' => 'in',
'key_name' => 'is_show',
'checked_data' => [0,1],
'error_msg' => '是否显示范围值有误',
],
[
'checked_type' => 'in',
'key_name' => 'is_new_window_open',
'checked_data' => [0,1],
'error_msg' => '是否新窗口打开范围值有误',
]
];
switch($params['data_type'])
{
// 自定义导航
case 'custom':
$p = [
[
'checked_type' => 'in',
'key_name' => 'nav_type',
'checked_data' => ['header', 'footer'],
'error_msg' => '数据类型有误',
],
[
'checked_type' => 'length',
'key_name' => 'name',
'checked_data' => '2,16',
'error_msg' => '导航名称格式 2~16 个字符',
],
[
'checked_type' => 'fun',
'key_name' => 'url',
'checked_data' => 'CheckUrl',
'error_msg' => 'url格式有误',
],
];
break;
// 文章分类导航
case 'article':
$p = [
[
'checked_type' => 'length',
'key_name' => 'name',
'checked_data' => '2,16',
'is_checked' => 1,
'error_msg' => '导航名称格式 2~16 个字符',
],
[
'checked_type' => 'empty',
'key_name' => 'value',
'error_msg' => '文章选择有误',
],
];
break;
// 自定义页面导航
case 'customview':
$p = [
[
'checked_type' => 'length',
'key_name' => 'name',
'checked_data' => '2,16',
'is_checked' => 1,
'error_msg' => '导航名称格式 2~16 个字符',
],
[
'checked_type' => 'empty',
'key_name' => 'value',
'error_msg' => '自定义页面选择有误',
],
];
break;
// 商品分类导航
case 'goods_category':
$p = [
[
'checked_type' => 'length',
'key_name' => 'name',
'checked_data' => '2,16',
'is_checked' => 1,
'error_msg' => '导航名称格式 2~16 个字符',
],
[
'checked_type' => 'empty',
'key_name' => 'value',
'error_msg' => '商品分类选择有误',
],
];
break;
// 没找到