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); } }