PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通PHP建站技术分享-从入门到精通

QQ:420220301 微信/手机:150-3210-7690
当前位置:首页 > CMS教程 > Fastadmin

多张表参与的动态下拉实现

管理员 2024-12-14
Fastadmin
8

功能需求
先贴一份功能需求
image.png

在这个功能需求中,我们在taskRegister的表单中,想通过动态下拉显示user表的用户,但是显示的用户又受task表限制。

这种需求在日常也经常碰到,如果限制字段刚好在user表,那么可以很容易的通过传递限制其他字段的方法实现,这种情况这里不讨论。

本需求的前提是字段的显示限制存在第三个表中,同时不使用重写selectpage的方法去实现。
本需求的目的是为了在第一个表中显示符合第三个表限制的第二个表的name字段
不考虑第三个表情况下的实现

    <div class="form-group">        <label class="control-label col-xs-12 col-sm-2">{:__('Task_id')}:</label>        <div class="col-xs-12 col-sm-8">            <input id="c-task_id" data-rule="required" data-source="task/index" class="form-control selectpage" name="row[task_id]" type="text" value="">        </div>    </div>    <div class="form-group">        <label class="control-label col-xs-12 col-sm-2">{:__('User_ids')}:</label>        <div class="col-xs-12 col-sm-8">            <input id="c-user_ids" data-rule="required" data-source="user/index" data-multiple="true" class="form-control selectpage" name="row[user_ids]" type="text" value="">        </div>    </div>

在js中实现把第一个输入框的输入作为第二个框额条件

        add: function () {            //这里实现当输入框1改变时,清空输入框2的选项            $("#c-task_id").on("change",function () {                $("#c-user_ids").selectPageClear();            });            //这里实现把输入框1的值作为输入框2的参数传递给后端            $("#c-user_ids").data("params", function(){                return {"custom[id]":$("#c-task_id").val()};            });            Controller.api.bindevent();        },

后端的实现,先提供一下一般的实现

    protected function selectpage_重写()    {        //设置过滤方法        $this->request->filter(['strip_tags', 'htmlspecialchars']);                ......                //自定义搜索条件        $custom = (array)$this->request->request("custom/a");                //增加的代码        $task = appadminmodelTask::get($custom['id']);        $custom['id']=['in', $task->users_ids];                ......                return json(['list' => $list, 'total' => $total]);    }

以上方法能实现实现想要的功能,但是,这个重写的方法和原来的方法相似度很高,并且代码函数很多(按行数找老板算钱吧)

有没有更好的办法实现这个功能呢?我们可以采用TP的方法,对请求变量进行修改,从而实现对原有selectpage方法的复用,又能实现相应的功能
TP5.0请求-更改变量
我们在User控制器中新增一个方法,并把html中输入框2的源地址修改为这个方法
实现

    public function taskuser()    {        $custom=(array)$this->request->param('custom/a');        $task = appadminmodelTask::get($custom['id']);        $custom['id']=['in', $task->user_ids];        Request::instance()->request(['custom' => $custom]);       return $this->selectpage();    }

这里通过这个方法查询出数据限制字段,并把页面的动态下拉请求进行修改,再转发给原来的动态下拉方法进行处理。

这个请求修改的方法也可以用来实现很多类似的功能。例如实现插件等,不需要修改原有数据表的情况下,通过第三个表实现对第二个表的访问限制。


希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, Fastadmin, ClassCMS, LeCMS, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。

相关推荐

扫码关注

qrcode

QQ交谈

回顶部