<?php

/**

* 后台总控制器

*/

namespace app\common\controller;

use think\Controller;

use app\common\service\DataService;

class Admin extends Controller

{

/**

* 默认操作数据表

* @var string

*/

protected $table;

/**

* 检测登录权限

*/

public $chkLogin = true;

/**

* 检查节点访问权限

*/

public $chkAuth = true;

/**

* 页面标题

*/

public $title = '后台管理';

/**

* 结构分隔符

*/

public static $dept = '<span style="color:gray;">├─ </span>';

/**

* 表单默认操作

* @param Query $db 数据库查询对象

* @param string $tpl 显示模板名字

* @param string $pk 更新主键规则

* @param array $where 查询规则

* @param array $data 扩展数据

* @return array|string

*/

protected function _form($db = null, $tpl = null, $pk = null, $where = [], $data = [])

{

$db = is_null($db) ? db($this->table) : (is_string($db) ? db($db) : $db);

$pk = empty($pk) ? ($db->getPk() ? $db->getPk() : 'id') : $pk;

$pk_value = input($pk, isset($where[$pk]) ? $where[$pk] : (isset($data[$pk]) ? $data[$pk] : null));

// POST请求, 数据自动存库

if ($this->request->isPost()) {

$data = array_merge(input('post.'), $data);

if ($this->_callback('_form_filter', $data) !== false) {

$result = DataService::save($db, $data, $pk, $where);

$url = input('open_type') == 'modal' ? '' : cookie('_listpage_');

return $result !== false ? $this->success('恭喜, 数据保存成功!', $url) : $this->error('数据保存失败, 请稍候再试!');

}

}

// 非POST请求, 获取数据并显示表单页面

$row = $db->where($pk, $pk_value)->where($where)->find();

$vo = ($pk_value !== null) ? array_merge($row, $data) : $data;

if (false !== $this->_callback('_form_filter', $vo)) {

$this->view->title = !empty($this->title) ? $this->title : null;

$this->view->vo = !empty($vo) ? $vo : null;

return $this->fetch($tpl);

}

}

/**

* 列表集成处理方法

* @param Query $db 数据库查询对象

* @param bool $is_page 是启用分页

* @param bool $is_display 是否直接输出显示

* @param bool $total 总记录数

* @return array|string

*/

protected function _list($db = null, $is_page = true, $is_display = true, $total = false)

{

$db = is_null($db) ? db($this->table) : (is_string($db) ? db($db) : $db);

# 列表排序默认处理

if ($this->request->isPost() && input('post.action') === 'resort') {

$data = input('post.');

unset($data['action']);

foreach ($data as $key => &$value) {

if (false === $db->where('id', intval(ltrim($key, '_')))->update(['sort' => $value])) {

$this->error('列表排序失败,请稍候再试!');

}

}

$this->success('列表排序成功,正在刷新列表!', '');

}

# 默认排序

if ($db->getOptions('order') === null) {

$fields = $db->getTableFields();

in_array('sort', $fields) && $db->order('sort asc');

}

# 列表显示

$result = [];

if ($is_page) {

// $row_page = intval($this->request->get('rows', cookie('rows')));

// cookie('rows', $row_page >= 10 ? $row_page : 15);

// $row_page = 1;

// 每页条数

$rows = input('limit', config('paginate.list_rows'), 'intval');

$page = $db->paginate($rows, $total, ['query' => input('get.', '', 'urlencode')]);

// 获取总数

$result['total'] = $page->total();

$result['list'] = $page->all();

$result['page'] = preg_replace(['|href="(.*?)"|', '|pagination|'], ['data-load="$1"', 'pagination pull-right'], $page->render());

} else {

$result['list'] = $db->select();

}

if ($this->_callback('_data_filter', $result['list']) === false) {

return $result;

}

if ($is_display) {

!empty($this->title) && $this->view->title = $this->title;

cookie('_listpage_', url('admin/index/index', '', '') . '#' .$this->request->url());

exit($this->fetch('', $result));

}

return $result;

}

/**

* 当前对象回调成员方法

* @param string $method

* @param array $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;

}

/**

* 更新操作

* @param string $name 类型名称

*/

protected function _save ($name = '')

{

$arr = [

'success'   =>  [

'delete'    =>  ($name ? : '删除') . '成功!',

'forbid'    =>  ($name ? : '禁用') . '成功!',

'resume'    =>  ($name ? : '启用') . '成功!',

],

'error'     =>  [

'delete'    =>  ($name ? : '删除') . '失败,请稍候再试!',

'forbid'    =>  ($name ? : '禁用') . '失败,请稍候再试!',

'resume'    =>  ($name ? : '启用') . '失败,请稍候再试!',

],

];

$success = $arr['success'][$this->request->action()];

$error   = $arr['error'][$this->request->action()];

return DataService::update($this->table) ? $this->success($success, '') : $this->error($error);

}

/**

* 生成静态页面

*/

protected function makeHtml ($mode, $id = '')

{

$root = $this->request->root();

// 获取内容

$content = action('article/Index/' . $mode, ['id' => $id]);

if (!empty($id)) {

$file = 'topic/' . $id . '.html';

// 替换内容

$content = str_replace($root . '/'. $mode. '/', $root . '/topic/', $content);

} else {

$file = 'index.html';

// 替换内容

$content = str_replace($root . '/category/', $root . '/topic/', $content);

$content = str_replace($root . '/detail/', $root . '/topic/', $content);

}

// 替换内容需要正则拿出所有需要替换的链接,循环判定静态文件是否存在,存在则使用静态替换,不存在则使用动态路径

// ...............

file_put_contents(ROOT_PATH . $file, $content);

}

/**

* 全站生成静态

*/

protected function makeHtmls ()

{

}

}

