fastadmin相关知识

  1. 字段禁用搜索
//设置operate为false
{field: 'site_name', title: __('Site_id'),operate:false},
  1. 绑定事件
            {
                field: 'status',
                    title: __('Status'),
                align: 'center',
                searchList:{"1":"启用","0":"禁用"},
                formatter: Controller.api.formatter.custom
            },                  
//formatter: Controller.api.formatter.custom在api下面的formatter中添加custom匿名方法,此处我加的是按钮切换禁用和使用的事件

            formatter: {
                custom: function (value, row, index) {
                    var status = 0;
                    if(value==0){
                        status= 1;
                    }
                    //添加上btn-change可以自定义请求的URL进行数据处理
                    return '<a class="btn-change text-success" data-url="tiku/question_paper_category/multi" data-id="' + row.id + '" data-params="'+ this.field + '=' + status + '" ><i class="fa ' + (value == 0 ? 'fa-toggle-on fa-flip-horizontal text-gray' : 'fa-toggle-on') + ' fa-2x"></i></a>';
                },
            }
  1. 自定义表单实现


//add.html
<div class="col-xs-12 col-sm-8">
            <dl class="fieldlist" data-template="eventtpl" data-name="row[description]">
                <dd>
                    <ins>{:__('类型')}</ins>
                    <ins>{:__('题数')}</ins>
                    <ins>{:__('每题分数')}</ins>
                </dd>
                <dd><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
                <!--请注意 dd和textarea间不能存在其它任何元素,实际开发中textarea应该添加个hidden进行隐藏-->
                <textarea name="row[description]" required class="form-control hide" cols="30" rows="5"></textarea>
            </dl>
            <script id="eventtpl" type="text/html">
                <dd class="form-inline">
                    <ins><input type="text" name="<%=name%>[<%=index%>][id]" class="form-control selectpage" data-source="tiku/question_paper_category/selectpageUpdate" data-field="name" value="<%=row.id%>" placeholder="类型" size="10"/></ins>
                    <ins><input type="text" name="<%=name%>[<%=index%>][number]" class="form-control" value="<%=row.number%>" placeholder="题数"/></ins>
                    <ins><input type="text" name="<%=name%>[<%=index%>][score]" class="form-control" value="<%=row.score%>" placeholder="每题分数"/></ins>
                    <!--下面的两个按钮务必保留-->
                    <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
                    <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
                </dd>
            </script>
        </div>
//edit.html 中只需要把add保存的没处理的结果放到textarea文本域中就行
 <textarea name="row[description]" required class="form-control hide" cols="30" rows="5">{$row['description']}</textarea>
//js实现
 add: function () {
            Controller.api.bindevent();
        },
        edit: function () {
            Controller.api.bindevent();
        },
        api: {
            bindevent: function () {
                Form.api.bindevent($("form[role=form]"));
                $(document).on("fa.event.appendfieldlist", "#add-form .btn-append,#edit-form .btn-append", function (e, obj) {
                    Form.events.selectpage(obj);
                });

        }
}
#php 对应函数
/**
     * 下拉搜索
     */
    public function selectpageUpdate()
    {
        $searchValue = $this->request->post('searchValue');
        $result = array();
        if ($searchValue) {//编辑页面
            $name = $this->listType[$searchValue];
            $result[] = ['id'=>$searchValue,'name'=>$name];
            $count = 1;
        }else{ //点击显示
            $pageSize = $this->request->post('pageSize');
            $pageNumber = $this->request->post('pageNumber');
            $offset = ($pageNumber-1)*$pageSize;
            $lists = array_slice($this->listType,$offset,$pageSize);//提取指定数量
            //获取所有的元素
            foreach ($lists as $k=>$v) {
                $result[$k]['id'] = $k+$offset;
                $result[$k]['name'] = $v;
                $result[$k]['pid'] = 0;
            }
            $count = count($this->listType);
        }

        return json(['list' => $result, 'total' => $count]);
    }
  1. 多级联动


//edit.html 添加页面把if语句去掉就行了
<div class="form-group">
        <label class="control-label col-xs-12 col-sm-2">{:__('Qc_id')}:</label>
        <div class="col-xs-12 col-sm-8">
            <div class="form-inline" data-toggle="cxselect" data-selects="first,second,third">
                <select required class="first form-control" name="row[first]" data-url="tiku/question_paper_category/get_course?pid=0">
                    {if condition="isset($pdata[0])"}
                    <option value="{$pdata[0]['id']}" selected="">{$pdata[0]['name']}</option>
                    {/if}
                </select>
                <select required class="second form-control" name="row[second]" data-url="tiku/question_paper_category/get_course" data-query-name="pid">
                    {if condition="isset($pdata[1])"}
                    <option value="{$pdata[1]['id']}" selected="">{$pdata[1]['name']}</option>
                    {/if}
                </select>
                <select class="third form-control" name="row[third]" data-url="tiku/question_paper_category/get_course" data-query-name="pid">
                    {if condition="isset($pdata[2])"}
                    <option value="{$pdata[2]['id']}" selected="">{$pdata[2]['name']}</option>
                    {/if}
                </select>
            </div>
        </div>
    </div>
##接口返回数据如下
  1. 下拉框添加搜索功能
#加上下面两条树形
class="selectpicker"
data-live-search="true"
  1. 添加新的表格页面,需要初始化,不然即便获取到数据也显示“没有找到匹配的内容”
