ThinkAdmin/extend/controller/BasicAdmin.php
2019-04-04 13:29:33 +08:00

148 lines
5.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | ThinkAdmin
// +----------------------------------------------------------------------
// | 版权所有 2014~2017 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
// +----------------------------------------------------------------------
// | 官方网站: http://think.ctolog.com
// +----------------------------------------------------------------------
// | 开源协议 ( https://mit-license.org )
// +----------------------------------------------------------------------
// | github开源项目https://github.com/zoujingli/ThinkAdmin
// +----------------------------------------------------------------------
namespace controller;
use service\DataService;
use think\Controller;
use think\db\Query;
use think\Db;
/**
* 后台权限基础控制器
* Class BasicAdmin
* @package controller
*/
class BasicAdmin extends Controller
{
/**
* 页面标题
* @var string
*/
public $title;
/**
* 默认操作数据表
* @var string
*/
public $table;
/**
* 默认检查用户登录状态
* @var bool
*/
public $checkLogin = true;
/**
* 默认检查节点访问权限
* @var bool
*/
public $checkAuth = true;
/**
* 表单默认操作
* @param Query $dbQuery 数据库查询对象
* @param string $tplFile 显示模板名字
* @param string $pkField 更新主键规则
* @param array $where 查询规则
* @param array $extendData 扩展数据
* @return array|string
*/
protected function _form($dbQuery = null, $tplFile = '', $pkField = '', $where = [], $extendData = [])
{
$db = is_null($dbQuery) ? Db::name($this->table) : (is_string($dbQuery) ? Db::name($dbQuery) : $dbQuery);
$pk = empty($pkField) ? ($db->getPk() ? $db->getPk() : 'id') : $pkField;
$pkValue = $this->request->request($pk, isset($where[$pk]) ? $where[$pk] : (isset($extendData[$pk]) ? $extendData[$pk] : null));
// 非POST请求, 获取数据并显示表单页面
if (!$this->request->isPost()) {
$vo = ($pkValue !== null) ? array_merge((array)$db->where($pk, $pkValue)->where($where)->find(), $extendData) : $extendData;
if (false !== $this->_callback('_form_filter', $vo)) {
empty($this->title) || $this->assign('title', $this->title);
return $this->fetch($tplFile, ['vo' => $vo]);
}
return $vo;
}
// POST请求, 数据自动存库
$data = array_merge($this->request->post(), $extendData);
if (false !== $this->_callback('_form_filter', $data)) {
$result = DataService::save($db, $data, $pk, $where);
if (false !== $this->_callback('_form_result', $result)) {
$result !== false ? $this->success('恭喜, 数据保存成功!', '') : $this->error('数据保存失败, 请稍候再试!');
}
}
}
/**
* 列表集成处理方法
* @param Query $dbQuery 数据库查询对象
* @param bool $isPage 是启用分页
* @param bool $isDisplay 是否直接输出显示
* @param bool $total 总记录数
* @return array|string
*/
protected function _list($dbQuery = null, $isPage = true, $isDisplay = true, $total = false)
{
$db = is_null($dbQuery) ? Db::name($this->table) : (is_string($dbQuery) ? Db::name($dbQuery) : $dbQuery);
// 列表排序默认处理
if ($this->request->isPost() && $this->request->post('action') === 'resort') {
$data = $this->request->post();
unset($data['action']);
foreach ($data as $key => &$value) {
if (false === $db->where('id', intval(ltrim($key, '_')))->setField('sort', $value)) {
$this->error('列表排序失败, 请稍候再试');
}
}
$this->success('列表排序成功, 正在刷新列表', '');
}
// 列表数据查询与显示
if (null === $db->getOptions('order')) {
$fields = $db->getTableFields($db->getTable());
in_array('sort', $fields) && $db->order('sort asc');
}
$result = [];
if ($isPage) {
$rowPage = intval($this->request->get('rows', cookie('rows')));
cookie('rows', $rowPage >= 10 ? $rowPage : 20);
$page = $db->paginate($rowPage, $total, ['query' => $this->request->get()]);
$result['list'] = $page->all();
$result['page'] = preg_replace(['|href="(.*?)"|', '|pagination|'], ['data-open="$1" href="javascript:void(0);"', 'pagination pull-right'], $page->render());
} else {
$result['list'] = $db->select();
}
if (false !== $this->_callback('_data_filter', $result['list']) && $isDisplay) {
!empty($this->title) && $this->assign('title', $this->title);
return $this->fetch('', $result);
}
return $result;
}
/**
* 当前对象回调成员方法
* @param string $method
* @param array|bool $data
* @return bool
*/
protected function _callback($method, &$data)
{
foreach ([$method, "_" . $this->request->action() . "{$method}"] as $_method) {
if (method_exists($this, $_method) && false === $this->$_method($data)) {
return false;
}
}
return true;
}
}