子类     /**      * 标签列表      */         public function index ()         {         $this->view->name = $this->title;         // 设置页面标题         $this->title = $this->title . '管理';         // 实例Query对象         $db = db($this->table)->where('delete_time', null)->where('type', $this->type);         if ($area = input('countryid', 0, 'intval')) {             $db->where('area', $area);         }         // 实例化并显示         return parent::_list($db, 'expert/index');                      }       /**      * 列表数据处理      * @param array $data      */     protected function _index_data_filter(&$data)     {         foreach ($data as &$vo) {             $vo['create'] = date('Y-m-d H:i:s', $vo['create_time']);               // 显示地区             $vo['country'] = db('Country')->where('id', $vo['area'])->value('namecn') ? : '未设置';             // 显示行业标签             $vo['industry'] = db('Industry')->where('id', $vo['industry'])->value('namecn') ? : '未设置';         }     }         /**      * 表单数据默认处理      * @param array $data      */     protected function _form_filter(&$data)     {         if ($this->request->isPost()) {             if (!isset($data['id'])) {                 $data['create_time'] = time();                 $data['type'] = $this->type;             }         }     }       /**      * 标签编辑      */     public function add()     {         $this->view->name = $this->title;         $this->title = '新增' . $this->title;         return $this->_form($this->table, 'expert/form');     }       /**      * 标签编辑      */     public function edit()     {         $this->view->name = $this->title;         $this->title = '编辑' . $this->title;         return $this->_form($this->table, 'expert/form');     }

form表单公用的更多相关文章

  1. [js开源组件开发]query组件,获取url参数和form表单json格式

    query组件,获取url参数和form表单json格式 距离上次的组件[js开源组件开发]ajax分页组件一转眼过去了近二十天,或许我一周一组件的承诺有了质疑声,但其实我一直在做,只是没人看到……, ...

  2. 项目回顾1-图片上传-form表单还是base64-前端图片压缩

    第一个项目终于上线了,是一个叫亲青筹的公益众筹平台,微信端,电脑端还有后台界面大部分都是我完成的,几个月过来,感觉收获了很多,觉得要总结一下. 首先想到的是图片上传的问题.在通常表单数据都是ajax上 ...

  3. Django学习笔记(6)——Form表单

    知识储备:HTML表单form学习 表单,在前端页面中属于最常见的一个东西了.基本上网站信息的提交都用到了表单,所以下面来学习Django中优雅的表单系统:Form 表单的主要作用是在网页上提供一个图 ...

  4. JS form 表单收集 数据 formSerialize

    做后台系统的时候通常会用到form表单来做数据采集:每次一个字段一个字段的去收集就会很麻烦,网站也有form.js插件可以进行表单收集,并封装成一个对象,通过ajax方法传到后台:现在介绍一种直觉采集 ...

  5. C#之Form表单认证

    原文地址: https://blog.csdn.net/chadcao/article/details/7859394 ASP.NET的安全认证,共有“Windows”.“Form”.“Passpor ...

  6. form表单验证-Javascript

    Form表单验证: js基础考试内容,form表单验证,正则表达式,blur事件,自动获取数组,以及css布局样式,动态清除等.完整代码如下: <!DOCTYPE html PUBLIC &qu ...

  7. Form 表单提交参数

    今天因为要额外提交参数数组性的参数给form传到后台而苦恼了半天,结果发现,只需要在form表单对应的字段html空间中定义name = 后台参数名 的属性就ok了. 后台本来是只有模型参数的,但是后 ...

  8. form表单 ----在路上(15)

    form 表单就是将用户的信息提交到服务器,服务器会将信息存储活着根据信息查询数据进行增删改查,再将其返回给用户. 基本格式: <form action="" method ...

  9. form表单的字符串进行utf-8编码

    <form>表单有assept-charset属性.该属性规定字符的编码方式,默认是"unknown",与文档的字符集相同. 该属性除了Internet explore ...

随机推荐

  1. MySQL C API概述

    以下列表总结了C API中可用的功能.有关更多详细信息,请参见 第27.8.7节“C API函数描述”中的说明. my_init():在线程安全程序中初始化全局变量和线程处理程序 mysql_affe ...

  2. Android设置shape后改变颜色

    如下,可能多个btn的设置同一个shape,如果单独改变btn颜色,可以用如下代码 GradientDrawable btnPreDrawable = (GradientDrawable) btnTe ...

  3. 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数

    34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...

  4. ROIAlign, ROIPooling及ROIWarp对比

    RoI Pooling 实现从原图ROI区域映射到卷积区域最后pooling到固定大小的功能,然后通过池化把该区域的尺寸归一化成卷积网络输入的尺寸. ROIAlign 上面RoI Pooling从原图 ...

  5. Dan版本的nnet2

    除了chain,nnet1, nnet2, nnet3训练时调整转移模型,chain模型使用类似与MMI的训练准则 Dan's setup does not uses pre-training. Da ...

  6. 微信小程序总结

    一.基础用法: <navigator url='跳转页面组件'></navigator>用法和a标签差不多 <text></text>文本标签 < ...

  7. sql server 2008 windows验证改混合登陆中SqlServer身份验证用户名密码

    安装过程中,SQL Server 数据库引擎设置为 Windows 身份验证模式或 SQL Server 和 Windows 身份验证模式.本主题介绍如何在安装后更改安全模式. 如果在安装过程中选择“ ...

  8. H - Rescue the Princess ZOJ - 4097 (tarjan缩点+倍增lca)

    题目链接: H - Rescue the Princess  ZOJ - 4097 学习链接: zoj4097 Rescue the Princess无向图缩点有重边+lca - lhc..._博客园 ...

  9. Pickup Objective Actor

    在角色的头文件中,添加一个布尔变量,设为共有状态,用来判断是否携带目标物体,并暴露给蓝图,类型为仅蓝图可读 UPROPERTY(BlueprintReadOnly,Category="Gam ...

  10. python - 字符编码/格式化/替换符