FormHandleModule.php 18.1 KB
Newer Older
D
devil 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2019 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\module;

use think\Controller;

/**
 * 动态表格处理
 * @author  Devil
 * @blog    http://gong.gg/
 * @version 1.0.0
 * @date    2020-06-02
 * @desc    description
 */
class FormHandleModule
{
    // 模块对象
    public $module_obj;
    // form 配置数据
    public $form_data;
    // 外部参数
    public $out_params;
    // 条件参数
    public $where_params;
    // 搜索条件
    public $where;

    /**
     * 运行入口
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2020-06-02
     * @desc    description
     * @param   [string]          $module     [模块位置]
     * @param   [mixed]           $params     [参数数据]
     */
    public function Run($module, $params = [])
    {
        // 参数
        $this->out_params = $params;

        // 模块是否存在
        if(!class_exists($module))
        {
            return DataReturn('表格模块未定义['.$module.']', -1);
        }

        // 调用方法
        $action = 'Run';
        $this->module_obj = new $module();
        if(!method_exists($this->module_obj, $action))
        {
            return DataReturn('表格方法未定义['.$module.'->'.$action.'()]', -1);
        }

        // 获取表格配置数据
        $this->form_data = $this->module_obj->$action($this->out_params);
D
devil 已提交
67
        if(empty($this->form_data['base']) || !is_array($this->form_data['base']) || empty($this->form_data['form']) || !is_array($this->form_data['form']))
D
devil 已提交
68 69 70 71 72 73 74 75 76 77 78 79 80
        {
            return DataReturn('表格配置有误['.$module.'][base|form]', -1);
        }

        // 数据唯一主字段
        if(empty($this->form_data['base']['key_field']))
        {
            return DataReturn('表格唯一字段配置有误['.$module.']base->[key_field]', -1);
        }

        // 基础条件
        $this->BaseWhereHandle();

D
devil 已提交
81
        // 表格数据处理
D
devil 已提交
82 83
        $this->FormDataHandle();

D
devil 已提交
84 85 86
        // 基础数据结尾处理
        $this->FormBaseLastHandle();

D
devil 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
        // 数据返回
        $data = [
            'table'     => $this->form_data,
            'where'     => $this->where,
            'params'    => $this->where_params,
        ];
        return DataReturn('success', 0, $data);
    }

