/** * * @param type $perPage */ public function findPage($perPage = 10) { $total = $this->count(); if ($total) { $data = $this->page(intval($_REQUEST['p']), $perPage)->select(); $page = new \COM\Page($total, $perPage, $REQUEST); if ($total > $listRows) { $page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%'); } $p = $page->show(); } return array('data' => $data, 'html' => $p); }
/** * 通用分页列表数据集获取方法,获取的数据集主要供tableList()方法用来生成表格列表 * * 可以通过url参数传递where条件,例如: index.html?name=asdfasdfasdfddds * 可以通过url空值排序字段和方式,例如: index.html?_field=id&_order=asc * 可以通过url参数r指定每页数据条数,例如: index.html?r=5 * * @param sting|Model $model 模型名或模型实例 * @param array $where where查询条件(优先级: $where>$_REQUEST>模型设定) * @param array|string $order 排序条件,传入null时使用sql默认排序或模型属性(优先级最高); * 请求参数中如果指定了_order和_field则据此排序(优先级第二); * 否则使用$order参数(如果$order参数,且模型也没有设定过order,则取主键降序); * * @param array $base 基本的查询条件 * @param boolean $field 单表模型用不到该参数,要用在多表join时为field()方法指定参数 * @author 朱亚杰 <*****@*****.**> * * @return array|false * 返回数据集 */ protected function lists($model, $where = array(), $order = '', $base = array('status' => array('egt', 0)), $field = true) { $options = array(); $REQUEST = (array) I('request.'); if (is_string($model)) { $model = M($model); } $OPT = new \ReflectionProperty($model, 'options'); $OPT->setAccessible(true); $pk = $model->getPk(); if ($order === null) { //order置空 } else { if (isset($REQUEST['_order']) && isset($REQUEST['_field']) && in_array(strtolower($REQUEST['_order']), array('desc', 'asc'))) { $options['order'] = '`' . $REQUEST['_field'] . '` ' . $REQUEST['_order']; } elseif ($order === '' && empty($options['order']) && !empty($pk)) { $options['order'] = $pk . ' desc'; } elseif ($order) { $options['order'] = $order; } } unset($REQUEST['_order'], $REQUEST['_field']); $options['where'] = array_filter(array_merge((array) $base, $REQUEST, (array) $where), function ($val) { if ($val === '' || $val === null) { return false; } else { return true; } }); if (empty($options['where'])) { unset($options['where']); } $options = array_merge((array) $OPT->getValue($model), $options); $total = $model->where($options['where'])->count(); if (isset($REQUEST['r'])) { $listRows = (int) $REQUEST['r']; } else { $listRows = C('LIST_ROWS') > 0 ? C('LIST_ROWS') : 10; } $page = new \COM\Page($total, $listRows, $REQUEST); if ($total > $listRows) { $page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%'); } $p = $page->show(); $this->assign('_page', $p ? $p : ''); $this->assign('_total', $total); $options['limit'] = $page->firstRow . ',' . $page->listRows; $model->setProperty('options', $options); return $model->field($field)->select(); }
/** * 显示指定模型列表数据 * @param String $model 模型标识 * @author 麦当苗儿 <*****@*****.**> */ public function lists($model = null, $p = 0) { $model || $this->error('模型名标识必须!'); $page = intval($p); $page = $page ? $page : 1; //默认显示第一页数据 //获取模型信息 $model = M('Model')->getByName($model); $model || $this->error('模型不存在!'); //解析列表规则 $fields = array(); $grids = preg_split('/[;\\r\\n]+/s', $model['list_grid']); foreach ($grids as &$value) { // 字段:标题:链接 $val = explode(':', $value); // 支持多个字段显示 $field = explode(',', $val[0]); $value = array('field' => $field, 'title' => $val[1]); if (isset($val[2])) { // 链接信息 $value['href'] = $val[2]; // 搜索链接信息中的字段信息 preg_replace_callback('/\\[([a-z_]+)\\]/', function ($match) use(&$fields) { $fields[] = $match[1]; }, $value['href']); } if (strpos($val[1], '|')) { // 显示格式定义 list($value['title'], $value['format']) = explode('|', $val[1]); } foreach ($field as $val) { $array = explode('|', $val); $fields[] = $array[0]; } } // 过滤重复字段信息 $fields = array_unique($fields); // 关键字搜索 $map = array(); $key = $model['search_key'] ? $model['search_key'] : 'title'; if (isset($_REQUEST[$key])) { $map[$key] = array('like', '%' . $_GET[$key] . '%'); unset($_REQUEST[$key]); } // 条件搜索 foreach ($_REQUEST as $name => $val) { if (in_array($name, $fields)) { $map[$name] = $val; } } $row = empty($model['list_row']) ? 10 : $model['list_row']; //读取模型数据列表 if ($model['extend']) { $name = get_table_name($model['id']); $parent = get_table_name($model['extend']); $fix = C("DB_PREFIX"); $key = array_search('id', $fields); if (false === $key) { array_push($fields, "{$fix}{$parent}.id as id"); } else { $fields[$key] = "{$fix}{$parent}.id as id"; } /* 查询记录数 */ $count = M($parent)->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")->where($map)->count(); // 查询数据 $data = M($parent)->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")->field(empty($fields) ? true : $fields)->where($map)->order("{$fix}{$parent}.id DESC")->page($page, $row)->select(); } else { in_array('id', $fields) || array_push($fields, 'id'); $name = parse_name(get_table_name($model['id']), true); $data = M($name)->field(empty($fields) ? true : $fields)->where($map)->order('id DESC')->page($page, $row)->select(); /* 查询记录总数 */ $count = M($name)->where($map)->count(); } //分页 if ($count > $row) { $page = new \COM\Page($count, $row); $page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%'); $this->assign('_page', $page->show()); } $this->assign('model', $model); $this->assign('list_grids', $grids); $this->assign('list_data', $data); $this->meta_title = $model['title'] . '列表'; $this->display($model['template_list']); }