323 Star 2K Fork 534

御宅男工作室 / YZNCMS

 / 详情

我遇到了筛选菜单需要添加一项 全部,但是不能再文章字段里面添加 全部这一项的需求。我实现了一个很不优雅的方法,不过他管用了

已完成
求助问题
创建于  
2019-05-23 23:11
/**
 * 生成分类信息中的筛选菜单
 */
function filters($modelid)
{
    $options = cache('ModelField')[$modelid];
    $data = [];
    foreach ($options as $_k => $_v) {
        if (isset($_v['filtertype']) && $_v['filtertype']) {
            $_v['options'] = parse_attr($_v['options']);
        } else {
            continue;
        }
        $data[$_v['name']] = $_v;
    }

// 保存了顺序
    $_sort_map = [];
    foreach ($data as $name => $rs) {
        $data[$name]['options'] = array_merge(array('0' => '全部'), $data[$name]['options']);
        $_sort_map[$name]       = array_keys($data[$name]['options']);
    }

    $param = paramdecode(input('condition'));
    $catid = input('catid');
    $conditionParam = [];
    foreach ($data as $name => $rs) {
        //判断是否是单选条件
        $ifradio = 'checkbox' == $data[$name]['type'] ? false : true;
        if ($ifradio) {
            //单选选中参数
            if (!empty($param[$name])) {
                $conditionParam[$name]['options'][$param[$name]]['active'] = true;
                $nowParam = $param;
                $nowParam[$name] = '';
                $conditionParam[$name]['options'][$param[$name]]['param'] = paramencode($nowParam);
                unset($nowParam);
            }else{
                // 在没有选中的情况下,选中 全部。由于没用到多选,还没兼顾多选
                $conditionParam[$name]['options']['0']['active'] = true;
                $nowParam = $param;
                $nowParam[$name] = '';
                $conditionParam[$name]['options']['0']['param'] = paramencode($nowParam);
                unset($nowParam);
            }
        } else {
            //多选选中参数
            if (!empty($param[$name])) {
                $paramContent = explode('_', $param[$name]);
                foreach ($paramContent as $k => $v) {
                    $nowParamContent = $paramContent;
                    unset($nowParamContent[$k]);
                    $nowParam = $param;
                    $nowParam[$name] = implode('_', $nowParamContent);
                    $conditionParam[$name]['options'][$v]['active'] = true;
                    $conditionParam[$name]['options'][$v]['param'] = paramencode($nowParam);
                    unset($nowParam);
                    unset($nowParamContent);
                }
                unset($paramContent);
            }
        }
        $conditionParam[$name]['title'] = $rs['title'];
        $conditionParam[$name]['name'] = $rs['name'];
        //未选中 active param title url
        foreach ($data[$name]['options'] as $k => $v) {
            $conditionParam[$name]['options'][$k]['title'] = $v;
            //未选中条件参数生成
            if (!isset($conditionParam[$name]['options'][$k]['active'])) {
                //未选中条件参数生成
                $conditionParam[$name]['options'][$k]['active'] = 0;
                if ($ifradio) {
                    $nowParam = $param;
                    $nowParam[$name] = $k;
                    $conditionParam[$name]['options'][$k]['param'] = paramencode($nowParam);
                } else {
                    $nowParam = $param;
                    $nowParam[$name] = empty($param[$name]) ? $k : $param[$name] . '_' . $k;
                    $conditionParam[$name]['options'][$k]['param'] = paramencode($nowParam);
                }
            }
            $conditionParam[$name]['options'][$k]['url'] = url('cms/index/lists', ['catid' => $catid, 'condition' => $conditionParam[$name]['options'][$k]['param']]);
            // ksort($conditionParam[$name]['options']);
        }

// 这里处理了一下排序的问题。先把 全部 拿出来,保证全部是在最前面的
        $_item = $conditionParam[$name]['options']['0'];
        unset($conditionParam[$name]['options']['0']);
        $conditionParam[$name]['options'] = array_merge(array_flip($_sort_map[$name]), $conditionParam[$name]['options']);
        $conditionParam[$name]['options']['0']=$_item;
    }
    return $conditionParam;
}

可能有的时候我们并不需要全部。我们可以判断全部的时候不显示这一项,需要的时候就直接循环出就好了

                {volist name=":filters($modelid)" id="vo"}
                    {if $vo.title == '楼盘'}
                        {volist name="$vo.options" id="vs"}
                            {if $vs.title != '全部'}
                                <a target="_self" href="{$vs.url}" {if $vs.active}class="on"{/if}>{$vs.title}</a>
                            {/if}
                        {/volist}
                    {/if}
                {/volist}

评论 (1)

郭大鹏 创建了任务
郭大鹏 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(2)
555541 ken678 admin 1578927533 127003 guodapeng 1578918754
PHP
1
https://gitee.com/ken678/YZNCMS.git
git@gitee.com:ken678/YZNCMS.git
ken678
YZNCMS
YZNCMS

搜索帮助