    /**
     * 表格数据处理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2020-06-02
     * @desc    description
     */
    public function FormDataHandle()
    {
D
devil 已提交
106
        foreach($this->form_data['form'] as $k=>&$v)
D
devil 已提交
107
        {
D
devil 已提交
108 109
            // 基础处理
            if(!empty($v['view_type']))
D
devil 已提交
110
            {
D
devil 已提交
111
                switch($v['view_type'])
D
devil 已提交
112 113
                {

D
devil 已提交
114 115 116 117 118 119 120 121 122 123 124
                    // 状态操作
                    // 复选框
                    // 单选框
                    case 'status' :
                    case 'checkbox' :
                    case 'radio' :
                        // 未指定唯一字段名称则使用基础中的唯一字段
                        if(empty($v['key_field']))
                        {
                            $v['key_field'] = $this->form_data['base']['key_field'];
                        }
D
devil 已提交
125

D
devil 已提交
126 127 128 129 130
                        // 复选框
                        if($v['view_type'] == 'checkbox')
                        {
                            // 选择/未选中文本
                            if(empty($v['checked_text']))
D
devil 已提交
131
                            {
D
devil 已提交
132
                                $v['checked_text'] = '反选';
D
devil 已提交
133
                            }
D
devil 已提交
134
                            if(empty($v['not_checked_text']))
D
devil 已提交
135
                            {
D
devil 已提交
136
                                $v['not_checked_text'] = '全选';
D
devil 已提交
137 138
                            }

D
devil 已提交
139 140
                            // 是否选中 默认否
                            $v['is_checked'] = isset($v['is_checked']) ? intval($v['is_checked']) : 0;
D
devil 已提交
141

D
devil 已提交
142 143
                            // view key 默认 form_ids_checkbox
                            if(empty($v['view_key']))
D
devil 已提交
144
                            {
D
devil 已提交
145
                                $v['view_key'] = 'form_checkbox_value';
D
devil 已提交
146
                            }
D
devil 已提交
147
                        }
D
devil 已提交
148

D
devil 已提交
149 150 151 152 153
                        // 单选框
                        if($v['view_type'] == 'radio')
                        {
                            // 单选标题
                            if(empty($v['label']))
D
devil 已提交
154
                            {
D
devil 已提交
155
                                $v['label'] = '单选';
D
devil 已提交
156 157
                            }

D
devil 已提交
158 159
                            // view key 默认 form_ids_radio
                            if(empty($v['view_key']))
D
devil 已提交
160
                            {
D
devil 已提交
161
                                $v['view_key'] = 'form_radio_value';
D
devil 已提交
162
                            }
D
devil 已提交
163 164 165 166
                        }
                        break;
                }
            }
D
devil 已提交
167

D
devil 已提交
168
            // 条件处理
D
devil 已提交
169
            if(!empty($v['search_config']) && !empty($v['search_config']['form_type']))
D
devil 已提交
170
            {
D
devil 已提交
171 172
                // 搜索 key 未指定则使用显示数据的字段名称
                if(empty($v['search_config']['form_name']))
D
devil 已提交
173
                {
D
devil 已提交
174
                    $v['search_config']['form_name'] = isset($v['view_key']) ? $v['view_key'] : '';
D
devil 已提交
175
                }
D
devil 已提交
176

D
devil 已提交
177 178
                // 基础数据处理
                if(!empty($v['search_config']['form_name']))
D
devil 已提交
179
                {
D
devil 已提交
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
                    // 显示名称
                    $label = empty($v['label']) ? '' : $v['label'];

                    // 唯一 formkey
                    $form_key = 'fp'.$k;
                    $v['form_key'] = $form_key;

                    // 根据组件类型处理
                    switch($v['search_config']['form_type'])
                    {
                        // 单个输入
                        case 'input' :
                            // 提示信息处理
                            if(empty($v['search_config']['placeholder']))
                            {
                                $v['search_config']['placeholder'] = '请输入'.$label;
                            }
                            break;
D
devil 已提交
198

D
devil 已提交
199 200 201 202 203 204 205
                        // 选择
                        case 'select' :
                            // 提示信息处理
                            if(empty($v['search_config']['placeholder']))
                            {
                                $v['search_config']['placeholder'] = '请选择'.$label;
                            }
D
devil 已提交
206

D
devil 已提交
207 208 209 210 211 212
                            // 选择数据 key=>name
                            if(empty($v['search_config']['data_key']))
                            {
                                $v['search_config']['data_key'] = 'id';
                            }
                            if(empty($v['search_config']['data_name']))
D
devil 已提交
213
                            {
D
devil 已提交
214
                                $v['search_config']['data_key'] = 'name';
D
devil 已提交
215
                            }
D
devil 已提交
216
                            break;
D
devil 已提交
217

D
devil 已提交
218 219 220 221 222 223 224 225 226 227 228 229
                        // 区间
                        case 'section' :
                            // 提示信息处理
                            if(empty($v['search_config']['placeholder_min']))
                            {
                                $v['search_config']['placeholder_min'] = '最小值';
                            }
                            if(empty($v['search_config']['placeholder_max']))
                            {
                                $v['search_config']['placeholder_max'] = '最大值';
                            }
                            break;
D
devil 已提交
230

D
devil 已提交
231 232 233 234 235 236 237 238 239
                        // 时间
                        case 'datetime' :
                        case 'date' :
                            // 提示信息处理
                            if(empty($v['search_config']['placeholder_start']))
                            {
                                $v['search_config']['placeholder_start'] = '开始';
                            }
                            if(empty($v['search_config']['placeholder_end']))
D
devil 已提交
240
                            {
D
devil 已提交
241
                                $v['search_config']['placeholder_end'] = '结束';
D
devil 已提交
242
                            }
D
devil 已提交
243 244 245 246 247 248 249 250
                            break;
                    }

                    // 搜索条件数据处理
                    // 表单字段名称
                    $name = $v['search_config']['form_name'];
                    // 条件类型
                    $type = isset($v['search_config']['where_type']) ? $v['search_config']['where_type'] : $v['search_config']['form_type'];
D
devil 已提交
251 252
                    // 是否自定义条件类型
                    $type_custom = isset($v['search_config']['where_type_custom']) ? $v['search_config']['where_type_custom'] : $type;
D
devil 已提交
253
                    // 是否自定义条件处理方法
D
devil 已提交
254 255
                    $handle_custom = isset($v['search_config']['where_handle_custom']) ? $v['search_config']['where_handle_custom'] : '';

D
devil 已提交
256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
                    // 根据条件类型处理
                    switch($type)
                    {
                        // 单个值
                        case '=' :
                        case '<' :
                        case '>' :
                        case '<=' :
                        case '>=' :
                        case 'like' :
                            if(array_key_exists($form_key, $this->out_params) && $this->out_params[$form_key] !== null && $this->out_params[$form_key] !== '')
                            {
                                // 参数值
                                $value = urldecode($this->out_params[$form_key]);
                                $this->where_params[$form_key] = $value;
D
devil 已提交
271

D
devil 已提交
272
                                // 条件值处理
D
devil 已提交
273
                                $value = $this->WhereValueHandle($value, $handle_custom);
D
devil 已提交
274

D
devil 已提交
275
                                // 是否 like 条件
D
devil 已提交
276
                                if($type == 'like' && is_string($value))
D
devil 已提交
277 278 279
                                {
                                    $value = '%'.$value.'%';
                                }
D
devil 已提交
280

D
devil 已提交
281
                                // 条件
D
devil 已提交
282
                                $this->where[] = [$name, $type_custom, $value];
D
devil 已提交
283 284
                            }
                            break;
D
devil 已提交
285

D
devil 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298
                        // in
                        case 'in' :
                            if(array_key_exists($form_key, $this->out_params) && $this->out_params[$form_key] !== null && $this->out_params[$form_key] !== '')
                            {
                                // 参数值
                                $value = urldecode($this->out_params[$form_key]);
                                if(!is_array($value))
                                {
                                    $value = explode(',', $value);
                                }
                                $this->where_params[$form_key] = $value;

                                // 条件
D
devil 已提交
299
                                $this->where[] = [$name, $type_custom, $this->WhereValueHandle($value, $handle_custom)];
D
devil 已提交
300 301
                            }
                            break;
D
devil 已提交
302

D
devil 已提交
303 304 305 306 307 308 309 310 311
                        // 区间值
                        case 'section' :
                            $key_min = $form_key.'_min';
                            $key_max = $form_key.'_max';
                            if(array_key_exists($key_min, $this->out_params) && $this->out_params[$key_min] !== null && $this->out_params[$key_min] !== '')
                            {
                                // 参数值
                                $value = urldecode($this->out_params[$key_min]);
                                $this->where_params[$key_min] = $value;
D
devil 已提交
312

D
devil 已提交
313
                                // 条件
D
devil 已提交
314
                                $this->where[] = [$name, '>=', $this->WhereValueHandle($value, $handle_custom, ['is_min'=>1])];
D
devil 已提交
315 316 317 318 319 320
                            }
                            if(array_key_exists($key_max, $this->out_params) && $this->out_params[$key_max] !== null && $this->out_params[$key_max] !== '')
                            {
                                // 参数值
                                $value = urldecode($this->out_params[$key_max]);
                                $this->where_params[$key_max] = $value;
D
devil 已提交
321

D
devil 已提交
322
                                // 条件
D
devil 已提交
323
                                $this->where[] = [$name, '<=', $this->WhereValueHandle($value, $handle_custom, ['is_end'=>1])];
D
devil 已提交
324 325 326 327 328 329 330 331 332 333 334 335 336
                            }
                            break;

                        // 时间
                        case 'datetime' :
                        case 'date' :
                            $key_start = $form_key.'_start';
                            $key_end = $form_key.'_end';
                            if(array_key_exists($key_start, $this->out_params) && $this->out_params[$key_start] !== null && $this->out_params[$key_start] !== '')
                            {
                                // 参数值
                                $value = urldecode($this->out_params[$key_start]);
                                $this->where_params[$key_start] = $value;
D
devil 已提交
337

D
devil 已提交
338
                                // 条件
D
devil 已提交
339
                                $this->where[] = [$name, '>=', $this->WhereValueHandle(strtotime($value), $handle_custom, ['is_start'=>1])];
D
devil 已提交
340 341 342 343 344 345 346 347
                            }
                            if(array_key_exists($key_end, $this->out_params) && $this->out_params[$key_end] !== null && $this->out_params[$key_end] !== '')
                            {
                                // 参数值
                                $value = urldecode($this->out_params[$key_end]);
                                $this->where_params[$key_end] = $value;

                                // 条件
D
devil 已提交
348
                                $this->where[] = [$name, '<=', $this->WhereValueHandle(strtotime($value), $handle_custom, ['is_end'=>1])];
D
devil 已提交
349 350 351 352

                            }
                            break;
                    }
D
devil 已提交
353 354 355 356
                }
            }
        }
    }
D
devil 已提交
357

D
devil 已提交
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
    /**
     * 基础数据结尾处理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2020-06-06
     * @desc    description
     */
    public function FormBaseLastHandle()
    {
        // 异步请求超时时间
        if(empty($this->form_data['base']['timeout']))
        {
            $this->form_data['base']['timeout'] = 30000;
        }
D
devil 已提交
373

D
devil 已提交
374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
        // 是否开启删除
        if(isset($this->form_data['base']['is_delete']) && $this->form_data['base']['is_delete'] == 1)
        {
            // 是否指定选择列字段名称
            // 默认一(第一个复选框)
            // 默认二(第一个单选框)
            if(empty($this->form_data['base']['delete_form']))
            {
                // 所有 form 类型
                $form_type = array_column($this->form_data['form'], 'view_type');
                if(!empty($form_type))
                {
                    // 是否存在复选框
                    if(in_array('checkbox', $form_type))
                    {
                        $index = array_search('checkbox', $form_type);
                        if($index !== false)
                        {
                            $this->form_data['base']['delete_form'] = $this->form_data['form'][$index]['view_key'];
                        }
                    }
D
devil 已提交
395

D
devil 已提交
396 397 398 399 400 401 402 403
                    // 是否存在单选框
                    if(empty($this->form_data['base']['delete_form']) && in_array('radio', $form_type))
                    {
                        $index = array_search('radio', $form_type);
                        if($index !== false)
                        {
                            $this->form_data['base']['delete_form'] = $this->form_data['form'][$index]['view_key'];
                        }
D
devil 已提交
404 405
                    }
                }
D
devil 已提交
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427

                // 未匹配到则默认 ids
                if(empty($this->form_data['base']['delete_form']))
                {
                    $this->form_data['base']['delete_form'] = 'ids';
                }
            }

            // 提交数据的字段名称
            if(empty($this->form_data['base']['delete_key']))
            {
                $this->form_data['base']['delete_key'] = $this->form_data['base']['delete_form'];
            }

            // 确认框信息 标题/描述
            if(empty($this->form_data['base']['confirm_title']))
            {
                $this->form_data['base']['confirm_title'] = '温馨提示';
            }
            if(empty($this->form_data['base']['confirm_msg']))
            {
                $this->form_data['base']['confirm_msg'] = '删除后不可恢复、确认操作吗?';
D
devil 已提交
428 429 430 431 432 433 434 435 436 437 438 439
            }
        }
    }

    /**
     * 条件值处理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2020-06-04
     * @desc    description
     * @param   [mixed]           $value    [条件值]
D
devil 已提交
440
     * @param   [string]          $action   [自定义处理方法名称]
D
devil 已提交
441 442
     * @param   [array]           $params   [输入参数]
     */
D
devil 已提交
443
    function WhereValueHandle($value, $action = '', $params = [])
D
devil 已提交
444 445
    {
        // 模块是否自定义方法处理条件
D
devil 已提交
446
        if(!empty($action) && method_exists($this->module_obj, $action))
D
devil 已提交
447
        {
D
devil 已提交
448
            return $this->module_obj->$action($value, $params);
D
devil 已提交
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
        }

        // 默认直接返回值
        return $value;
    }

    /**
     * 基础条件处理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2020-06-05
     * @desc    description
     */
    function BaseWhereHandle()
    {
        // 是否定义基础条件属性
        if(property_exists($this->module_obj, 'condition_base') && is_array($this->module_obj->condition_base))
        {
            $this->where = $this->module_obj->condition_base;
        }
    }
}
?>