Laravel-admin Distpicker(省市区联动)filter(筛选)不关闭

$grid->filter(function($filter){
$filter->disableIdFilter();//去掉默认的id过滤器
$filter->distpicker('province_id', 'city_id', 'district_id', trans('factory.select').trans('factory.address'));
});
直接访问url没有问题,从菜单中点击,filter不隐藏,如:

laravel-admin Distpicker(省市区联动)filter(筛选)不关闭

直接访问或者刷新页面是没问题的。我看了一下html,从菜单点击后,标签class少了一个hide属性,如:

laravel-admin Distpicker(省市区联动)filter(筛选)不关闭
正常效果是这样的,

laravel-admin Distpicker(省市区联动)filter(筛选)不关闭
不用省市区联动是没有问题的,求大神改怎么解决

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
Epona

手写js魔改? 我们用的laravel-admin 很多地方都是自己手写js魔改的。。。

4年前 评论

上来先给结论, distpicker 控件的这段代码引起的

GitHub: src/DistpickerFilter # condition() ,64行 ~ 72行

array_filter 过滤空值之后,返回了空数组,脱离了 !isset($value) 这个控制, 接着往下走了。
file

  • 第一种方法, grid 里面关灯闭眼 >_< ,哦豁 ~ 可以了 ,但这样会不会被打一顿,呃.... 我不敢保证啊

    public function index(Content $content)
    {
        return $content
            ->header(trans('admin.list'))
            ->description(trans('admin.users'))
            ->body($this->_gridTmpInvisible($this->grid(), ['_pjax']));
    }
    
    protected function _gridTmpInvisible($grid, $vars = [])
    {
        /** @var \Illuminate\Support\Facades\Request */
    
        $list = [];
        foreach ($vars as $key)
        {
            $list[$key] =  Request::get($key);
    
            Request::offsetUnset($key);
        }
    
        $html = $grid->render();
    
        foreach ($vars as $key)
        {
            Request::offsetSet($key, $list[$key]);
        }
    
        return $html;
    }
  • 第二种方法,要改这个三方包。可以把源码放到本地(storage/packages/china-distpicker),然后改一点点这里的代码。参见 Composer 扩展开发:本地运行扩展包 ,在 composer 里面选择使用本地文件来安装。

    /**
    * {@inheritdoc}
    */
    public function condition($inputs)
    {
    $value = array_filter([
        $this->column['district'] => Arr::get($inputs, $this->column['district']),
        $this->column['town'] => Arr::get($inputs, $this->column['town']),
        $this->column['village']     => Arr::get($inputs, $this->column['village']),
    ]);
    
    //  偷偷加个判断(为空数组的时候,走这里),至于原来的代码,留着好像也没问题吧....
    if (!isset($value) || empty($value)) {
        return;
    }
    
    //.... 省略 ...
    }

下面是我还原的过程

关于列表页面的过滤器这块,影响默认展开的因素,目前只找到一个 。 GitHub: src/Grid/Filter.php # conditions() ,330行 ~ 334行

从代码看起来,渲染前若检测到有过滤条件,那就是要展开了。
file
具体的条件从 326行的 $conditions[] = $filter->condition($params); 中来

测试了几个栗子,看一下表现
  • 正常:在过滤器已定义的条件列表中
  • 其他:不在过滤器已定义的条件列表中
参数 distpicker 地址 展开(期望,实际) 结果
使用 http://demo.test/admin/auth/users 否,否 O
点击菜单 使用 http://demo.test/admin/auth/users?_pjax=%23pjax-container 否,是 X
正常 使用 http://demo.test/admin/auth/users?id=1 是,是 O
其他 使用 http://demo.test/admin/auth/users?test=123 否,是 X
- http://demo.test/admin/auth/users 否,否 O
点击菜单 - http://demo.test/admin/auth/users?_pjax=%23pjax-container 否,否 O
正常 - http://demo.test/admin/auth/users?id=1 是,是 O
其他 - http://demo.test/admin/auth/users?test=123 否,否 O
所以没有 distpicker 控件时,大家相安无事啊。那就看看 distpicker 怎么弄的了

找了一下,是这里。 ?_pjax=xxx 之类的时候,这里没控制住
file

4年前 评论

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