灰儿 发表于 2022-7-6 09:19:16

FastAdmin基类控制器简介

FastAdmin控制器都必须继承自 application/common/controller/Backend.php的\app\common\controller\Backend 这个基类,这个基类application/admin/library/traits/Backend.php 里引入的 use \app\admin\library\traits\Backend;它有八个公共方法,
index/add/edit/del/multi/recyclebin/destroy/restore/ import
查看/添加/编辑/删除/批量更新/回收站/真实删除/还原/导入

common/controller/Backend里还有好多属性:
/**
* 无需登录的方法,同时也就不需要鉴权了
* @var array
*/
protected $noNeedLogin = [];

/**
* 无需鉴权的方法,但需要登录
* @var array
*/
protected $noNeedRight = [];

/**
* 布局模板
* @var string
*/
protected $layout = 'default';

/**
* 权限控制类
* @var Auth
*/
protected $auth = null;

/**
* 快速搜索时执行查找的字段
*/
protected $searchFields = 'id';

/**
* 是否是关联查询
*/
protected $relationSearch = false;

/**
* 是否开启数据限制
* 支持auth/personal
* 表示按权限判断/仅限个人
* 默认为禁用,若启用请务必保证表中存在admin_id字段
*/
protected $dataLimit = false;

/**
* 数据限制字段
*/
protected $dataLimitField = 'admin_id';

/**
* 是否开启Validate验证
*/
protected $modelValidate = false;

/**
* 是否开启模型场景验证
*/
protected $modelSceneValidate = false;

/**
* Multi方法可批量修改的字段
*/
protected $multiFields = 'status';

方法

/**
* 加载语言文件
* @param string $name
*/
protected function loadlang($name)
{
}

/**
* 渲染配置信息
* @param mixed $name 键名或数组
* @param mixed $value 值
*/
protected function assignconfig($name, $value = '')
{
}

/**
* 生成查询所需要的条件,排序方式
* @param mixed $searchfields 快速查询的字段
* @param boolean $relationSearch 是否关联查询
* @return array
*/
protected function buildparams($searchfields = null, $relationSearch = null)
{
}

/**
* 获取数据限制的管理员ID
* 禁用数据限制时返回的是null
* @return mixed
*/
protected function getDataLimitAdminIds()
{
}

/**
* Selectpage的实现方法
*
* 当前方法只是一个比较通用的搜索匹配,请按需重载此方法来编写自己的搜索逻辑,$where按自己的需求写即可
* 这里示例了所有的参数,所以比较复杂,实现上自己实现只需简单的几行即可
*
*/
protected function selectpage()
{
}
当两张相似的表意见curd时一个没有关联模型查询一个有时的区别:
class Demo extends Backend
{

    /**
   * Demo模型对象
   * @var \app\admin\model\Demo
   */
    protected $model = null;

    public function _initialize()
    {
      parent::_initialize();
      $this->model = new \app\admin\model\Demo;

    }

    /**
   * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
   * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
   * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
   */

}
traits的原idnex方法trait Backend
{

    /**
   * 查看
   */
    public function index()
    {
      //设置过滤方法
      $this->request->filter(['strip_tags']);
      if ($this->request->isAjax()) {
            //如果发送的来源是Selectpage,则转发到Selectpage
            if ($this->request->request('keyField')) {
                return $this->selectpage();
            }
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            $total = $this->model
                ->where($where)
                ->order($sort, $order)
                ->count();

            $list = $this->model
                ->where($where)
                ->order($sort, $order)
                ->limit($offset, $limit)
                ->select();

            $list = collection($list)->toArray();
            $result = array("total" => $total, "rows" => $list);

            return json($result);
      }
      return $this->view->fetch();
    }
    //......
}
有关联时的控制器:
class Dash extends Backend
{

    /**
   * Dash模型对象
   * @var \app\admin\model\Dash
   */
    protected $model = null;

    public function _initialize()
    {
      parent::_initialize();
      $this->model = new \app\admin\model\Dash;

    }

    /**
   * 默认生成的控制器所继承的父类中有index/add/edit/del/multi五个基础方法、destroy/restore/recyclebin三个回收站方法
   * 因此在当前控制器中可不用编写增删改查的代码,除非需要自己控制这部分逻辑
   * 需要将application/admin/library/traits/Backend.php中对应的方法复制到当前控制器,然后进行修改
   */

