[原创] OneThink模型管理详解-10分钟创建一个团队管理后台

本文为原创,根据自己在使用onethink创建web应用时的真实经历撰写而成。请支持本人版权,转载时注明出处。仅为经验分享,不代表权威,不完善不准确之处欢迎纠正,有任何问题可对本文留言。

1.1.1  Onethink模型管理是什么?如何工作的?如何调试?

  • Onethink可以让你图形化的创建新模型,创建对应的SQL表,并且记录模型的所有属性,于是可以在【模型管理】中查看-编辑模型属性-字 段,以及查看该模型的所有数据。Onethink通过ThinkController以及ModelModel来实现对这些模型的管理-编辑-新增-删除 -数据展示-数据删除-数据新增等功能。

  • 更为重要的是,你也可以在Admin下调用这些现成的功能。比如说你的系统肯定要为客户提供一个管理员后台界面,里面要对某些业务表的数据进行展 示-编辑-新增-删除。你可以让你的Controller继承ThinkController,view复制Think目录下的内容,无需Model,功 能就做好了。(后面会提供一个例子来说明)

  • 需要注意的是,Onethink的模型管理不会为你创建Controller/Model/View这些文件,你可以手动创建需要的东西来完全控制你的模型。

  • Onethink模型管理的原理就是,你通过模型管理界面创建了模型,Onethink会把模型相关的信息存储在onethink_model以 及onethink_attribute 中。通过ModelModel获取该模型的各种属性和配置,通过ThinkController完成对该模型的展示-新增-删除-更新控制。各种操作的表 单提交使用Jquery的Ajax,在js中有各种实现。操作结果的提示通过AjaxReturn显示在Admin顶部的一个hidden div中,1500毫秒后消失。即便是$this->success/error也是这样。因此跟Home下各种提示会跳到一个新页面是不同的。

  • 非常需要注意的是,trace和dump会影响Ajax对response的解析,你会发现某些提交死在那里,打开Firebug-网络 -Post-响应,会看到parser XXXX错误提示,就是这个原因。关闭调试模式,去除trace和dump会让一切回归正常。那如何调试?

    • 你可以把需要跟踪的变量记录到log中,\Think\Log::record(‘Team->del: ‘.$var,’DEBUG’);,打开\Runtime\Logs\Admin今天的log文件,最下面就是最近的log信息。

    • 你也可以通过$this->error/success输出调试信息。对于array类型的变量你可以 ob_start();var_dump($variables); $data = ob_get_clean(); $data即为array详细信息字符串(用了ob操作让var_dump的结果返回到$data而不是客户端)

    • 你还可以$return[‘status’] = 0; $return[‘info’]   = ‘mydebug: ‘.$var; $this->ajaxReturn($return);

    • 注意第二种第三种方法都会影响逻辑的继续执行,一般用在分步骤快速调试。

1.1.2  如何用Onethink模型管理快速创建新模型-实战案例-包括分析

  • 系统-模型管理-新增:创建一个新模型,可以是基于原有文档模型,也可以是新的独立模型。如果模型有标题-内容-封面图-评论-浏览数等属性,就 最好基于文档模型,添加自己特殊的字段,复用原来的字段,多余的基础字段不用就是了,虽然浪费了一些存储,但可以reuse框架关于文档模型的很多功能。

  • 如何新增一个独立模型?

    • 【字段管理】-新增,【字段名】就是SQL数据表的字段名-英文,【字段标题】是字段在Onethink框架里显示的名称-中文,【字段类型】根 据需要选择,【字段定义】一般为空,也可以count或sum,枚举/多选字段的可选项在【参数】中设置,0:选项1(换行)1:选项2…以此类推,分隔 符是英文的冒号。【字段备注】会显示在表单该字段上。

    • 【表单显示分组】是指在编辑或新增该模型数据的界面中可以分成几个tab来显示各个字段。比如你新建的是一个存储配置的模型,可以分成基础配置, 高级配置,系统配置三个界面分别显示不同level的字段。1:基础配置,2:高级配置,3:系统配置,分隔符是英文的冒号和逗号。

    • 【表单显示排序】用来规划各个字段在新增/编辑界面中的显示顺序,以及分组(如果配置了刚才的分组)。字段创建的顺序无法修改,在【字段管理】中能看到,但是显示的顺序你可以调整。

    • 【列表定义】是指onethink如何显示该模型的每个字段的数据,可以原样显示,可以获取数据后调用函数显示返回结果,还可以添加edit/del这些操作链接。具体请看onethink自身的document模型的配置,或者下面的实例。

    • 在【高级】页面中还有各种操作的模板定义,用来告诉Onethink在模型管理中如果点开了该模型的展示-编辑-新增界面,该如何显示。

    • 以上所有信息都会存储在onethink_attribute中,由onethink统一管理,于是onethink可以图形化的提供对于该模型的各种功能。

    • 对应的MySQL数据表已经创建,暂时没有数据。

    • 没有生成对应的Controller/Model/View,onethink通过ThinkController以及ModelModel以及Think/View来完成该模型的各种操作。

    • 系统-模型管理-新增:【模型标识】就是数据表的名字-英文,【模型名称】就是显示在模型管理中的名称-中文,引擎选MyISAM,主键yes, 确定后,该模型信息会存储在onethink_model中,由onethink统一管理。此时模型对应的MySQL数据表还没有建立,因为还没创建字 段。

    • 选该模型最右边的【编辑】,进入【设计】页,

    • 来看一个例子,新建了一个team模型,存储团队成员信息,包括成员名称,成员昵称

    • 1 2

    • 3

  • 新增模型数据

    • 模型管理-该模型右侧-数据

    • 当前是空的,没有数据,但是所有的列都展示出来了,此时onethink就是根据你当时创建该模型时定义的各种字段及其属性,以及【列表定义】的配置,完成数据的展示。

    • 新增,出现新增页面,此时Onethink就是根据你当时创建该模型时定义的【表单显示分组】【表单显示顺序】,完成该表单的展示。填好数据,点 确定,此时Onethink通过Ajax提交给【s=/Think/add/model/7.html】完成数据新增操作(7是该模型的编号,在模型管理 中可以看到),操作完成后通过Ajax Response返回结果提示,js的updateAlert会获取提示信息,显示在之前隐藏的top_alert div中。查看网页源代码搜索top_alert你可以看到这个隐藏的div id=”top-alert”。这个div是在\Admin\View\Public\base.html中定义的,Admin下的所有 view/*.html都是extend这个基础模板。因此如果你遇到提示出不来,但是response又确实解析正确,可以看看是不是没有extend 基础模板。

    • 新增的bug:如果你在新增页面点击‘返回’,应该是不起作用。(我用的1版本是这样的)打开Admin\View\Think \add.html找到<a class=”btn btn-return” href=”javascript:;”>返 回</a>,可以看到href是空的js,修改为
      <a class=”btn btn-return” href=”javascript:history.back(-1);”>返 回</a> 就ok了。

  • 为该模型定制一个管理TAB

    • 到目前为止,我们通过Onethink的模型管理轻松的创建了一个新的Model,添加了数据,通过模型管理可以很容易的维护它。Very good。但是我们不会为客户提供这个管理界面不是么?所以要定制一个管理TAB,未来放到为客户定制的管理页面中,接下来的实战中你会深入理解如何重用 Onethink的代码加速你的开发。Onethink不仅为你提供了一个框架,可以图形化的轻松操作一切,还为你提供了很多模块可以重用,因为它既然可 以做到,你就可以resue它为你服务。

    • 系统-菜单管理-新增:标题-团队,排序-0,链接-Team/Index,上级菜单-顶级菜单,说明-团队成员配置

    • 4

    • 于是,管理页面顶部,最左边,多了一个【团队】TAB。它会调用Team/Index,但是现在它还不能工作,因为没有对应的Controller

    • Application\Admin\Controller新建TeamController.class.php,它要继承ThinkController,代码少得难以想象。

<?php

// +———————————————————————-

// | OneThink [ WE CAN DO IT JUST THINK IT ]

// +———————————————————————-

// | Copyright (c) 2015 http://www.cleanbing.cn All rights reserved.

// +———————————————————————-

// | Author: 原子力量 <http://www.cleanbing.cn>

// +———————————————————————-

 

namespace Admin\Controller;

 

/**

* 团队成员控制器

* @author 原子力量 <http://www.cleanbing.cn>

*/

