project = Dever::input('project');
$this->table = Dever::input('table');
$this->menu = Dever::input('menu');
$this->menu_id = Dever::input('menu_id');
$this->id = Dever::input('update_where_id', Dever::input('where_id'));
$this->name = $this->project . '/' . $this->table;
$this->top = Dever::input('top');
if ($this->top) {
Dever::load('manage/top.update_action', $this->top);
}
}
/**
* 提供给异步获取数据的接口
*
* @return array
*/
public function getAjax($data)
{
$key = Dever::input('key');
$value = Dever::input('value');
$source = Dever::input('source');
$config = Dever::db($source)->config['struct'][$key];
$config['value'] = $value;
$config['option'] = $data;
return $this->create_update_html($key, $config);
}
/**
* url
*
* @return array
*/
private function url($key = false, $id = 0, $table = false, $suffix = '')
{
$table = $table ? $table : $this->table;
if (strpos($table, 'http://') !== false || strpos($table, 'javascript') !== false) {
return $table;
}
$config = array
(
'project' => 'project/database?project=' . $this->project,
'list' => 'project/database/list?{param}',
'search' => 'project/database/list?{param}',
'add' => 'project/database/update?{param}',
'update' => 'project/database/update?{param}&where_id=' . $id,
# 增加快捷更新
'edit' => 'project/database/update?{param}&where_id=' . $id,
'updateAction' => 'database.update_action',
'url' => '',
'delete' => 'database.delete_action?{param}&where_id=' . $id,
'recovery' => 'database.recovery_action?{param}&where_id=' . $id,
'stat' => 'project/database/stat?{param}',
'excel' => 'database.list_excel?{param}',
'stat_excel' => 'database.stat_excel?{param}',
'diy' => 'list?{param}',
);
$state = $this->getState();
if ($key == 'delete' && $state == 2) {
$key = 'recovery';
}
if (strpos($key, 'list') !== false) {
$config[$key] = $config['list'];
} elseif (strpos($key, 'add') !== false) {
$config[$key] = $config['add'];
} elseif (strpos($key, 'edit') !== false) {
$config[$key] = $config['edit'];
}
if (isset($config[$key])) {
if (strpos($config[$key], '{param}')) {
$param = $this->getUrlParam($key, $table, $suffix, $state);
$config[$key] = str_replace('{param}', $param, $config[$key]);
}
return Dever::url($config[$key]);
}
return $config;
}
/**
* 获取url需要的参数
*
* @return string
*/
private function getUrlParam($key, $table, $suffix, $state)
{
$param = '';
$array = array('project', 'add', 'list', 'update');
if (in_array($key, $array) && !strstr($table, 'oper_')) {
$where = Dever::preInput('search_');
if ($where) {
if (isset($where['where_id'])) {
//unset($where['where_id']);
}
unset($where['search_option_state']);
$param .= '&' . http_build_query($where);
}
$oper = Dever::preInput('oper_');
if ($oper) {
$param .= '&' . http_build_query($oper);
}
}
if ($key == 'search' && $search_limit = Dever::input('search_limit')) {
$param .= '&search_limit=' . $search_limit;
}
if (strpos($suffix, 'search_option_state') !== false) {
$state = '';
} else {
$state = '&search_option_state=' . $state;
}
$page_type = Dever::input('page_type');
if ($page_type) {
$param .= '&page_type=' . $page_type . '';
}
$param = 'project=' . $this->project . $param . '&table=' . $table . '&menu=' . $this->menu . '&menu_id=' . $this->menu_id . $state . $suffix;
return $param;
}
/**
* 获得refer
*
* @return string
*/
private function refer($type = 'project')
{
return '';
switch ($type) {
case 'project':
$name = '数据库操作';
break;
case 'list':
$name = '数据列表';
break;
case 'url':
$name = '项目列表';
break;
}
$name = '返回上一级';
$url = $this->url($type);
$refer = '-[' . $name . ']';
return $refer;
}
/**
* getAdminInfo
*
* @return array
*/
private function getAdminInfo($data)
{
$admin = Dever::load('manage/auth.info');
$data['my_admin_id'] = $admin['id'];
$data['my_role_id'] = $admin['role'];
return $data;
}
/**
* cookie 处理cookie
*
* @return array
*/
public function cookie()
{
$cookie = $_COOKIE;
$array = array();
# 判断手机版
$mobile = Dever::mobile();
if ((isset($cookie['left_menu']) && $cookie['left_menu'] == 'close') || $mobile) {
$array['wrapper'] = 'enlarged forced';
} else {
$array['wrapper'] = 'forced';
}
return $array;
}
/**
* listStyle
*
* @return array
*/
public function listStyle()
{
$mobile = Dever::mobile();
if ($mobile) {
$style = '.container_list .panel-heading .form-control,#mul .form-control,#page .form-control
{
width:70%;
}
.row
{
margin-right: -15px;
margin-left: -15px;
}
#dever_modal_body img
{
max-width:300px;
}
';
} else {
$style = '#dever_modal_body img
{
max-width:300px;
}';
}
return $style;
}
/**
* info 处理一些基本的信息,供模板使用
*
* @return array
*/
public function info()
{
$config = $this->config();
$menu = isset($config['lang']) ? $config['lang'] : $this->project . '-' . $this->table;
if (isset($config['state']) && $config['state'] == 2) {
$menu .= '[回收站]';
}
$top = Dever::load('manage/top.get');
//print_r($top);die;
$display = '';
# 新增权限
$insert_state = Dever::load('manage/auth.oper', 4);
if ((isset($config['manage']['insert']) && $config['manage']['insert'] == false) || !isset($config['manage']['insert']) || $insert_state == false) {
$display = 'display:none';
}
$info = array
(
'action' => $this->url('updateAction'),
'list' => $this->url('list'),
'search' => $this->url('search'),
'mul' => $this->url('list'),
//'add' => 'location.href=\'' . $this->url('add') . '\'',
'add' => $this->url('add'),
'add_state' => $display,
'project' => $this->project,
'table' => $this->table,
'id' => $this->id,
'main' => '数据管理' . $this->refer('url'),
'list_header' => $menu,
'list_desc' => '数据列表',
'project_name' => Dever::load('manage/project.name', $this->project),
'update_header' => $menu,
'update_desc' => '更新数据',
'updateMul' => (!$this->id && isset($config['manage']['updateMul']) && $config['manage']['updateMul']) ? '增加一条' : false,
'updateDesc' => isset($config['manage']['desc']) ? $config['manage']['desc'] : '',
'listDesc' => isset($config['desc']) ? $config['desc'] : '',
'struct' => isset($config['manage']['struct']) ? $config['manage']['struct'] : '',
'stat_desc' => '主动统计',
);
$info['parent'] = Dever::input('oper_parent');
if ($info['parent']) {
$oper = Dever::preInput('oper_');
if ($oper) {
$info['parent'] .= '&' . str_replace('oper_', '', http_build_query($oper));
//$info['parent'] .= '&' . http_build_query($oper);
}
//$info['parent'] = 'location.href=\'' . $this->url(Dever::input('oper_index', 11), 0, $info['parent']) . '\'';
$info['parent'] = $this->url(Dever::input('oper_index', 'listData'), 0, $info['parent']);
$info['parent_state'] = '';
} else {
$info['parent_state'] = 'display:none';
}
$info['save'] = Dever::input('oper_save_jump');
if ($info['save']) {
$info['list'] = $this->url(Dever::input('oper_index', 'listData'), 0, $info['save']);
}
$search = Dever::preInput('search_');
if ($search) {
$info['mul'] .= '&' . http_build_query($search);
}
if ($this->id) {
$info['update_header'] = $menu . '-更新数据' . $this->refer('list');
}
return $info;
}
/**
* 获取表名
*
* @return array
*/
public function getTableName($project, $table)
{
if ($project == 'other') {
return '无数据表';
}
$path = Dever::load('manage/project.path', $project);
$config = $this->config($project, $path, $table);
$data = isset($config['lang']) ? $config['lang'] : $project;
return $data;
}
private function getState()
{
return Dever::input('search_option_state');
}
/**
* config
*
* @return array
*/
public function config($project = false, $path = false, $table = false)
{
if (!$project) {
$project = $this->project;
$table = $this->table;
}
if (!$project) {
return array();
}
Dever::$global['manage']['project'] = $project;
$config = Dever::load('manage/project.config', $project);
if (!is_array($config)) {
Dever::alert($project . ' error');
}
$project = $config['name'];
if (!$path) {
if (isset($config['base']) && isset($config['rel'])) {
$path = DEVER_INCLUDE_PATH . $config['rel'];
} else {
$path = $config['path'];
}
}
if ($project && $path && empty($this->config[$path])) {
$this->config[$path] = array();
$dir = $path . 'database/';
if (is_dir($dir)) {
$database = scandir($dir);
foreach ($database as $k => $v) {
if (strpos($v, '.php') !== false) {
$k = str_replace('.php', '', $v);
$this->config[$path][$k] = $this->struct($dir . $v, $project);
}
}
}
}
return ($table && isset($this->config[$path][$table])) ? $this->config[$path][$table] : $this->config[$path];
}
/**
* 对database配置文件进行解析
*
* @return array
*/
private function struct($file, $project = false)
{
$config = include $file;
if (isset($config['struct']) && is_array($config['struct']['id'])) {
$config['update'] = false;
$config['manage']['struct'] = '
';
$config['level'] = 1;
foreach ($config['struct'] as $k => $v) {
if (isset($v['level'])) {
$config['level'] = 3;
}
if (isset($v['search_parent'])) {
$config['manage']['search_parent'][$v['search_parent']] = $k;
$config['manage']['search_child'][$k] = $v['search_parent'];
}
if (isset($v['search']) && is_string($v['search'])) {
if (strpos($v['search'], 'time') !== false) {
$config['manage']['search']['time'][$k] = $v['name'];
}
if (strpos($v['search'], 'date') !== false) {
$config['manage']['search']['date'][$k] = $v['name'];
}
if (strpos($v['search'], 'exp') !== false) {
$config['manage']['search']['exp'][$k] = $v['name'];
}
if (strpos($v['search'], 'fulltext') !== false) {
$config['manage']['search']['fulltext'][$k] = $v['name'];
isset($v['match']) && $config['request']['list']['option'][$k] = array('option', 'like');
} elseif (strpos($v['search'], 'text') !== false) {
$config['manage']['search']['text'][$k] = $v['name'];
}
if (isset($v['exist']) && strpos($v['search'], 'exist') !== false) {
$config['manage']['search']['exist'][$k]['option'] = $v['exist'];
$config['manage']['search']['exist'][$k]['lang'] = $v['name'];
}
if (isset($v['option']) && strpos($v['search'], 'select') !== false) {
$config['manage']['search']['select'][$k]['option'] = $v['option'];
$config['manage']['search']['select'][$k]['lang'] = $v['name'];
if (isset($v['default'])) {
$config['manage']['search']['select'][$k]['default'] = $v['default'];
}
}
if (isset($v['option']) && strpos($v['search'], 'group') !== false) {
$config['manage']['search']['group'][$k]['option'] = $v['option'];
$config['manage']['search']['group'][$k]['lang'] = $v['name'];
if (isset($v['default'])) {
$config['manage']['search']['group'][$k]['default'] = $v['default'];
}
}
if (isset($v['option']) && strpos($v['search'], 'linkage') !== false) {
$config['manage']['search']['linkage'][$k]['option'] = $v['option'];
$config['manage']['search']['linkage'][$k]['lang'] = $v['name'];
if (isset($v['default'])) {
$config['manage']['search']['linkage'][$k]['default'] = $v['default'];
}
}
} elseif (isset($v['search']) && is_array($v['search'])) {
if (isset($v['search']['api'])) {
$config['manage']['search']['api'][$k] = $v['search'];
$config['manage']['search']['api'][$k]['lang'] = $v['name'];
}
}
/*
if (isset($v['table']) && !isset($config['end'])) {
$config['end']['insert'] = $v['value'];
}
*/
if (isset($v['update'])) {
if (!isset($config['manage']['insert'])) {
$config['manage']['insert'] = true;
}
$config['update'] = true;
}
if (isset($v['type'])) {
$config['manage']['struct'] .= Dever::tbody(array($k, $v['type'], $v['name']));
}
}
$config['manage']['struct'] .= '
';
$config['manage']['_list'] = array
(
'col' => 'manage',
'name' => '管理',
'value' => array(),
);
if (!isset($config['manage']['edit']) || (!isset($config['manage']['edit']) && $config['manage']['edit'] == true)) {
if (!isset($config['manage']['list_button']['update'])) {
$config['manage']['_list']['value']['update'] = '编辑';
}
}
if (!isset($config['manage']['delete']) || (isset($config['manage']['delete']) && $config['manage']['delete'] == true)) {
if (!isset($config['manage']['list_button']['delete'])) {
$config['manage']['_list']['value']['delete'] = '删除';
}
}
if (isset($config['manage']['list'][0]) && is_array($config['manage']['list'][0])) {
$config['manage']['_list']['value'] += $config['manage']['list'][0];
unset($config['manage']['list'][0]);
} elseif (isset($config['manage']['list_button'])) {
$config['manage']['_list']['value'] += $config['manage']['list_button'];
}
if (!$config['manage']['_list']['value']) {
unset($config['manage']['_list']);
}
}
$config['state'] = $this->getState();
$config['project'] = $project;
return $config;
}
/**
* 自定义列表页面
*
* @return array
*/
public function page($key = 'list')
{
$key = Dever::input('page_value', $key);
$type = Dever::input('page_type', 1);
$config = $this->config();
$result = array();
$result['s1'] = 'display:none';
$result['s2'] = 'display:';
$result['content'] = '';
$key = 'page_' . $key;
if (isset($config['manage'][$key])) {
if ($config['manage'][$key] == 'photo' && isset($config['manage']['photo'])) {
$result['content'] = Dever::view('list/photo', false, 'manage');
} else {
$result['content'] = Dever::view($config['manage'][$key], 'manage', $this->project);
}
//echo $result['content'];die;
if ($result['content']) {
Dever::setInput('page_content', 1);
$result['s1'] = 'display:';
$result['s2'] = 'display:none';
# 添加底部
if ($key != 'page_list_table') {
$result['content'] .= Dever::view('inc/foot', false, 'manage');
}
}
}
return $result;
}
/**
* 自定义列表页面
*
* @return array
*/
public function page_list()
{
return $this->page('list');
}
/**
* 自定义列表页面 只接管table部分,同时必须传值page_type=1
*
* @return array
*/
public function page_list_table()
{
$type = Dever::input('page_type', 2);
if ($type == 1) {
return $this->page('list_table');
} else {
return $this->page('list_table_default');
}
}
/**
* 自定义列表页面
*
* @return array
*/
public function page_update()
{
return $this->page('update');
}
/**
* 载入自定义资源
*
* @return array
*/
public function res()
{
$result = array
(
'js' => '',
'css' => '',
);
if (!$this->project) {
return $result;
}
$config = $this->config();
if (isset($config['manage']['res'])) {
foreach ($config['manage']['res'] as $k => $v) {
$result[$k] = $this->getRes($k, $v);
}
}
return $result;
}
/**
* getRes
*
* @return string
*/
protected function getRes($path, $value)
{
if (is_array($value)) {
$res = '';
foreach ($value as $k => $v) {
$res .= $this->getRes($path, $v);
}
return $res;
} else {
if ($this->project != 'manage') {
$base = str_replace('assets/', 'assets/manage/', Dever::config('host', $this->project)->$path);
} else {
$base = Dever::config('host', $this->project)->$path;
}
$file = $base . $value . '.' . $path;
$res = '';
return $res;
}
}
/**
* 头部banner
*
* @return array
*/
public function banner()
{
if (!$this->project) {
return '';
}
$config = $this->config();
$result = '';
if (isset($config['manage']['banner'])) {
foreach ($config['manage']['banner'] as $k => $v) {
$config['manage']['banner'][$k] = $this->value($v, 'yes');
}
if (empty($config['manage']['banner']['link'])) {
$config['manage']['banner']['link'] = '#';
$config['manage']['banner']['target'] = '_self';
}
if (empty($config['manage']['banner']['target'])) {
$config['manage']['banner']['target'] = '_blank';
}
$result = '
' . $config['manage']['banner']['name'] . '';
}
return $result;
}
/**
* 列表页搜索
*
* @return array
*/
public function list_search_select(&$result, $search, $name, $lang, $option, $default = false, $bind = array(), $parent = '')
{
$value = array();
if (strpos($lang, '-')) {
$temp = explode('-', $lang);
$lang = $temp[0];
}
$value['name'] = $name;
$value['lang'] = $lang;
$value['option'] = $option;
if (isset($search[$name])) {
$value['value'] = $search[$name];
}
if ($default) {
//$value['default'] = $default;
}
if ($bind) {
$value['bind'] = $bind;
}
$value['parent'] = $parent;
$result .= Html::select($value, false) . ' ';
}
/**
* 列表页搜索
*
* @return array
*/
public function list_search_group(&$result, $search, $name, $lang, $option, $default = false)
{
$value = array();
$value['name'] = $name;
$value['lang'] = $lang;
$value['option'] = $option;
if (isset($search[$name])) {
$value['value'] = $search[$name];
}
if ($default) {
//$value['default'] = $default;
}
$result .= Html::group($value, false) . ' ';
}
/**
* 列表页搜索
*
* @return array
*/
public function list_search_linkage(&$result, $search, $name, $lang, $option, $default = false)
{
$value = array();
$value['name'] = $name;
$value['lang'] = $lang;
$value['option'] = $option;
$value['search_state'] = true;
if (isset($search[$name])) {
$value['value'] = $search[$name];
}
if ($default) {
//$value['default'] = $default;
}
$result .= Html::linkage($value, 'span') . ' ';
}
/**
* 列表页搜索
*
* @return array
*/
public function list_search_time(&$result, $search, $prefix, $key, $lang, $type = 'time')
{
$value['name'] = $prefix . 'option_start_' . $key;
$value['lang'] = '开始' . $lang;
if (isset($search[$value['name']])) {
$value['value'] = Dever::maketime($search[$value['name']]);
Dever::setInput($value['name'], $value['value'], 'search_');
}
$result .= Html::$type($value) . ' - ';
$value['name'] = $prefix . 'option_end_' . $key;
$value['lang'] = '结束' . $lang;
if (isset($search[$value['name']])) {
$value['value'] = Dever::maketime($search[$value['name']]);
Dever::setInput($value['name'], $value['value'], 'search_');
}
$result .= Html::$type($value) . ' ';
}
/**
* 列表页头部按钮
*
* @return array
*/
public function list_button()
{
if (Dever::load('manage/auth.oper', 2) == false) {
Dever::alert('你没有权限');
}
$config = $this->config();
$result = '';
# 增加主动统计按钮
if (isset($config['manage']['stat'])) {
$name = '数据统计';
if (is_string($config['manage']['stat'])) {
$name = $config['manage']['stat'];
}
$config['manage']['button'][$name] = $this->url('stat');
}
# 增加下载报表按钮
if (isset($config['manage']['excel'])) {
$name = '导出数据';
if (is_string($config['manage']['excel'])) {
$name = $config['manage']['excel'];
}
$config['manage']['button'][$name] = 'onclick="jump(\''.$this->url('excel').'\', \'#form1\')"';
}
# 增加回收站
if (isset($config['struct']['state']) && (!isset($config['manage']['delete']) || (isset($config['manage']['delete']) && $config['manage']['delete'] && isset($config['manage']['_list']['value']['delete'])))) {
if ($config['state'] == 2) {
$config['manage']['button']['返回数据列表'] = $this->url('list', 0, false, '&search_option_state=1');
} else {
$config['manage']['button']['回收站'] = $this->url('list', 0, false, '&search_option_state=2');
}
}
# 列表页按钮
if (isset($config['manage']['button'])) {
$result .= $this->button_list($config['manage']['button']);
}
return $result;
}
/**
* 更新页按钮
*
* @return array
*/
public function update_button()
{
# 新增权限
if (Dever::load('manage/auth.oper', 2) == false) {
Dever::alert('你没有权限');
}
$info = $this->info();
$result = '
放弃保存';
$config = $this->config();
if (isset($config['manage']['update_button']) && $config['manage']['update_button']) {
$result = '';
foreach ($config['manage']['update_button'] as $k => $v) {
if ($v == 'save-data') {
$result .= '';
} elseif ($v == 'copy-data') {
$result .= '' . $k . '';
} elseif ($v == 'copy-datas') {
$result .= '' . $k . '';
} else {
$result .= '' . $k . '';
}
}
}
return $result;
}
private function button_list($button)
{
$result = '';
foreach ($button as $k => $v) {
if (is_array($v)) {
if ($v[0] == 'location') {
$result .= ' ' . $k . '';
} else {
$result .= ' ' . $k . '';
}
} elseif (strpos($v, 'modal|') !== false) {
$t = explode('modal|', $v);
$result .= ' ' . $k . '';
} elseif (strpos($v, '|') !== false) {
$t = explode('|', $v);
$result .= $t[0] . ' ' . $k . '';
} elseif (strpos($v, 'onclick') !== false) {
$result .= ' ' . $k . '';
} elseif (strpos($v, 'http://') !== false) {
//$result .= ' '.$k.'';
$result .= ' ' . $k . '';
} else {
$result .= ' ' . $k . '';
}
}
return $result;
}
/**
* 列表页搜索
*
* @return array
*/
public function list_search()
{
# 新增权限
if (Dever::load('manage/auth.oper', 2) == false) {
Dever::alert('你没有权限');
}
$config = $this->config();
$result = '';
# 搜索
if (isset($config['struct']) && isset($config['manage']['search'])) {
$search = Dever::preInput('search_');
$node = Html::node(array('class="am-u-sm-12" style="margin-top:10px;"', 'class="am-form-group am-input-group-sm"'));
$btn = '';
//$result .= '';
# 增加每页显示条数
$config['manage']['num'] = $this->getNumConfig($config);
if ($config['manage']['num']) {
$result = $this->num($result, $config['manage']['num']);
}
}
//print_r($result);die;
return $result;
}
private function list_search_br(&$result)
{
if (strpos($result, ' ') && !strpos($result, '
')) {
$result .= '
';
}
}
/**
* 获取条数配置
*
* @return array
*/
private function getNumConfig($config)
{
if (isset($config['manage']['list_type'])) {
return false;
}
if (isset($config['manage']['num']) && $config['manage']['num'] == false) {
return false;
}
if (!isset($config['manage']['num'])) {
$config['manage']['num'] = array(20,50,100);
}
return $config['manage']['num'];
}
/**
* 生成条数的html
*
* @return string
*/
private function num($result, $config)
{
$limit = '';
$cur = Dever::input('search_limit', 0);
foreach($config as $k => $v) {
if ($cur == $k) {
$btn = 'success';
} else {
$btn = 'default';
}
$url = $this->url('list', 0, false, '&search_limit=' . $k);
$limit .= ''.$v.' ';
}
$num = '';
$result .= $num;
return $result;
}
/**
* 列表页表格头
*
* @return array
*/
public function list_thead()
{
# 新增权限
if (Dever::load('manage/auth.oper', 1) == false) {
Dever::alert('你没有权限');
}
$config = $this->config();
$result = array();
if (isset($config['struct'])) {
if (isset($config['manage']['list']) && $config['manage']['list'] == 'update') {
# 验证头部权限 这里如果是多个选择权限的话,暂时无法实现。。。
if (isset($config['top']) && is_string($config['top'])) {
$top = Dever::load('manage/auth.getTop', array($config['top']));
if ($top) {
$url = $this->url('update', $top['value']);
}
} else {
$url = $this->url('update', 1);
}
return Dever::location($url);
} else {
if (isset($config['manage']['mul'])) {
$result[] = ' | ';
}
$data = array();
$data = $this->getAdminInfo($data);
foreach ($config['struct'] as $k => $v) {
if (isset($v['list']) && $v['list']) {
# 处理权限
if (isset($v['auth'])) {
$auth = $this->value($v['auth'], $data);
if (!$auth) {
continue;
}
}
if (isset($v['list_name'])) {
$v['name'] = $v['list_name'];
} else {
$temp = Html::cue(array('name' => $v['name']));
$v['name'] = $temp['name'];
}
if (!isset($v['level'])) {
$v['level'] = $config['level'];
}
if (isset($v['search']) && is_string($v['search']) && strpos($v['search'], 'order') !== false) {
$link = Dever::url();
$order = 'search_order_' . $k . '';
if (strpos($link, $order) !== false) {
$link = preg_replace('/[?|&]' . $order . '=(desc|asc)/i', '{order}', $link);
} else {
$link .= '{order}';
}
$search = Dever::input($order);
$cancel = '';
if ($search) {
$asc = $search;
$cancel = ' ';
} else {
$asc = 'desc';
if (!isset($v['order']) && $k != 'id') {
$cancel = ' ';
}
}
if ($asc == 'asc') {
$asc = 'desc';
$icon = 'down';
$text = '降序';
} else {
$asc = 'asc';
$icon = 'up';
$text = '升序';
}
$link = str_replace('{order}', '&' . $order . '=' . $asc, $link);
$result[] = '' . $v['name'] . ' ' . $cancel . ' | ';
} else {
$result[] = '' . $v['name'] . ' | ';
}
}
}
if ((Dever::load('manage/auth.oper', 3) != false || Dever::load('manage/auth.oper', 5) != false) && isset($config['manage']['_list']['value'])) {
$result[] = '' . $config['manage']['_list']['name'] . ' | ';
}
}
}
return $result;
}
/**
* 导出列表
*
* @return array
*/
public function list_excel_api()
{
Dever::$global['base']['excel'] = 1;
$data = $this->list_tbody(true);
if ($data) {
$config = $this->config();
if (isset($config['manage']['excel']) && $config['manage']['excel']) {
$method = 'excel';
$info = $this->info();
$data = $this->getAdminInfo($data);
$this->excel($info, $data, $config);
}
}
//print_r($data);die;
}
private function excel($info, $data, $config)
{
$file = $info['list_header'] . '的' . $info['list_desc'] . '-' . $info['project_name'];
$header = $body = array();
$i = 0;
foreach ($config['struct'] as $k => $v) {
if (isset($v['list']) && $v['list']) {
# 处理权限
if (isset($v['auth'])) {
$auth = $this->value($v['auth'], $data);
if (!$auth) {
continue;
}
}
//$v['name'] = mb_convert_encoding($v['name'],'gb2312','utf-8');
$header[$i] = $v['name'];
$i++;
$j = 0;
foreach ($data as $ki => $vi) {
$body[$j][$i] = '';
if (isset($vi[$k])) {
$value = $vi[$k];
if (is_string($v['list'])) {
$value = $this->value($v['list'], $data[$ki], $config['struct']);
}
if (isset($v['option'])) {
$value = $this->getOptionValue($value, $v);
}
//$value = mb_convert_encoding($value,'gb2312','utf-8');
$body[$j][$i] = $value;
$j++;
}
}
}
}
Dever::excelExport($body, $header, $file);
}
private function getOptionValue($value, $v)
{
# 验证option是否是匿名函数
$v['option'] = $this->option($v['option']);
# 位运算
if (isset($v['bit'])) {
$ts = array();
foreach ($v['option'] as $tm => $tv) {
if (isset($v['bit'][$tm]) && ($value & $tm) > 0) {
$ts[] = $tv;
}
}
$value = implode(',', $ts);
}
if ((isset($v['child_name']) || (isset($v['show']) && is_string($v['show'])))) {
if (isset($v['option'][$value]) && is_array($v['option'][$value])) {
$value = $v['option'][$value]['name'];
} else {
$value = isset($v['option'][$value]) ? $v['option'][$value] : $value;
}
} else {
if (strstr($value, ',')) {
$temp = explode(',', $value);
$t = array();
foreach ($temp as $vv) {
if (isset($v['option'][$vv]) && is_array($v['option'][$vv])) {
$t[] = $v['option'][$vv]['name'];
} elseif(isset($v['option'][$vv])) {
$t[] = $v['option'][$vv];
} else {
$t[] = $vv;
}
}
$value = implode("\r\n", $t);
} elseif (isset($v['option'][$value]) && is_array($v['option'][$value])) {
$value = $v['option'][$value]['name'];
} else {
$value = isset($v['option'][$value]) ? $v['option'][$value] : $value;
}
}
return $value;
}
private function _getChr($start, $num)
{
$num = $start + $num;
$max = floor($num / 91);
if ($max > 0) {
$num = $num - (91 * $max) + $start;
$num = chr($start) . chr($num);
} else {
$num = chr($num);
}
return $num;
}
/**
* 列表页数据列表 检索
*
* @return array
*/
private function list_tbody_search($config, $param, $high, $search)
{
# 根据api的数据检索到id
$api = Dever::preInput('search_api_');
if ($api) {
foreach ($api as $k => $v) {
if ($v) {
unset($search[$k]);
$k = str_replace('search_api_', '', $k);
# 设定检索高亮
$high[$k] = $v;
if (isset($config['manage']['search']['api'][$k]['api'])) {
$col = $config['manage']['search']['api'][$k]['col'];
$option = array($col => $v);
$v = Dever::load($config['manage']['search']['api'][$k]['api'], $option);
$result = $config['manage']['search']['api'][$k]['result'];
if ($v && is_array($v)) {
if (isset($v[$result])) {
$v = $v[$result];
} else {
if ($result == 'id') {
$v = array_keys($v);
} else {
$t = array();
foreach ($v as $k1 => $v1) {
$t[] = $v1[$result];
}
$v = $t;
}
$param['option'][$k] = array('yes', 'in');
}
} else {
$v = '-100';
}
}
$param['option_' . $k] = $v;
}
}
}
# 检索有无值
$exist = Dever::preInput('search_exist_');
if ($exist) {
foreach ($exist as $k => $v) {
if ($v) {
unset($search[$k]);
$k = str_replace('search_exist_', '', $k);
if ($v == 'yes') {
# 有值
$param['option'][$k] = array('yes', '!=');
$param['option_' . $k] = 'null';
} elseif ($v == 'no') {
# 无值
$param['option'][$k] = array('yes', '=');
$param['option_' . $k] = 'null';
} elseif (strpos($v, '|')) {
# 有无值或者自定义的值
$temp = explode('|', $v);
$param['option_' . $k] = $temp[1];
if ($temp[0] == 'yes') {
$param['option'][$k] = array('yes', '!=');
$param['option'][$k . '_t1'] = array('yes-' . $k, '!=');
} else {
$param['option'][$k] = array('yes', '=', 'and(');
$param['option'][$k . '_t1'] = array('yes-' . $k, '=', 'or)');
}
$param['option_' . $k . '_t1'] = 'null';
} else {
# 自定义的值
$param['option_' . $k] = $v;
}
}
}
}
$fulltext = Dever::preInput('search_fulltext_');
if ($fulltext) {
$fulltext_state = false;
foreach ($fulltext as $k => $v) {
if ($v) {
unset($search[$k]);
$k = str_replace('search_fulltext_', '', $k);
$param['option_' . $k] = $v;
# 设定检索高亮
$high[$k] = $v;
$fulltext_state = true;
}
}
$this->search = true;
}
$linkage = Dever::preInput('search_linkage_');
if ($linkage) {
foreach ($linkage as $k => $v) {
if ($v) {
unset($search[$k]);
$k = str_replace('search_linkage_', '', $k);
if (is_array($v)) {
$v = implode(',', $v);
}
if ($v != -1) {
$v = Dever::defaultValue($v);
$param['option_' . $k] = $v;
# 设定检索高亮
$high[$k] = $v;
}
}
}
$this->search = true;
}
$exp = Dever::preInput('search_exp_');
if ($exp) {
$k = $search['search_exp_col'];
$v = $search['search_exp_value'];
$param['option_' . $k] = $v;
$param['search_type'] = $search['search_exp_type'];
$this->search = true;
}
$order = Dever::preInput('search_order_');
if ($order) {
foreach ($order as $k => $v) {
$k = str_replace('search_order_', '', $k);
$param['order'][0][$k] = $v;
unset($search[$k]);
}
}
foreach ($search as $k => $v) {
if ($v) {
if (strpos($k, 'option_') !== false) {
//Dever::setInput(str_replace('search_', '', $k), $v);
if (is_array($v)) {
if ($v[0] == 0) {
continue;
}
$v = str_replace(',0', '', implode(',', $v));
$t = explode(',', $v);
$parent = end($t);
$v .= '%';
}
$param[str_replace('search_', '', $k)] = $v;
$this->search = true;
} elseif ($k == 'search_limit') {
$num = $this->getNumConfig($config);
if ($num) {
$param['page'][0] = $num[$v];
}
}
}
}
return array($param, $high);
}
private function list_tbody_mul($param)
{
$mul = Dever::load('manage/auth.oper', 3) ? Dever::preInput('mul_') : false;
if (Dever::input('method') == 'mul' && $mul && $mul['mul_type'] > 0) {
if ($mul['mul_type'] == 1 && empty($mul['mul_where_id'])) {
Dever::alert('您还未选择任何数据条目');
}
Dever::$global['base']['mul_type'] = $mul['mul_type'];
unset($mul['mul_type']);
foreach ($mul as $k => $v) {
if ($v) {
if (is_array($v)) {
$v = implode(',', $v);
}
$param[str_replace('mul_', '', $k)] = $v;
}
}
if (isset($param)) {
$method = $this->project . '/' . $this->table . '-updatemul';
$state = Dever::load($method, $param);
}
Dever::alert('reload');
}
}
/**
* 列表页数据列表:图片形式
*
* @return array
*/
public function list_photo()
{
$config = $this->config();
$result = array();
if (isset($config['manage']['photo'])) {
$high = array();
$search = Dever::load('manage/auth.oper', 2) ? Dever::preInput('search_') : false;
$param = array();
$parent = 0;
if ($search) {
list($param, $high) = $this->list_tbody_search($config, $param, $high, $search);
}
if (empty($param['page'])) {
$num = $this->getNumConfig($config);
if ($num) {
$param['page'][0] = $num[0];
}
}
$method = $this->project . '/' . $this->table . '-list';
$result = Dever::load($method, $param);
if ($result) {
foreach ($result as $k => $v) {
$result[$k] = Dever::load($config['manage']['photo'], $v);
$result[$k]['button'] = $this->list_tbody_button($config, $v, 'div');
}
}
}
return $result;
}
/**
* 列表页数据列表:表格形式
*
* @return array
*/
public function list_tbody($excel = false)
{
# 新增权限
if (Dever::load('manage/auth.oper', 1) == false) {
Dever::alert('你没有权限');
}
if (Dever::input('page_content') == 1) {
return;
}
$config = $this->config();
$high = array();
$search = Dever::load('manage/auth.oper', 2) ? Dever::preInput('search_') : false;
$param = array();
$parent = 0;
if ($search) {
list($param, $high) = $this->list_tbody_search($config, $param, $high, $search);
}
if (empty($param['page'])) {
$num = $this->getNumConfig($config);
if ($num) {
$param['page'][0] = $num[0];
}
}
# 批量更新
$this->list_tbody_mul($param);
$result = array();
if ($excel == true) {
$method = $this->project . '/' . $this->table . '-all';
} else {
$method = $this->project . '/' . $this->table . '-list';
}
//print_r($param);die;
$data = Dever::load($method, $param);
if (isset($config['manage']['list_type']) && $config['manage']['list_type'] == 'parent') {
$parent = array();
$child = array();
foreach ($data as $k => $v) {
if ($v[$config['name'] . '_id'] <= 0) {
$parent[$k] = $v;
} else {
$v['name'] = '|-----' . $v['name'];
$child[$v[$config['name'] . '_id']][$k] = $v;
}
}
if ($parent) {
$data = array();
foreach ($parent as $k => $v) {
$data[$v['id']] = $v;
if (isset($child[$v['id']])) {
foreach ($child[$v['id']] as $i => $j) {
$data[$j['id']] = $j;
}
}
}
}
} elseif (isset($config['manage']['list_type']) && $config['manage']['list_type'] == 'tree') {
$data = $this->tree($data, $config, -1);
}
if ($excel == true) {
return $data;
}
if (Dever::input('page_type') == 1) {
Dever::$global['manage']['list_data'] = $data;
return;
}
//print_r($data);die;
//print_r(Helper::page("current"));die;
if ($data && isset($config['struct'])) {
$i = 0;
$pg = Dever::input('pg', 1);
$cur = Dever::input('search_limit', 0);
$num = $this->getNumConfig($config);
foreach ($data as $k => $v) {
$data[$k] = $this->getAdminInfo($data[$k]);
$data[$k]['i'] = $i;
$ii = intval($num[$cur])*($pg-1);
$data[$k]['r'] = $i+1+$ii;
$i++;
$result[$k] = '';
if (isset($config['manage']['mul'])) {
$result[$k] .= ' | ';
}
foreach ($config['struct'] as $ki => $vi) {
# 处理同步
if (isset($vi['sync']) && strpos($ki, '-')) {
$temp = explode('-', $ki);
$load = Dever::load($temp[0] . '/' . $temp[1] . '-one', array('option_' . $vi['sync'][1] => $v[$vi['sync'][0]]));
$v[$ki] = isset($load[$temp[2]]) ? $load[$temp[2]] : $vi['default'];
}
if (isset($vi['list']) && $vi['list']) {
if (empty($v[$ki])) {
$v[$ki] = $vi['default'];
}
# 处理权限
if (isset($vi['auth'])) {
$auth = $this->value($vi['auth'], $data[$k]);
if (!$auth) {
continue;
}
}
$show = $v[$ki];
if (is_string($vi['list'])) {
$show = $this->value($vi['list'], $data[$k], $config['struct']);
}
if (isset($vi['key']) && $vi['update'] != 'editor') {
$show = Dever::upload($show);
}
if (isset($vi['modal'])) {
$show = Html::modal($this->value($vi['modal'], $data[$k], $config['struct']), $show);
} elseif (isset($vi['option'])) {
# 验证option是否是匿名函数
$vi['option'] = $this->option($vi['option']);
# 位运算
if (isset($vi['bit'])) {
$ts = array();
foreach ($vi['option'] as $tm => $tv) {
if (isset($vi['bit'][$tm]) && ($show & $tm) > 0) {
$ts[] = $tv;
}
}
$show = implode(',', $ts);
}
if ((isset($vi['child_name']) || (isset($vi['show']) && is_string($vi['show'])))) {
if (isset($vi['option'][$show]) && is_array($vi['option'][$show])) {
$show = $vi['option'][$show]['name'];
} else {
$show = isset($vi['option'][$show]) ? $vi['option'][$show] : $show;
}
}
//elseif ($config['state'] == 1 && (isset($vi['edit']) && $vi['edit']) || $ki == 'status')
elseif ($config['state'] == 1 && (isset($vi['edit']) && $vi['edit']))
{
$vi['name'] = 'up_col_' . $ki;
$vi['value'] = $v[$ki];
$m = 'select';
if (isset($vi['update']) && $vi['update'] == 'group') {
$m = 'group';
}
$show = Html::$m($vi, 'form-list', '', 'style="min-width: 100px;" data-old="'.$show.'" onchange="update($(this), \'' . $v['id'] . '\', \'' . $this->project . '\', \'' . $this->table . '\')"');
} else {
if (strstr($show, ',')) {
$temp = explode(',', $show);
$t = array();
foreach ($temp as $vv) {
if (isset($vi['option'][$vv]) && is_array($vi['option'][$vv])) {
$t[] = $vi['option'][$vv]['name'];
} elseif(isset($vi['option'][$vv])) {
$t[] = $vi['option'][$vv];
} else {
$t[] = $vv;
}
}
$show = implode('
', $t);
} elseif (isset($vi['option'][$show]) && is_array($vi['option'][$show])) {
$show = $vi['option'][$show]['name'];
} else {
$show = isset($vi['option'][$show]) ? $vi['option'][$show] : $show;
}
}
}
$text = $show;
if ($high && isset($high[$ki])) {
if (isset($v['s_' . $ki])) {
$text = $v['s_' . $ki];
$text = str_replace('', '', $text);
$text = str_replace('', '', $text);
} else {
$text = preg_replace('/('.$high[$ki].')/i', '${1}', $text);
}
}
if (!isset($vi['option']) && isset($vi['edit']) && $vi['edit']) {
//$url = Dever::url($vi['edit'] . '?where_id=' . $v['id'] . '&col=' . $vi['col']. '&key=' . $this->project . '&table=' . $this->table);
$url = $this->url('updateAction');
$vi['edit'] = $vi['edit'] == 'textarea' ? $vi['edit'] : 'text';
$result[$k] .= '' . $text . ' | ';
} else {
$result[$k] .= '' . $text . ' | ';
}
}
}
$result[$k] .= $this->list_tbody_button($config, $data[$k]);
$result[$k] .= '
';
}
}
/*
if ($result) {
$thead = $this->list_thead();
if ($thead) {
$k = $k + 1;
$result[$k] = '';
foreach ($thead as $k => $v) {
$result[$k] .= $v;
}
$result[$k] .= '
';
}
}
*/
return $result;
}
private function list_tbody_button($config, $data, $type = 'td')
{
$result = '';
if (isset($config['manage']['_list']['value'])) {
$result = '<'.$type.'>';
if ($config['state'] == 2) {
if (isset($config['manage']['_list']['value']['update'])) {
unset($config['manage']['_list']['value']['update']);
}
if (isset($config['manage']['_list']['value']['delete'])) {
$config['manage']['_list']['value']['delete'] = '恢复';
}
}
foreach ($config['manage']['_list']['value'] as $kj => $vj) {
$pj = false;
$h = '';
$oper = true;
if ($kj == 'update') {
$oper = Dever::load('manage/auth.oper', 3);
} elseif ($kj == 'delete') {
$oper = Dever::load('manage/auth.oper', 5);
$h = '';
}
if (is_array($vj) && isset($vj[1])) {
if (isset($vj[2])) {
$oper = $this->value($vj[2], $data);
}
if ($oper && strpos($vj[1], 'modal|') === false) {
$pj = $this->value($vj[1], $data);
$vjn = $vj[0];
}
} else {
$vjn = $vj;
}
if ($oper == true) {
if (strpos($kj, 'edit') !== false) {
$result .= ' ';
} elseif (strpos($kj, 'oper') !== false) {
$result .= ' ';
} elseif (isset($vj[1]) && strpos($vj[1], 'modal|') !== false) {
$t = explode('|', $vj[1]);
$result .= '' . $vj[0] . ' ';
} elseif (isset($vj[1])) {
$result .= ' ';
} else {
$result .= '' . $vj[0] . '';
}
}
}
$result .= ''.$type.'>';
}
return $result;
}
/**
* 多级分类
*
* @return array
*/
private function tree($data, $config, $parent = 0)
{
$key = $config['name'] . '_id';
$result = array();
$this->treeData($data, $result, $key, $parent);
return $result;
}
private function treeData($array, &$result, $key, $parent_id = 0, $level = 0)
{
if (empty($array)) {
return;
}
$level++;
foreach ($array as $k => $v) {
if (isset($v[$key]) && $v[$key] == $parent_id) {
$v['level'] = $level;
$v['name'] = $this->treeName($v['name'], $level);
$result[] = $v;
unset($array[$k]);
$this->treeData($array, $result, $key, $v['id'], $level);
}
}
}
private function treeName($name, $level = 1)
{
$string = '';
if ($level > 1) {
/*
$num = 4;
$string = '-';
//STR_PAD_LEFT
$string = str_pad('|', $level * $num, $string);
*/
$string = str_repeat(' ',$level-1);
$string .= '|—';
}
return $string . $name;
}
/**
* 列表页批量管理
*
* @return array
*/
public function list_mul()
{
# 新增权限:更新权限
if (Dever::load('manage/auth.oper', 3) == false) {
Dever::alert('你没有权限');
}
$config = $this->config();
$result = '';
if (isset($config['struct']) && isset($config['manage']['mul'])) {
$mul = Dever::preInput('mul_');
$node = Html::node(array('class="am-u-sm-12" style="margin-top:10px;"', 'class="am-form-group am-input-group-sm"'));
$btn = '';
$prefix = 'mul_';
$result .= $node[0];
$default = 0;
$option = array
(
1 => '选中的数据',
);
# 只有当有搜索条件时才会出现
if (Dever::load('manage/auth.oper', 2) && $this->search == true) {
$option[2] = '所有数据';
$default = 2;
}
$this->list_search_select($result, $mul, $prefix . 'type' . '" id="' . $prefix . 'type', '请选择更新方式', $option, $default);
foreach ($config['struct'] as $k => $v) {
if ($k == 'state') {
$v['option'] = Dever::config('base')->state;
if ($this->getState() == 2) {
unset($v['option'][2]);
} else {
unset($v['option'][1]);
}
$v['edit'] = true;
}
if (isset($v['edit']) && isset($v['option']) && (is_array($v['option']) || is_object($v['option']))) {
$this->list_search_select($result, $mul, $prefix . 'set_' . $k, $v['name'], $this->option($v['option']), $v['default']);
}
}
$result .= $btn . $node[1];
}
//print_r($result);die;
return $result;
}
private function value($value, $data, $struct = array())
{
if (!$data) {
return $value;
}
if (is_string($data)) {
$eval = '$value = ' . $value . ';';
eval($eval);
return $value;
}
if ($value == 'table' && $struct) {
$result = $this->struct_data($struct, $data);
$value = Dever::table($result);
} elseif (strpos($value, '{') !== false) {
# 这里用到了/e,注意这里无论如何不能传入$_GET之类的用户参数 2015/7/21更新为callback方式
//$eval = '$value = ' . preg_replace('/{(.*?)}/e', "\$data['$1']", $value) . ';';
$func = function ($r) use ($data) {
return $data[$r[1]];
};
$eval = '$value = ' . preg_replace_callback('/{(.*?)}/', $func, $value) . ';';
eval($eval);
}
return $value;
}
/**
* update
*
* @return array
*/
public function update()
{
$config = $this->config();
$result = array();
$prefix = 'update';
$data = array();
if ($this->id) {
# 新增权限
if (Dever::load('manage/auth.oper', 3) == false) {
Dever::alert('你没有权限');
}
$data = $this->load('one', $this->id);
if ($data) {
//$prefix = 'set';
}
} else {
# 新增权限
if (Dever::load('manage/auth.oper', 4) == false) {
Dever::alert('你没有权限');
}
}
//print_r($config['manage']['update']);die;
$data = $this->getAdminInfo($data);
$col = Dever::input('col');
foreach ($config['struct'] as $k => $v) {
if (isset($v['update'])) {
if ($col && !strstr(',' . $col . ',', ',' . $k . ',')) {
continue;
}
//处理权限
if (isset($v['auth'])) {
$auth = $this->value($v['auth'], $data);
if (!$auth) {
continue;
}
}
# 处理show模式下的class
$class = $this->update_class($k, $v, '', $data);
$result[$k] = '';
} elseif (!$col && isset($v['class'])) {
# 分割线
$v['name'] = $this->value($v['name'], array('test' => 1));
$result[$k] = Html::hr($v);
}
}
if (Dever::input('ajax') == 1) {
return implode('', $result);
}
//print_r($result);die;
return $result;
}
/**
* update_class
*
* @return string
*/
public function update_class($name, $param, $prefix = '', $data = array())
{
$class = '';
$key = 'show';
if (isset($param[$key]) && $param[$key]) {
$parent = array();
$child = array();
if (is_string($param[$key])) {
parse_str($param[$key], $param[$key]);
}
if (is_array($param[$key])) {
foreach ($param[$key] as $k => $v) {
if ($k == 'no') {
$child[$k . '_' . $v] = $key . '_no';
} elseif (strpos($v, '/')) {
$parent[$k] = $key . '_' . $k;
$k = $k . '_ajax';
$value = '';
if (isset($data[$name])) {
$value = $data[$name];
}
$v = str_replace('?', '?key='.$name.'&value='.$value.'&source='.$this->name.'&', $v);
$child[$k] = $key . '_' . $k .'" dever-ajax="'.Dever::url($v).'"';
} else {
if (strpos($v, ',')) {
$temp = explode(',', $v);
foreach ($temp as $v1) {
$show = $k . '_' . $v1;
if ($prefix) {
$k = str_replace($name, $k, $prefix);
$show = str_replace($name, $show, $prefix);
}
$parent[$k] = $key . '_' . $k;
$child[$show] = $key . '_' . $show;
}
} else {
$show = $k . '_' . $v;
if ($prefix) {
$k = str_replace($name, $k, $prefix);
$show = str_replace($name, $show, $prefix);
}
$parent[$k] = $key . '_' . $k;
$child[$show] = $key . '_' . $show;
}
}
}
}
$class = implode(' ', $parent) . ' ' . implode(' ', $child);
}
if (isset($param['control'])) {
$class .= ' ' . $key . '_input';
}
return $class;
}
/**
* update_html
*
* @return string
*/
public function create_update_html($key, $value, $data = array())
{
$result = '';
$value['ext'] = $value['col'] = $key;
$value['update'] = $value['update'] ? $value['update'] : 'text';
if (isset($value['match']) && $value['match'] != 'option') {
if (is_string($value['match']) && strpos($value['match'], '/') !== false) {
$value['valid'] = 'validate[required,custom[' . $key . ']]';
} else {
$value['valid'] = 'validate[required]';
}
}
if (is_string($value['update']) && strpos($value['update'], 'copy.') !== false) {
$value['value'] = $value['update'];
$value['update'] = 'hidden';
}
$this->update_html($value, $key, $key, $data, $result);
return $result;
}
/**
* update_html
*
* @return string
*/
public function update_html($param, $key, $index, $data, &$result)
{
if (isset($param['name']) && $param['update'] != 'hidden' && isset($param['update'])) {
$result .= Html::pageLeft($param);
}
if ($param['update']) {
# 名称带前缀
$param['name'] = 'update_' . $param['ext'];
$param['index'] = $index;
//$param['value'] = '';
# 得到当前的值
if (isset($data[$index]) && !isset($param['value'])) {
$param['value'] = $data[$index];
}
# 得到下级的值
if (isset($param['child_value']) && isset($data['id'])) {
$param['child_value'] = $this->value($param['child_value'], $data);
}
# 验证option是否是匿名函数
if (isset($param['option'])) {
$param['option'] = $this->option($param['option']);
}
if (isset($data[$index]) && isset($param['key']) && $param['update'] != 'editor') {
$param['value'] = Dever::upload($data[$index]);
}
# 处理下级字段
if (isset($param['child'])) {
$param['child'] = $this->option($param['child']);
if (isset($data[$key . '_parent'])) {
$param['parent_value'] = $data[$key . '_parent'];
}
}
# 设置默认值
if (isset($param['default'])) {
$param['default'] = $this->option($param['default']);
}
# 处理同步
if (isset($param['sync']) && isset($data[$param['sync'][0]]) && strpos($key, '-')) {
$temp = explode('-', $key);
$load = Dever::load($temp[0] . '/' . $temp[1] . '-one', array('option_' . $param['sync'][1] => $data[$param['sync'][0]]));
$param['value'] = isset($load[$temp[2]]) ? $load[$temp[2]] : $param['default'];
}
$method = $param['update'];
if (is_array($method)) {
$result .= '';
$tab = '';
$order = array
(
'col' => 'order',
'name' => '排序-按照数字正序排列',
'default' => '1',
'desc' => '排序',
'match' => 'is_string',
'update' => 'text',
);
array_unshift($method, $order);
$this->update_child(array(), $method, $key, $result, -1);
if (isset($param['value']) && $param['value']) {
$param['value'] = json_decode(base64_decode($param['value']), true);
foreach ($param['value'] as $k => $v) {
$this->update_child($v, $method, $key, $result, $k);
$active = '';
if ($k == 0) {
$active = 'active';
}
$k = $k + 1;
$tab .= '第' . $k . '条';
}
} else {
$this->update_child(array(), $method, $key, $result, 0);
$tab = '第1条';
}
$result = str_replace('{tab}', $tab, $result);
} else {
if (isset($param['update_input']) && isset($data[$index . '_input'])) {
$param['update_input_data'] = explode(',', $data[$index . '_input']);
}
$result .= Html::$method($param);
}
if (isset($param['desc']) && ($param['update'] == 'text' || $param['update'] == 'password')) {
$result .= Html::desc($param['desc']);
}
}
}
/**
* update_action
*
* @return array
*/
private function update_child($data, $param, $key, &$result, $index)
{
$style = '';
if ($index != 0) {
$style = 'style="display:none;"';
}
$result .= '';
}
/**
* update_action
*
* @return array
*/
public function update_action_api()
{
$method = false;
$config = $this->config();
$input = Dever::preInput('update_');
if ($this->id) {
# 新增权限
if (Dever::load('manage/auth.oper', 3) == false) {
Dever::alert('你没有权限');
}
Dever::setInput('where_id', $this->id);
//Dever::setInput('update_where_id', $this->id);
$info = $this->load('one', $this->id);
if ($info) {
$method = 'update';
$col = Dever::input('col');
$value = Dever::input('value');
if ($col && $value) {
$method = 'update_' . $col;
//Dever::setInput('set_' . $col, $value);
//Dever::setInput('update_' . $col, $value);
$param['where_id'] = $this->id;
$param['set_' . $col] = $value;
$this->load($method, $param);
$struct = $this->struct_data($config['struct'], array($col => $value));
Log::add($this->project, $this->table, array('method' => $method, 'input' => $struct, 'struct' => $config['struct']), $this->id);
Dever::out('yes');
return;
}
$prefix = 'set';
} else {
$method = 'insert';
$prefix = 'add';
}
}
if (!$method) {
# 新增权限
if (Dever::load('manage/auth.oper', 4) == false) {
Dever::alert('你没有权限');
}
$method = 'insert';
$prefix = 'add';
}
if ($method && $input) {
$update = $order = array();
$i = 0;
$c = array();
foreach ($input as $k => $v) {
if ($v === '') {
$v = 'null';
}
if ($v && is_string($v) && strpos($v, 'copy.') !== false) {
$temp = str_replace('copy.', '', $v);
if (isset($input['update_' . $temp])) {
$v = $input['update_' . $temp];
}
}
if (strpos($k, '_c_') !== false) {
if ($v == 'null') {
$v = '';
}
$temp = explode('_c_', $k);
$k = str_replace('update_', $prefix . '_', $temp[0]);
if (!isset($c[$k])) {
$c[$k] = array();
}
if (strpos($temp[1], '_i_') !== false) {
$temp = explode('_i_', $temp[1]);
if (!isset($c[$k][$temp[1]])) {
$c[$k][$temp[1]] = 0;
} else {
$c[$k][$temp[1]]++;
}
$num = $c[$k][$temp[1]];
$update[$i][$k][$num][$temp[1]] = $v;
if ($temp[1] == 'order') {
$order[$i][$k][$num] = $v;
}
} else {
//$update[$i][$k][$c][$temp[1]] = $v;
}
} elseif (strpos($k, '__') !== false) {
$temp1 = explode('__', $k);
$temp2 = explode('_', $temp1[0]);
$i = $temp2[1] - 1;
if (strpos($k, 'where_id') !== false) {
//$update[$i]['where_id'] = $v;
} else {
$update[$i]['add_' . $temp1[1]] = $v;
}
} else {
$ki = str_replace('update_', $prefix . '_', $k);
if (strpos($ki, 'where_id') !== false) {
if ($method != 'insert') {
$update[$i]['where_id'] = $v;
}
} else {
if (strpos($k, '-')) {
$k = str_replace('update_', '', $k);
if (isset($config['struct'][$k]) && isset($config['struct'][$k]['sync'])) {
$s_col = $config['struct'][$k]['sync'][0];
$m_col = $config['struct'][$k]['sync'][1];
if ($s_col == 'id') {
$s_value = $this->id;
} else {
$s_one = $this->load('one', $this->id);
$s_value = $s_one[$s_col];
}
$temp = explode('-', $k);
$index = $temp[0] . '/' . $temp[1];
$update_other_set[$index]['set_' . $temp[2]] = $v;
//$update_other_set[$index]['set_' . $m_col] = $s_value;
$update_other_add[$index]['add_' . $temp[2]] = $v;
$update_other_add[$index]['add_' . $m_col] = $s_value;
$update_other_id[$index]['option_' . $m_col] = $s_value;
}
} else {
if (is_array($v)) {
$k = str_replace('update_', '', $k);
$kd = $k . '_id';
if (isset($config['struct'][$kd])) {
foreach ($v as $vk => $vt) {
if ($vt == -1) {
unset($v[$vk]);
}
}
if ($v) {
$vd = end($v);
$kdi = $prefix . '_' . $kd;
$update[$i][$kdi] = $vd;
}
}
if (isset($config['struct'][$k]) && strpos($config['struct'][$k]['type'], 'int') !== false) {
$v = end($v);
}
}
$update[$i][$ki] = $v;
}
}
}
}
//print_r($update_other_set);die;
//print_r($input);
//print_r($update_other);die;
//print_r($config['struct']);die;
# 增加复制的数量
$copy_num = Dever::input('copy_num');
if ($copy_num > 0) {
$update[0]['where_id'] = 0;
for ($i = 1; $i < $copy_num; $i++) {
$update[$i] = $update[0];
# 缓存处理
$update[$i]['rank'] = $i;
}
}
if ($this->id && !$info) {
$update[0]['add_id'] = $this->id;
}
//print_r($update);die;
foreach ($update as $k => $v) {
$method = 'insert';
$old = array();
if (isset($v['where_id']) && $v['where_id']) {
$method = 'update';
$old = $this->load('one', $v['where_id']);
}
if (isset($order[$k])) {
foreach ($order[$k] as $i => $j) {
array_multisort($j, SORT_ASC, $v[$i]);
}
}
$id = $this->load($method, $v);
if ($id) {
$struct = $this->struct_data($config['struct'], $v, $old);
Log::add($this->project, $this->table, array('method' => $method, 'input' => $struct), $this->id ? $this->id : $id);
}
if (isset($update_other_id) && $update_other_id) {
foreach ($update_other_set as $k => $v) {
$check = Dever::load($k . '-one', $update_other_id[$k]);
//print_r($check);die;
if ($check) {
$v['where_id'] = $check['id'];
Dever::load($k . '-update', $v);
} else {
Dever::load($k . '-insert', $update_other_add[$k]);
}
}
}
}
}
Dever::out('yes');
}
private function struct_data($struct, $data, $old = array())
{
$log = $tlog = array();
foreach ($struct as $i => $j) {
if (isset($j['list_name'])) {
$j['name'] = $j['list_name'];
} elseif (strpos($j['name'], '-')) {
$temp = explode('-', $j['name']);
$j['name'] = $temp[0];
}
if (isset($j['list_table'])) {
$j['list'] = $j['list_table'];
if ($j['list'] == false) {
$data[$i] = false;
}
}
$list = (isset($j['list']) && is_string($j['list']) && $j['list'] != 'table');
if (isset($data['where_' . $i]) && $data['where_' . $i]) {
$log[$j['name']] = $data['where_' . $i];
} elseif (isset($data['set_' . $i]) && $data['set_' . $i]) {
$log[$j['name']] = $data['set_' . $i];
} elseif (isset($data['add_' . $i]) && $data['add_' . $i]) {
$log[$j['name']] = $data['add_' . $i];
} elseif (isset($data[$i]) && $data[$i]) {
$log[$j['name']] = $list ? $this->value($j['list'], $data) : $data[$i];
}
if (isset($log[$j['name']])) {
$tlog[$j['name']] = $log[$j['name']];
if (is_array($tlog[$j['name']])) {
if (isset($tlog[$j['name']][0]) && is_array($tlog[$j['name']][0])) {
$tlog[$j['name']] = json_encode($tlog[$j['name']]);
if (isset($old[$i]) && is_array($old[$i])) {
$old[$i] = json_encode($old[$i]);
}
} else {
$tlog[$j['name']] = implode(',', $tlog[$j['name']]);
if (isset($old[$i]) && is_array($old[$i])) {
$old[$i] = implode(',', $old[$i]);
}
}
} elseif (strpos($log[$j['name']], 'http://wx.qlogo.cn/') !== false || strpos($log[$j['name']], '.jpg') !== false || strpos($log[$j['name']], '.gif') !== false || strpos($log[$j['name']], '.png') !== false) {
$log[$j['name']] = '
';
if (isset($old[$i]) && $old[$i]) {
$old[$i] = '
';
}
} elseif (is_numeric($log[$j['name']]) && (strpos($i, 'time') !== false || strpos($i, 'date') !== false)) {
$log[$j['name']] = date("Y-m-d H:i:s", $log[$j['name']]);
if (isset($old[$i]) && $old[$i]) {
$old[$i] = date("Y-m-d H:i:s", $old[$i]);
}
} elseif (isset($j['decode'])) {
$log[$j['name']] = json_decode(base64_decode($log[$j['name']]), true);
if (isset($old[$i]) && $old[$i]) {
$old[$i] = json_decode(base64_decode($old[$i]), true);
}
}
if (isset($j['option']) && !$list) {
$name = array();
$option = $this->option($j['option']);
if (is_array($option)) {
foreach ($option as $a => $b) {
if (!is_array($log[$j['name']])) {
if ($a == $log[$j['name']]) {
$name[] = (is_array($b) && isset($b['name'])) ? $b['name'] : $b;
}
} elseif (in_array($a, $log[$j['name']])) {
$name[] = (is_array($b) && isset($b['name'])) ? $b['name'] : $b;
}
}
}
$log[$j['name']] = implode(',', $name);
}
if (isset($old[$i]) && $old[$i] != $tlog[$j['name']]) {
$log[$j['name']] = array('old' => $old[$i], 'new' => $log[$j['name']]);
}
}
}
return $log;
}
/**
* delete_action
*
* @return array
*/
public function delete_action_api()
{
if (Dever::load('manage/auth.oper', 5) == false) {
Dever::alert('您没有权限');
}
$config = $this->config();
if (isset($config['manage']['delete']) && $config['manage']['delete'] === 2) {
$this->load('delete', array('where_id' => $this->id));
} elseif (isset($config['struct']['state']) && (!isset($config['manage']['delete']) || (isset($config['manage']['delete']) && $config['manage']['delete']))) {
$this->load('update', array('where_id' => $this->id, 'state' => 2));
}
return 'reloaderror';
}
/**
* recovery_action
*
* @return array
*/
public function recovery_action_api()
{
if (Dever::load('manage/auth.oper', 5) == false) {
Dever::alert('您没有权限');
}
$this->load('update', array('where_id' => $this->id, 'state' => 1));
return 'reload';
}
/**
* stat 为主动统计提供相关数据
*
* @return array
*/
public function stat()
{
//bundle 包依赖工具
$config = $this->config();
if (empty($config['manage']['stat'])) {
Dever::alert('该项目主动统计功能未开放');
}
$data = $config['manage'];
$data['table'] = '';
$method = $this->project . '/' . $this->table . '-all';
$gp = Dever::input('gp', 'month,day');
$col = is_string($gp) ? explode(',', $gp) : $gp;
$data['search'] = $this->stat_search($config['struct'], $gp, $config['manage']['stat'], $config['manage']['search']);
foreach ($col as $k => $v) {
$this->stat_data($data, $config['struct'], $v, $method);
}
return $data;
}
/**
* stat 为主动统计提供导出数据 后续优化
*
* @return array
*/
public function stat_excel()
{
Dever::$global['base']['excel'] = 1;
//print_r($data['thead']);die;
$data = $this->stat();
if ($data && isset($data['list'])) {
$xls = new \PHPExcel();
$xls->getProperties()->setCreator("Maze Stat Excel")
->setLastModifiedBy("Maze Stat Excel")
->setTitle("Office 2007 XLSX Maze Document")
->setSubject("Office 2007 XLSX Maze Document")
->setDescription("Mazephp Stat Excel")
->setKeywords("Mazephp Stat Excel")
->setCategory("Mazephp Stat Excel");
$info = $this->info();
$name = $info['list_header'] . '的' . $info['stat_desc'] . '-' . $info['project_name'];
$start = 65;
$s = 0;
foreach ($data['thead'] as $k => $v) {
if ($s > 0) {
$xls->createSheet();
}
$act = $xls->setActiveSheetIndex($s);
$act->setTitle($v[0]);
$s++;
$i = 0;
foreach ($v as $kj => $vj) {
$num = 1;
$cell = $this->_getChr($start, $i);
$act->setCellValue($cell . '' . $num, $vj);
$act->getColumnDimension($cell)->setWidth(20);
$i++;
if (isset($data['list'][$k])) {
foreach ($data['list'][$k] as $ki => $vi) {
if (isset($vi[$kj])) {
$num += 1;
$act->setCellValue($cell . $num, $vi[$kj]);
}
}
}
}
}
//$act->getStyle('A1:'.$k.'20')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); // 垂直居中
//$act->getStyle('A1:'.$k.'20')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);// 水平居中
$xls->setActiveSheetIndex(0);
$filename = $name . '.xlsx';
header('Pragma: public');
header('Expires: 0');
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Content-Type:application/force-download');
header('Content-Type:application/vnd.ms-execl');
header('Content-Type:application/octet-stream');
header('Content-Type:application/download');
header("Content-Disposition:attachment;filename='" . $filename . "'");
header('Content-Transfer-Encoding:binary');
$write = \PHPExcel_IOFactory::createWriter($xls, 'Excel2007');
$write->save('php://output');
}
}
/**
* stat_search
*
* @return mixed
*/
private function stat_search($struct, $col, $stat, $search)
{
unset($struct['id']);
unset($struct['cdate']);
if ($stat) {
$stat = explode(',', $stat);
foreach ($stat as $k => $v) {
if (isset($struct[$v])) {
unset($struct[$v]);
}
}
}
$struct['day']['name'] = '天';
$struct['month']['name'] = '月';
$struct['year']['name'] = '年';
$param['update'] = 'checkbox';
$param['name'] = 'gp';
$param['value'] = $col;
$param['option'] = $struct;
$html = '';
return $html;
}
/**
* stat_data
*
* @return mixed
*/
private function stat_data(&$data, $struct, $col, $method)
{
Dever::setInput('group', $col);
switch ($col) {
case 'year':
$name = '按年统计';
break;
case 'month':
$name = '按月统计';
break;
case 'day':
$name = '按天统计';
break;
default:
$name = $struct[$col]['name'];
break;
}
$list = Dever::load($method, array('group' => $col, 'col' => 'count(1) as total,id'));
$data['table'] .= '';
$data['table'] .= '' . $name . ' | 统计数字 |
';
$data['thead'][$col] = array($name, '统计数字');
if ($list) {
$data['table'] .= '';
$total = 0;
foreach ($list as $k => $v) {
if (isset($v[$col])) {
if (isset($struct[$col]['option'])) {
$option = $this->option($struct[$col]['option']);
if (isset($option[$v[$col]])) {
$v[$col] = $option[$v[$col]];
if (is_array($v[$col])) {
$v[$col] = $v[$col]['name'];
}
}
}
$data['table'] .= '' . $v[$col] . ' | ' . $v['total'] . ' |
';
$total += $v['total'];
$data['list'][$col][] = array($v[$col], $v['total']);
}
}
$data['table'] .= '';
if ($total > 0 && $k > 0) {
$data['table'] .= '汇总 | ' . $total . ' |
';
$data['list'][$col][] = array('汇总', $total);
}
}
$data['table'] .= '
';
}
/**
* load
*
* @return mixed
*/
private function load($method = 'one', $param = array())
{
return Dever::load($this->project . '/' . $this->table . '-' . $method, $param);
}
/**
* __call
*
* @return object
*/
public function __call($method, $param)
{
if (strpos($method, 'html_') !== false) {
return Html::text($param);
}
return $this;
}
/**
* option
*
* @return string
*/
private function option($option)
{
if (is_object($option)) {
$function = $option;
$option = $function();
}
return $option;
}
/**
* option
*
* @return string
*/
public function manage()
{
$config = $this->config();
return $config;
}
/**
* valid
*
* @return string
*/
public function valid()
{
//http://placehold.it/350x150
$config = $this->config();
if (isset($config['struct'])) {
$rule = array();
$rule['required']['regex'] = 'none';
$rule['required']['alertText'] = '此项不能为空';
$rule['required']['alertTextCheckboxMultiple'] = '请选择一个选项';
$rule['required']['alertTextCheckboxe'] = '请选择一个选项';
$rule['required']['alertTextDateRange'] = '日期范围不可空白';
foreach ($config['struct'] as $k => $v) {
if (isset($v['match']) && $v['match'] != 'option' && is_string($v['match']) && strpos($v['match'], '/') !== false) {
$rule[$k]['regex'] = $v['match'];
$rule[$k]['alertText'] = $v['desc'];
}
}
}
$script = '';
//print_r($script);die;
return $script;
}
/**
* save
*
* @return string
*/
public function save()
{
$config = $this->config();
if (isset($config['manage']['save'])) {
return 'yes';
}
return 'no';
}
}