    /**
   * 查看
   */
    public function index()
    {
      //当前是否为关联查询
      $this->relationSearch = true;
      //设置过滤方法
      $this->request->filter(['strip_tags']);
      if ($this->request->isAjax())
      {
            //如果发送的来源是Selectpage,则转发到Selectpage
            if ($this->request->request('keyField'))
            {
                return $this->selectpage();
            }
            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
            $total = $this->model
                  ->with(['category'])
                  ->where($where)
                  ->order($sort, $order)
                  ->fetchSql(false)
                  ->count();

            $list = $this->model
                  ->with(['category'])
                  ->where($where)
                  ->order($sort, $order)
                  ->limit($offset, $limit)
                  ->fetchSql(false)
                  ->select();
            //file_put_contents(__DIR__.'/../../../runtime/log/sql_'.time().'_log.txt', $total);
            //file_put_contents(__DIR__.'/../../../runtime/log/sql_'.time().'_log1.txt', $list);
            foreach ($list as $row) {

            }
            $list = collection($list)->toArray();
            $result = array("total" => $total, "rows" => $list);

            return json($result);
      }
      return $this->view->fetch();
    }
}
无关联时的model

class Demo extends Model
{
    // 表名
    protected $name = 'demo';

    // 自动写入时间戳字段
    protected $autoWriteTimestamp = false;

    // 定义时间戳字段名
    protected $createTime = false;
    protected $updateTime = false;

    // 追加属性
    protected $append = [
    ];
}
有关联时的model(多出了一个方法)
class Dash extends Model
{
    // 表名
    protected $name = 'dash';

    // 自动写入时间戳字段
    protected $autoWriteTimestamp = false;

    // 定义时间戳字段名
    protected $createTime = false;
    protected $updateTime = false;

    // 追加属性
    protected $append = [

    ];

    public function category()
    {
      return $this->belongsTo('Category', 'category_id', 'id', [], 'LEFT')->setEagerlyType(0);
    }
}
js
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {

    var Controller = {
      index: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                  index_url: 'demo/index',
                  add_url: 'demo/add',
                  edit_url: 'demo/edit',
                  del_url: 'demo/del',
                  multi_url: 'demo/multi',
                  table: 'demo',
                }
            });

            var table = $("#table");

            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                pk: 'id',
                sortName: 'id',
                columns: [
                  [
                        {checkbox: true},
                        {field: 'id', title: __('Id')},
                        {field: 'name', title: __('Name')},
                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                  ]
                ]
            });

            // 为表格绑定事件
            Table.api.bindevent(table);
      },
      add: function () {
            Controller.api.bindevent();
      },
      edit: function () {
            Controller.api.bindevent();
      },
      api: {
            bindevent: function () {
                Form.api.bindevent($("form"));
            }
      }
    };
    return Controller;
});

关联后的js
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {

    var Controller = {
      index: function () {
            // 初始化表格参数配置
            Table.api.init({
                extend: {
                  index_url: 'dash/index',
                  add_url: 'dash/add',
                  edit_url: 'dash/edit',
                  del_url: 'dash/del',
                  multi_url: 'dash/multi',
                  table: 'dash',
                }
            });

            var table = $("#table");

            // 初始化表格
            table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                pk: 'id',
                sortName: 'id',
                columns: [
                  [
                        {checkbox: true},
                        {field: 'id', title: __('Id')},
                        {field: 'name', title: __('Name')},
                        {field: 'category_id', title: __('Category_id')},
                        {field: 'category.id', title: __('Category.id')},
                        {field: 'category.pid', title: __('Category.pid')},
                        {field: 'category.type', title: __('Category.type')},
                        {field: 'category.name', title: __('Category.name')},
                        {field: 'category.nickname', title: __('Category.nickname')},
                        {field: 'category.flag', title: __('Category.flag'), operate:'FIND_IN_SET', formatter: Table.api.formatter.label},
                        {field: 'category.image', title: __('Category.image'), formatter: Table.api.formatter.image},
                        {field: 'category.keywords', title: __('Category.keywords')},
                        {field: 'category.description', title: __('Category.description')},
                        {field: 'category.diyname', title: __('Category.diyname')},
                        {field: 'category.createtime', title: __('Category.createtime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
                        {field: 'category.updatetime', title: __('Category.updatetime'), operate:'RANGE', addclass:'datetimerange', formatter: Table.api.formatter.datetime},
                        {field: 'category.weigh', title: __('Category.weigh')},
                        {field: 'category.status', title: __('Category.status'), formatter: Table.api.formatter.status},
                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                  ]
                ]
            });

            // 为表格绑定事件
            Table.api.bindevent(table);
      },
      add: function () {
            Controller.api.bindevent();
      },
      edit: function () {
            Controller.api.bindevent();
      },
      api: {
            bindevent: function () {
                Form.api.bindevent($("form"));
            }
      }
    };
    return Controller;
});



页: [1]
查看完整版本: FastAdmin基类控制器简介