class TeamController extends ThinkController {/*注意是继承ThinkController而不是AdminController*/

private $model_name = ‘team'; /*在OneThink模型管理中查看自己模型标识(不是名称)修改此处*/

 

/**

* 团队成员管理首页

* @author 原子力量 <http://www.cleanbing.cn>

*/

public function index(){

$this->lists(); /*系统会调用View/Team/index.html来显示*/

}

 

public function lists( $model = null ){

parent::lists( $this->model_name ); /*系统会调用View/Team/list.html来显示*/

}

 

public function add( $model = null ){

$model = M(‘Model’)->getByName( $this->model_name ); /*通过Model名称获取Model完整信息*/

parent::add( $model[‘id’] ); /*系统会调用View/Team/add.html来显示*/

}

 

public function edit( $model = null, $id = 0 ){

$id || $this->error(‘请选择要编辑的用户!’);

$model = M(‘Model’)->getByName( $this->model_name ); /*通过Model名称获取Model完整信息*/

parent::edit( $model[‘id’], $id ); /*系统会调用View/Team/edit.html来显示*/

}

public function del( $model = null, $ids=null ){

$model = M(‘Model’)->getByName( $this->model_name ); /*通过Model名称获取Model完整信息*/

parent::del( $model[‘id’], $ids ); /*没有页面,只有Ajax提示返回,不需要View/Team/del.html*/

}

}

  • 正如你看到的,核心操作都是调用的parent即ThinkController的代码。Thinkcontroller会通过 ModelModel访问onethink_model和onethink_attribute表,那里面存储了所有被管理的模型-字段-配置信息,接着 会访问你的模型对应的数据表获取数据,然后按照你的view进行展示。

  • 通常我们最头疼的是不同模型有不同的字段,各种字段包括图片,日期,枚举,多选项都要不同展示和编辑,真的很麻烦,各种操作界面的html为了这 些字段不得不花很多时间去定制。接下来的事情可能会让你大跌眼镜。创建目录Application\Admin\View\Team并拷贝 \Application\Admin\View\Think的html,edit.html,lists.html,是的,是拷贝。不需要任何改动。然 后再创建一个index.html,oh,它只有一行内容:<include file=”lists” />

  • ok了,是的,ok了,现在去点左上角的【团队】,模型数据表会展示出来,而且有【新增】【删除】【编辑】,而且它们都可以完美的工作了,支持图片字段,附件字段,日期字段。。。可以新增,删除会有确认提示,所有操作都有结果提示。

  • 本实战案例暂时到此结束。欢迎留下你的任何问题。

  • 5

  • 6

  • 7

  • 8

我的站点及原文:http://www.cleanbing.cn/onethink_model_manage/
我在tower上基于Onethink的更多开源开发,欢迎你的加入!


你可能感兴趣的:(PHP,框架,thinkphp,教程,onethink)