Table.api.init({
      extend: {
            index_url: 'tiku/question_special/get_material'+decodeURI(location.search),
            table: 'question_special',
      }
});
  1. 普通搜索框中如何使用select框
//js代买
{field: 'site_type', title: __('site_type'),searchList: $.getJSON("tiku/question/get_site_type")},
//$.getJSON("tiku/question/get_site_type")}返回值未json对象形势,而不是json数组,当然也可以直接是json对象,不需要ajax
//{0: "教师招聘", 1: "教师资格"}

如果想在url地址上面有参数,还想要select有选中状态,name必须保证select的name值和

注意:site_type一定要和数据库中的字段、select字段一样,不然的话不会默认选中,当然选中了也不会自己在where中,因为list($where, $sort, $order, $offset, $limit) = $this->buildparams();$where条件调用的参数和url中的不是一个,所以导致的,我是自己实现的where,详情见下图:

js

php

效果
  1. 按钮中添加自定义参数
    url 按钮的链接/Ajax事件请求的URL/弹窗链接/选项卡链接,直接function和string类型,此链接会自动在链接后添加ids/{ids},{ids}为当行主键ID,如果需要传递其它字段值,请在URL中使用{字段名}占位即可,
buttons:[
    {
        name: 'look',
        title: __('查看试题'),
        classname: 'btn btn-xs btn-primary btn-addtabs',
        icon: 'fa fa-list',
        url: 'tiku/question/index?code={code}'//使用{code}占位
    },
]
  1. fastadmin 使用Fast.api.open调取弹窗回调问题
//lists.html,调用添加页面,添加完成后刷新
 Fast.api.open(url, __('Add'),{callback:function(data){
    layer.msg('操作成功',{icon: 1,time: 2000},function(){
      window.location.reload();
    });
}});

如果要让Fast.api.open回调生效,需要在打开页面中调用Fast.api.close(data);关闭窗口,并传递回调值,我这里调用的是添加的表单页面,那么直接在对应的添加页面js文件中加入如下即可

Form.api.bindevent($("form[role=form]"), function(data, ret){
     //给表单绑定新的回调函数 接收 控制器 success(msg,url,data)或者error(msg,url,data)
     Fast.api.close(data);//在这里
});

php页面$this->success()就会有返回了

  1. 添加编辑器自动渲染代码
  • 问题:
    对于fastadmin中调用组件都需要Form.api.bindevent($("form[role=form]"));渲染才可显示,那么对于动态加入的组件怎么解决呢,这里以fieldlist组件添加编辑器为例,比较有代表性
  • 解决办法:
    在filedlist组件中添加组件需要渲染,这个在事例中js文件可以看到,放在对应方法的js中如下:
$(document).on("fa.event.appendfieldlist", "#edit-form .btn-append", function (e, obj) {
                Form.events.datetimepicker(obj);//加载时间选择器
                //Form.api.bindevent($("form[role=form]"));这种办法会导致filedlist成倍增加选项
            });

那么我的解决办法是自己在require-form.js中添加一个方法editor,如下:代码就不贴了


就可以使用Form.events.editor(obj);动态加载编辑器了

  1. fastadmin中引入外部js
  • 问题
    fastadmin如果在html页面中引入js会导致页面有些组件不能使用,比如form select会不显示,我再add.html中想引入ace编辑器插件,页面没报错,但是form表单的select加载不出来,然后查百度,说应该需要通过require去引入第三方组件
  • 解决
    public/assets/js/新建一个ace.js
//public/assets/js/ace.js
define(['ace'], function(ace){
    var Obj = {
        name:"ace"
    };
    return Obj;
});

public/assets/js/backend-init.js配置ace插件

//public/assets/js/backend-init.js
define(['backend'], function (Backend) {
  //配置ace插件
    require.config({
        paths: {
            'ace': '../libs/ace/src-noconflict/ace',//这里是ace路径,我引入的src和src-min下面的都不行,然后还是引入src-noconflict下面的ace可以
        }
    });
});
  1. fastadmin 指定一个自定义页面不引用公共模板
//控制器中添加
$this->view->engine->layout(false);
//html页面添加,自己在common下面定义一个nometa.html,里面放入自己定义的即可
<head>
    {include file="common/nometa" /}
</head>

示例,如果没生效,改下html页面的内容,然后刷新下

<!doctype html>
<html lang="en">
<head>
    {include file="common/nometa" /}
</head>
<body>
{$row['html']}
</body>
</html>
  1. 默认导入功能
#index.html页面加入样式
 <a href="javascript:;" class="btn btn-danger btn-import {:$auth->check('tool/promotes/import')?'':'hide'}" title="{:__('Import')}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="fa fa-upload"></i> {:__('Import')}</a>
# js页面index页面的url加入链接
import_url: 'tool/promotes/import',
#控制器中加入方法
public function import(){
    return parent::import();
}

导入规则第一列需要对应数据表中注释【默认】


如果使用字段名称可以修改属性
/**
     * 导入文件首行类型
     * 支持comment/name
     * 表示注释或字段名
     */
    protected $importHeadType = 'comment';
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,185评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,652评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,524评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,339评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,387评论 6 391
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,287评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,130评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,985评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,420评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,617评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,779评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,477评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,088评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,716评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,857评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,876评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,700评论 2 354

推荐阅读更多精彩内容