/Phpcmf/Table用于快速实现数据表的显示、增加、修改、删除等动作,适用于任何数据表的显示和操作。


一、示例说明

例如需要在增加一个资料表,用于录入资料数据,那么可以使用Table类快速实现数据的储存和显示。

image.png


1、下载Demo程序示例


A、入门级别的Demo(推荐)

Table类 入门 Test App.zip


B、进阶级别的Demo

Test.zip


解压之后放到 dayrui/App目录之下,如下图所示

image.png


2、创建数据库,我们示例只做数据标题和数据内容的录入

CREATE TABLE `dr_test` (
  `id` int(11) NOT NULL,
  `title` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `inputtime` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `dr_test`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `dr_test`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;


3、界面预览,admin.php?s=test&c=test,即可看到以下界面:

image.png


这样就可以利用Table类进行增加、删除、修改操作,根本不需要开发者写多余的sql查询语句,Table类已经帮您处理好了。


二、解析Table类源码

1、构造函数初始化方法

public function __construct()
{
    parent::__construct();
    // 表单显示名称
    $this->name = dr_lang('资料数据');
    // 模板前缀(避免混淆)
    $this->tpl_prefix = 'test_';
    // 入库字段,实例中用到两个字段录入
    $field = array(
        'name' => array(
            'ismain' => 1,
            'name' => dr_lang('名称'),
            'fieldname' => 'name',
            'fieldtype' => 'Text',
            'setting' => array(
                'option' => array(
                    'width' => 200,
                ),
                'validate' => array(
                    'required' => 1,
                )
            )
        ),
        'content' => array(
            'ismain' => 1,
            'name' => dr_lang('资料内容'),
            'fieldtype' => 'Ueditor',
            'fieldname' => 'content',
            'setting' => array(
                'option' => array(
                    'mode' => 1,
                    'height' => 300,
                    'width' => '100%'
                ),
                'validate' => array(
                    'required' => 1,
                )
            )
        ),
    );
    // 初始化数据表
    $this->_init([
        'table' => 'test', // 表的名字
        'field' => $field, // 设置入库字段
        'show_field' => 'title', // 表的主字段
        'order_by' => 'id desc', // 列表排序显示方式
    ]);
    \Phpcmf\Service::V()->assign([
        'field' => $field,
        'menu' => \Phpcmf\Service::M('auth')->_admin_menu(
        [
            $this->name => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/index', 'fa fa-tag'],
            '添加' => [APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/add', 'fa fa-plus'],
            '修改' => ['hide:'.APP_DIR.'/'.\Phpcmf\Service::L('Router')->class.'/edit', 'fa fa-edit'],
        ])
    ]);
}


关于初始化数据表的_init方法提供以下参数参考:

table           查询主表

field           可用搜索字段列表
date_field      列表搜索的时间字段,默认inputtime
show_field      显示主字段,用于修改日志
list_field      列表显示字段

order_by        默认排序方式
order_list      默认排序方式(同上一样)
where_list      默认搜索条件,每次列表都执行
join_list       关联查询,格式:['member', 'member.id=admin.uid', 'left']
select_list     列表查询筛选字段


类的联动条件变量:

$this->edit_where = ''; 修改数据时候的条件判断
$this->delete_where = ''; 删除数据时候的条件判断
$this->list_where = ''; 数据列表时候的条件判断


2、数据列表方法

public function index() {
    list($tpl) = $this->_List(); // 完成table自动查询并分页显示动作
    \Phpcmf\Service::V()->display($tpl); // 设定显示模板
}


3、数据增加方法

public function add() {
    list($tpl) = $this->_Post(0); // 0表示新增post数据
    \Phpcmf\Service::V()->display($tpl);// 设定表单模板
}


4、数据修改方法

public function edit() {
    // 传入id到post方法表示修改此id提交的数据
    list($tpl) = $this->_Post(intval(\Phpcmf\Service::L('Input')->get('id')));
    \Phpcmf\Service::V()->display($tpl);
}


5、数据删除方法

public function del() {
    $this->_Del(
        \Phpcmf\Service::L('Input')->get_post_ids(), // 获取批量删除id号
        null, // 删除之前的函数验证
        null, // 删除之后的函数处理
        \Phpcmf\Service::M()->dbprefix($this->init['table']) // 设定删除表名称
    );
}


6、数据存储格式化方法

// 格式化保存数据
protected function _Format_Data($id, $data, $old) {
    if (!$id) {
      // 当提交新数据时,把当前时间插入进去
      $data[1]['inputtime'] = SYS_TIME;
    }
    return $data;
}


7、数据存储验证及判断

protected function _Save($id = 0, $data = [], $old = [], $func = null, $func2 = null) {
    return parent::_Save($id, $data, $old, function($id, $data, $old){
        // 保存之前执行的函数,并返回新的数据
        if (!$id) {
            // 当提交新数据时,把当前时间插入进去
            $data[1]['inputtime'] = SYS_TIME;
        }
        
        return dr_return_data(1, null, $data);
    }, function ($id, $data, $old) {
        // 保存之后执行的动作
    });
}

如果不写此方法的话就不会对数据进行格式化操作,按照提交表单原样储存