Laravel-admin 的控件互动

FieldInteraction

项目来由

  • laravel是一个很好的框架,使用起来很方便。而其中的laravel-admin更是方便我们对一个完整的Web平台搭建。然后laravel-admin有个蛋疼之处,就是laravel-admin各个Field之间没有互动的功能,或者说是没有互动的接口。这让我想实现一些控件间互动的逻辑的时候,都非得重新自定义一个控件组,让几个控件组合成一个新的控件来实现。

  • 我写了一个FieldInteraction提供一个接口,用于注入javascript,使得各个Field之间有互动的可能。

    演示 gif (如果没反应,请点击观看)

    FieldInteraction
    动画看不到点这里

    演示的源码

    演示源码

    项目地址

    Github

    安装

  • composer require zuweie/field-interaction

  • 在laravel中的 config/app 的provider加入 Field\Interaction\InteractionServiceProvider 如下:

    'providers' => [
      //...
      App\Providers\AppServiceProvider::class,
      App\Providers\AuthServiceProvider::class,
      App\Providers\EventServiceProvider::class,
      App\Providers\RouteServiceProvider::class,
      //...
      Field\Interaction\InteractionServiceProvider::class,
    ]
  • 执行以下命令:

    php artisan vendor:publish --provider="Field\Interaction\InteractionServiceProvider"

    使用

  • 在app/Admin/bootstrap.php中注册 scriptinjecter

    //.... 一些你自己的代码 ....
    // 这个是例子,和本项目无关
    Encore\Admin\Form::forget(['map', 'dev']); 
    //.... 一些你自己的代码 ....
    
    // 注册scriptinjecter,稍后使用。
    Encore\Admin\Form::extend('scriptinjecter', Field\Interaction\ScriptInjecter::class);
    
  • 这里以Admin中生成的UserController为例子(关于Admin的controller生成,请参考laravel-admin的文档),在UserController中引入以下两个Trait。

    use Field\Interaction\FieldTriggerTrait;
    use Field\Interaction\FieldSubscriberTrait;
    
    class UserController extends Controller 
    {
      use FieldTriggerTrait, FieldSubscriberTrait, ......;
      .....
      ....
      ....
    • 在Form的函数中:

      // UserController 中的 form 函数。
      protected function form(){
      $form = new Form(new User());
      ... 
      ...
      // 一些控件的定义
      ...
      ...
      
      // 在定义完控件后。。。
      // 弄一个触发事件的Script对象。
      $triggerScript = $this->createTriggerScript($form);
      
      // 弄-个接收并处理事件的Script对象。
      $subscribeScript = $this->createSubscriberScript($form, function($builder){
         // 添加事件响应函数
         $builder->subscribe('column_listen_to', 'event_will_triggered', function($event){
      
         // 这里填写处理事件的javascript脚本,注意:一定要返回一个完整的 javascript function ,否则报错!!!!
             return <<< EOT
      
             // function中的参数data,是事件自带数据,方便做逻辑处理!data会因为事件不同而类型不同,具体可以在chrome中的console中查看。
             function(data){
                console.log ('catch an event -> {$event}');
                // 某个控件对于某个事件做出处理, 
      
                $('xxx').doSomething();
                //.... 事件处理 ....
             }
      
      EOT;
         });
      });
      
      // 最后把 $triggerScript 和 $subscribeScript 注入到Form中去。
      $form->scriptinjecter('name_no_care', $triggerScript, $subscribeScript);
      }

说明

  • $createTriggerScript 返回一个针对原来laravel-admin已有的控件的事件触发脚本。但是很遗憾有一些控件,我是怎么也找不到他们的触发事件,以下给出laravel-admin中的支持触发事件的控件,以及他们的触发的事件
控件类 能否触发 触发事件 说明
Text input / change -
Select select / unselect -
Radio checked -
checkbox checked / unchecked -
Textarea input / change -
Url input / change -
Color changeColor -
Email input / change -
Mobile input / change -
File change / fileclear -
Image change / fileclear -
Date - -
Number - -
Currency change / input -
SwitchField switchchange -
Tags select / unselect -
Icon - -
MultipleFile change / fileclear -
MultipleImage change / fileclear -
ListBox - -
Rate change / input -
Password - -
Datetime - -
Time - -
Year - -
Month - -
DateRange - -
DateTimeRange - -
TimeRange - -
  • createSubscriberScript 接收事件并处理事件:
    TriggerScript 是为了控件能触发事件,那么 SubscriberScript 就是为了监听和处理事件。监听和处理事件需要在createSubscriberScript函数中的$builder对象添加。下面简要说明如何在$builder添加监听和处理。
    • $builder->subscribe(arg1, arg2, func);
    • arg1 : 需要关注的控件的名称。
    • arg2 : 需要监听的事件,每个控件有一个或者以上的事件,具体查看TriggerScript给出的表格。
    • func : 事件监听后的函数,必须返回一个完整的javascript的function,否则会出现语法错误。

后记

  • 由于时间关系,本项目只在chrome浏览器上做过测试,请慎用~~~~
本作品采用《CC 协议》,转载必须注明作者和本文链接
zuweie
本帖由系统于 5年前 自动加精
zuweie
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 7
zuweie

不知道有没有没人像我一样无聊

5年前 评论

这个略叼啊,收藏了

5年前 评论

很需要啊,控件间不能联动实在是不方便。看下能否用得上。

5年前 评论

昨天刚刚写了个类似的功能 :see_no_evil:

4年前 评论

请问在hasMany函数里的怎么控件互动,尝试了没有用。

4年前 评论
zuweie

hasMany 函数是啥?我查一下,没留意这个函数

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!