Files
Pichome/dzz/banner/list.php
2024-01-31 01:00:33 +08:00

432 lines
16 KiB
PHP

<?php
/*
* @copyright QiaoQiaoShiDai Internet Technology(Shanghai)Co.,Ltd
* @license https://www.oaooa.com/licenses/
*
* @link https://www.oaooa.com
* @author zyx(zyx@oaooa.com)
*/
if (!defined('IN_OAOOA')) {
exit('Access Denied');
}
$overt = getglobal('setting/overt');
if(!$overt && !$overt = C::t('setting')->fetch('overt')){
Hook::listen('check_login');//检查是否登录,未登录跳转到登录界面
}
global $_G;
$uid = $_G['uid'];
$gid = intval($_GET['gid']);
$gdata = C::t('#tab#tab_group')->fetch_by_gid($gid);
$do = isset($_GET['do']) ? trim($_GET['do']):'';
if($do == 'filelist'){//卡片列表
$perpage = isset($_GET['perpage']) ? intval($_GET['perpage']) : 150;//每页数量
$page = isset($_GET['page']) ? intval($_GET['page']) : 1;//页码数
$start = ($page - 1) * $perpage; //开始条数
$limit = isset($_GET['limit']) ? intval($_GET['limit']):0;
if($limit){
//计算开始位置
$start = $start+$perpage - $limit;
$perpage = $limit;
}
$limitsql = "limit $start,$perpage";
$total = 0; //总条数
$disp = isset($_GET['disp']) ? trim($_GET['disp']) : '';//排序字段
$asc = isset($_GET['asc']) ? trim($_GET['asc']) : 'desc';//排序字段
$nocat = isset($_GET['nocat']) ? intval($_GET['nocat']) : 0;//是否是未分类
$cid = isset($_GET['cid']) ? intval($_GET['cid']) : 0;
$sql = " FROM %t t ";
$params = array('tab');
$wheresql = " t.gid = %d and t.isdelete = 0 ";
$para[] = $gid;
$isall = isset($_GET['isall']) ? intval($_GET['isall']):0;
if ($nocat) {
$sql .= ' LEFT JOIN %t tabcatrelation ON tabcatrelation.tid = t.tid ';
$params[] = 'tab_cat_relation';
$wheresql .= ' and ISNULL(tabcatrelation.id) ';
}
if ($cid) {
$haschildren = isset($_GET['hassub']) ? intval($_GET['hassub']):0;
$haschildren = 1;
if($haschildren){
$pathkey = DB::result_first("select pathkey from %t where cid = %d ",array('tab_cat',$cid));
$cids = [];
foreach(DB::fetch_all("select cid from %t where pathkey like %s",array('tab_cat',$pathkey.'%')) as $v){
$cids[] = $v['cid'];
}
$sql .= ' LEFT JOIN %t tabcatrelation ON tabcatrelation.tid = t.tid ';
$params[] = 'tab_cat_relation';
$wheresql .= ' and tabcatrelation.cid in (%n) ';
$para[]= $cids;
}else{
$sql .= ' LEFT JOIN %t tabcatrelation ON tabcatrelation.tid = t.tid ';
$params[] = 'tab_cat_relation';
$wheresql .= ' and tabcatrelation.cid = %d ';
$para[]= $cid;
}
}
$keyword = isset($_GET['S_keyword']) ? htmlspecialchars($_GET['S_keyword']) : '';
if ($keyword) {
$sql .= " LEFT JOIN %t searchattr ON searchattr.tid=t.tid and searchattr.skey='searchattr'";
$params[] = 'tab_attr';
$keywords = array();
$arr1 = explode('+', $keyword);
foreach ($arr1 as $value1) {
$value1 = trim($value1);
$arr2 = explode(' ', $value1);
$arr3 = array();
foreach ($arr2 as $value2) {
$arr3[] = "t.tabname LIKE %s";
$para[] = '%' . $value2 . '%';
$arr3[] = "searchattr.svalue LIKE %s";
$para[] = '%' . $value2 . '%';
}
$keywords[] = "(" . implode(" OR ", $arr3) . ")";
}
if ($keywords) {
$wheresql .= " and (" . implode(" AND ", $keywords) . ")";
}
}
//处理表单项
$formflags = array();
foreach ($_GET as $key => $val) {
if (strpos($key, 'f_') === 0) {
$formid = preg_replace("/^f_/", '', $key);
$formflags[$formid] = $val;
}
}
$searchlist = getsearchlistbysearchfiled($gdata['searchfiled']);
$wheresql1 = array();
foreach ($formflags as $flag => $val) {
if ($val == 'all' || $val == lang('unlimited')) continue;
$form = $searchlist[$flag];
$arr = array();
switch ($form['type']) {
case 'time':
$sql .= " LEFT JOIN %t attr_$flag ON attr_$flag.tid=t.tid and attr_$flag.skey=%s ";
$params[] = 'tab_attr';
$params[] = $flag;
$dateline = explode('_', $val);
$arr = [];
if ($dateline[0]) {
$arr[] = "unix_timestamp(attr_$flag.svalue) > %d";
$para[] = strtotime($dateline[0]);
}
if ($dateline[1]) {
$arr[] = "unix_timestamp(attr_$flag.svalue) < %d";
$para[] = strtotime($dateline[1]) + 24 * 60 * 60;
}
if ($arr) {
$wheresql .= " and (" . implode(" and ", $arr) . ")";
}
break;
case 'timerange'://多值日期搜索
$dateline = explode('_', $val);
$arr = [];
$sql .= " LEFT JOIN %t rd_$flag ON rd_$flag.tid=t.tid and rd_$flag.filedname=%s ";
$params[] = 'tab_rangedate';
$params[] = $flag;
$dateline = explode('_', $val);
$arr = [];
if ($dateline[0]) {
$arr[] = " rd_$flag.start >= %d ";
$para[] = strtotime($dateline[0].'-01-01');
}
$dateline[1] = $dateline[0]+1;
if ($dateline[1]) {
$arr[] = " rd_$flag.end <= %d ";
//$para[] = strtotime($dateline[1]) + 24 * 60 * 60;
$para[] = strtotime($dateline[1].'-01-01');
}
if ($arr) {
$wheresql .= " and (" . implode(" and ", $arr) . ")";
}
break;
case 'multiselect':
$sql .= " LEFT JOIN %t attr_$flag ON attr_$flag.tid=t.tid and attr_$flag.skey=%s ";
$params[] = 'tab_attr';
$params[] = $flag;
$arr = [];
if (!is_array($val)) $val = explode(',', $val);
foreach ($val as $v) {
if($v == -1){
$arr[] = "(isnull(attr_$flag.svalue) OR attr_$flag.svalue='')";
}else{
$arr[] = " find_in_set(%s,attr_$flag.svalue)";
$para[] = trim($v);
}
}
if ($arr) {
$wheresql .= " and (" . implode(" and ", $arr) . ")";
}
break;
case 'select':
$sql .= " LEFT JOIN %t attr_$flag ON attr_$flag.tid=t.tid and attr_$flag.skey=%s ";
$params[] = 'tab_attr';
$params[] = $flag;
$arr = [];
if (!is_array($val)) $val = explode(',', $val);
foreach ($val as $v) {
if($v == -1){
$arr[] = "(isnull(attr_$flag.svalue) OR attr_$flag.svalue='')";
}else {
$arr[] = " find_in_set(%s,attr_$flag.svalue)";
$para[] = trim($v);
}
}
if ($arr) {
$wheresql .= " and (" . implode(" OR ", $arr) . ")";
}
break;
case 'input':
$sql .= " LEFT JOIN %t attr_$flag ON attr_$flag.tid=t.tid and attr_$flag.skey=%s ";
$params[] = 'tab_attr';
$params[] = $flag;
if ($form['range'] == 1) {
if ($val == '_') break;
list($start, $end) = explode('_', $val);
if ($start) {
$wheresql .= " and CAST(attr_$flag.svalue AS unsigned)>=%d";
$para[] = intval($start);
}
if ($end) {
$wheresql .= " and CAST(attr_$flag.svalue AS unsigned)<=%d";
$para[] = intval($end);
}
} elseif ($form['range'] == 2 || $form['range'] == 3) {
if (!is_array($val)) $val = explode(',', $val);
$wheresql .= " and attr_$flag.svalue IN (%n)";
$para[] = $val;
} else {
$wheresql .= " and attr_$flag.svalue=%s";
$para[] = $val;
}
break;
case 'grade':
$sql .= " LEFT JOIN %t attr_$flag ON attr_$flag.tid=t.tid and attr_$flag.skey=%s ";
$params[] = 'tab_attr';
$params[] = $flag;
$tarr = array();
if (!is_array($val)) $val = explode(',', $val);
foreach ($val as $a) {
$a = intval($a);
if ($a == 0) {
$tarr[] = "(isnull(attr_$flag.svalue) OR attr_$flag.svalue='0' OR attr_$flag.svalue='') ";
} else {
$tarr[] = "attr_$flag.svalue = %s";
$para[] = $a;
}
}
if ($tarr) {
$wheresql .= " and (" . implode(" OR ", $tarr) . ")";
}
break;
case 'label':
$sql .= " LEFT JOIN %t attr_$flag ON attr_$flag.tid=t.tid and attr_$flag.skey=%s ";
$params[] = 'tab_attr';
$params[] = $flag;
$tarr = array();
$tids = !is_array($val) ? explode(',', $val) : $val;
foreach ($tids as $tid) {
if ($tid == -1) {
$tarr[] = "(isnull(attr_$flag.svalue) OR attr_$flag.svalue='')";
} else {
$tarr[] = "find_in_set(%d,attr_$flag.svalue)";
$para[] = $tid;
}
}
if ($tarr) {
$wheresql .= " and (" . implode(" OR ", $tarr) . ")";
}
break;
case 'user':
$sql .= " LEFT JOIN %t attr_$flag ON attr_$flag.tid=t.tid and attr_$flag.skey=%s ";
$params[] = 'tab_attr';
$params[] = $flag;
$tarr = array();
$fuids = !is_array($val) ? explode(',', $val) : $val;
foreach ($fuids as $_uid) {
$tarr[] = "find_in_set(%d,attr_$flag.svalue)";
$para[] = $_uid;
}
if ($tarr) {
$wheresql .= " and (" . implode(" OR ", $tarr) . ")";
}
break;
}
}
if (!isset($_GET['disp'])) {
//获取用户默认排序方式
$sortdata = C::t('user_setting')->fetch_by_skey('tabsortfileds_'.$gid);
$sortfilearr = ['dateline', 'sumnum', 'updatedate'];
if ($sortdata) {
$sortdatarr = unserialize($sortdata);
$disp = $sortdatarr['filed'];
$asc = $sortdatarr['sort'] ? 'asc' : 'desc';
} else {
$disp = 'dateline';
$asc = 'desc';
}
}
$groupsql = ' group by t.tid ';
switch ($disp){
case 'dateline':
$order = 't.tid';
break;
case 'views':
$sql .= 'left join %t v on v.idval = t.tid and v.idtype = 2 ';
$dispfiled = 'v.nums as num';
$params[] = 'views';
$order = ' num ';
break;
case 'updatedate':
$order = 't.updatedate';
break;
default:
$sql .= " LEFT JOIN %t attr_$disp ON attr_$disp.tid=t.tid and attr_$disp.skey=%s ";
$params[] = 'tab_attr';
$params[] = $disp;
$order = "val";
$dispfiled = 'any_value(attr_'.$disp.'.svalue) as val';
break;
}
$ordersql = " order by $order $asc ";
if($order != 't.tid') $ordersql .= ' ,t.tid asc ';
$tids = [];
if(!$dispfiled) $dispfiled = 't.'.$disp;
$sum = DB::result_first("SELECT count(distinct t.tid) as num $sql where $wheresql ",
array_merge($params, $para));
foreach (DB::fetch_all("SELECT t.tid,$dispfiled $sql where $wheresql $groupsql $ordersql $limitsql",
array_merge($params, $para)) as $value) {
$tids[] = $value['tid'];
}
/*//增加统计关键词次数
if($tids && $keyword){
$statskeywords = array();
$arr1 = explode('+', $keyword);
foreach($arr1 as $v){
$arr2 = explode(' ', $value1);
foreach($arr2 as $kval){
addTabgroupkeywordStats($kval,$gid);
}
}
}*/
$data = C::t('#tab#tab')->fetch_by_tids($tids);
$next = false;
if(count($tids) >= $perpage){
$next = true;
}
//返回数据
$return = array(
'next' => $next,
'data' => $data ? $data : array(),
'gdata'=>$gdata,
'param' => array(
'disp' => $disp,
'page' => $page,
'perpage' => $perpage,
'total' => intval($sum),
'asc' => $asc,
'keyword' => $keyword,
)
);
exit(json_encode(array('data'=>$return)));
}elseif($do == 'getscreen'){//获取筛选项
$cid = isset($_GET['cid']) ? intval($_GET['cid']):0;
$ExpandedCids = [];
if($cid){
$catdata = C::t('#tab#tab_cat')->fetch($cid);
$catdata['pathkey'] = str_replace('-_','',$catdata['pathkey']);
$catdata['pathkey'] = trim($catdata['pathkey'],'_');
$ExpandedCids=explode('_',$catdata['pathkey']);
}
$searchlist = getsearchlistbysearchfiled($gdata['searchfiled']);
//获取时间范围年份筛选值
foreach($searchlist as $k=>$v){
if($v['type'] =='timerange'){
$yeardata = [];
foreach(DB::fetch_all("select DISTINCT YEAR(FROM_UNIXTIME(`start`)) AS year from %t where filedname = %s order by year",
array('tab_rangedate',$k)) as $sy){
$yeardata[] = $sy['year'];
}
foreach(DB::fetch_all("select DISTINCT YEAR(FROM_UNIXTIME(`end`)) AS year from %t where filedname = %s order by year",
array('tab_rangedate',$k)) as $ey){
$yeardata[] = $ey['year'];
}
$yeardata = array_unique($yeardata);
sort($yeardata);
$searchlist[$k]['timerangeyear'] = $yeardata;
}
}
exit(json_encode(array('data'=>$searchlist,'expandedcids'=>$ExpandedCids)));
}
elseif ($do == 'getsearchfolder') {//分类数据
$pcid = isset($_GET['pcid']) ? intval($_GET['pcid']):0;
$catdatanum = C::t('#tab#tab_cat')->fetch_all_cat_by_gid($gid,$pcid);
exit(json_encode(array( 'data' => $catdatanum)));
}else{
include template('page/list');
exit();
}
function getsearchlistbysearchfiled($searchfiled){
$fixedform = array(
'cat' => array(
'flag' => 'cat',
'type' => 'select',
'labelname' => '分类',
'system' => 1,
'disp'=>0,
'catname' => 'system',
'multiple'=>0,
'dw'=>'',
'status'=>0,
'isdefault' => 0,
'allowsearch' => 1,
)
);
$searchlist = unserialize($searchfiled);
foreach($searchlist as $flag => $value){
//if(!$value['status']) continue;
if($form = c::t('form_setting')->fetch($flag)){
$v= $form;
$v['multiple']=$value['multiple'];
$v['range']=$value['range'];
$v['dw']=$value['dw'];
$v['dropmenu']=$value['dropmenu'];
}elseif(isset($fixedform[$flag])){
$v= $fixedform[$flag];
$v['multiple']=$value['multiple'];
$v['range']=$value['range'];
$v['dw']=$value['dw'];
$v['dropmenu']=$value['dropmenu'];
}
$v['status'] = $value['status'];
$searchlist[$flag]=$v;
}
return $searchlist;
}