mirror of https://gitee.com/karson/fastadmin.git
117 lines
4.7 KiB
PHP
117 lines
4.7 KiB
PHP
<?php
|
|
|
|
namespace addons\cms\controller;
|
|
|
|
use addons\cms\model\Archives;
|
|
use addons\cms\model\Channel as ChannelModel;
|
|
use addons\cms\model\Modelx;
|
|
use think\Config;
|
|
|
|
/**
|
|
* 栏目控制器
|
|
* Class Channel
|
|
* @package addons\cms\controller
|
|
*/
|
|
class Channel extends Base
|
|
{
|
|
|
|
public function index()
|
|
{
|
|
$diyname = $this->request->param('diyname');
|
|
|
|
if ($diyname && !is_numeric($diyname)) {
|
|
$channel = ChannelModel::getByDiyname($diyname);
|
|
} else {
|
|
$id = $diyname ? $diyname : $this->request->get('id', '');
|
|
$channel = ChannelModel::get($id);
|
|
}
|
|
if (!$channel) {
|
|
$this->error(__('No specified channel found'));
|
|
}
|
|
|
|
$filterlist = [];
|
|
$orderlist = [];
|
|
|
|
$filter = $this->request->get('filter/a', []);
|
|
$orderby = $this->request->get('orderby', '');
|
|
$orderway = $this->request->get('orderway', '', 'strtolower');
|
|
$params = ['filter' => '', 'id' => $channel->id, 'diyname' => $channel->diyname];
|
|
if ($filter)
|
|
$params['filter'] = $filter;
|
|
if ($orderby)
|
|
$params['orderby'] = $orderby;
|
|
if ($orderway)
|
|
$params['orderway'] = $orderway;
|
|
if ($channel['type'] === 'link') {
|
|
$this->redirect($channel['outlink']);
|
|
}
|
|
|
|
$model = Modelx::get($channel['model_id']);
|
|
if (!$model) {
|
|
$this->error(__('No specified model found'));
|
|
}
|
|
$fields = [];
|
|
foreach ($model->fields_list as $k => $v) {
|
|
if (!$v['isfilter'] || !in_array($v['type'], ['select', 'selects', 'checkbox', 'radio', 'array']) || !$v['content_list'])
|
|
continue;
|
|
$fields[] = [
|
|
'name' => $v['name'], 'title' => $v['title'], 'content' => $v['content_list']
|
|
];
|
|
}
|
|
$filter = array_intersect_key($filter, array_flip(array_column($fields, 'name')));
|
|
foreach ($fields as $k => $v) {
|
|
$content = [];
|
|
$all = ['' => __('All')] + $v['content'];
|
|
foreach ($all as $m => $n) {
|
|
$active = ($m === '' && !isset($filter[$v['name']])) || (isset($filter[$v['name']]) && $filter[$v['name']] == $m) ? TRUE : FALSE;
|
|
$prepare = $m === '' ? array_diff_key($filter, [$v['name'] => $m]) : array_merge($filter, [$v['name'] => $m]);
|
|
$url = '?' . http_build_query(array_merge(['filter' => $prepare], array_diff_key($params, ['filter' => ''])));
|
|
$content[] = ['value' => $m, 'title' => $n, 'active' => $active, 'url' => $url];
|
|
}
|
|
$filterlist[] = [
|
|
'name' => $v['name'],
|
|
'title' => $v['title'],
|
|
'content' => $content,
|
|
];
|
|
}
|
|
|
|
$sortrank = [
|
|
['name' => 'default', 'field' => 'weigh', 'title' => __('Default')],
|
|
['name' => 'views', 'field' => 'views', 'title' => __('Views')],
|
|
['name' => 'id', 'field' => 'id', 'title' => __('Post date')],
|
|
];
|
|
|
|
$orderby = $orderby && in_array($orderby, ['default', 'id', 'views']) ? $orderby : 'default';
|
|
$orderway = $orderway ? $orderway : 'desc';
|
|
foreach ($sortrank as $k => $v) {
|
|
$url = '?' . http_build_query(array_merge($params, ['orderby' => $v['name'], 'orderway' => ($orderway == 'desc' ? 'asc' : 'desc')]));
|
|
$v['active'] = $orderby == $v['name'] ? true : false;
|
|
$v['orderby'] = $orderway;
|
|
$v['url'] = $url;
|
|
$orderlist[] = $v;
|
|
}
|
|
$orderby = $orderby == 'default' ? 'weigh' : $orderby;
|
|
$pagelist = Archives::alias('a')
|
|
->where('status', 'normal')
|
|
->where('deletetime', 'exp', \think\Db::raw('IS NULL'))
|
|
->where($filter)
|
|
->join($model['table'] . ' n', 'a.id=n.id', 'LEFT')
|
|
->field('a.*')
|
|
->field('id,content', true, config('database.prefix') . $model['table'], 'n')
|
|
->where('channel_id', $channel['id'])
|
|
->order($orderby, $orderway)
|
|
->paginate($channel['pagesize'], false, ['type' => '\\addons\\cms\\library\\Bootstrap']);
|
|
$pagelist->appends($params);
|
|
$this->view->assign("__FILTERLIST__", $filterlist);
|
|
$this->view->assign("__ORDERLIST__", $orderlist);
|
|
$this->view->assign("__PAGELIST__", $pagelist);
|
|
$this->view->assign("__CHANNEL__", $channel);
|
|
Config::set('cms.title', $channel['name']);
|
|
Config::set('cms.keywords', $channel['keywords']);
|
|
Config::set('cms.description', $channel['description']);
|
|
$template = preg_replace('/\.html$/', '', $channel["{$channel['type']}tpl"]);
|
|
return $this->view->fetch('/' . $template);
|
|
}
|
|
|
|
}
|