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

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

在线命令插件添加生成文件预览功能

管理员 2024-12-14
Fastadmin
7
前言:这功能有啥用?这个功能主要是的使用场景是:开发的途中修改了数据库表的字段,原来的控制器和模型文件不能覆盖,使用预览功能可以非常方便的复制代码

实现效果:1.命令行模式 crud命令添加 --onlyview=true 参数,设置此参数后生成的文件会保存在 /runtime/crud/ 文件夹下,避免覆盖原有文件

2.在线命令界面添加 生成预览文件按钮, 生成的crud文件可以在线预览, 效果如下

image.png

image.png

1.为 CRUD命令添加 --onlyview=true 参数

打开 application/admin/command/Crud.php文件 添加

    //添加这个属性    protected $onlyView = false;        //configure函数添加 ->addOption('onlyview', null, Option::VALUE_OPTIONAL, 'only view mode', null)    protected function configure()    {        $this            ->setName('crud')            ...            ->addOption('onlyview', null, Option::VALUE_OPTIONAL, 'only view mode', null)            ->setDescription('Build CRUD controller and model from table');    }        //修改execute方法 在 $editorclass = $input->getOption('editorclass'); 这行代码后添加:    protected function execute(Input $input, Output $output)    {            ...                //仅预览模式 不直接生成文件        $this->onlyView = $input->getOption('onlyview');        if($this->onlyView){            $path = RUNTIME_PATH . 'crud' . DS;            //先清空文件夹            rmdirs($path);        }                ...        }        //最后修改writeToFile方法    protected function writeToFile($name, $data, $pathname)    {        foreach ($data as $index => &$datum) {            $datum = is_array($datum) ? '' : $datum;        }        unset($datum);        $content = $this->getReplacedStub($name, $data);        if($this->onlyView == true){            $path = RUNTIME_PATH . 'crud' . DS;            //解决windows环境下出现的问题            if(DS == '\'){                $pathname = str_replace('/', '\', $pathname);                $pathname = strstr($pathname, '\');            }            $pathname = $path.implode('_', explode(DS, $pathname));        }        if (!is_dir(dirname($pathname))) {            mkdir(dirname($pathname), 0755, true);        }        return file_put_contents($pathname, $content);    }        

修改之后,crud方法就可以添加 --onlyview=true 参数了,添加此参数后,文件会生成在/runtime/crud文件夹下面

2.在线命令界面添加 生成预览文件按钮

此功能的修改需要下载 在线命令管理插件

1.安装插件后打开 application/admin/controller/Command.php 第180行

           if ($action == 'execute') {            $result = $this->doexecute($commandtype, $argv);            $this->success("", null, ['result' => $result]);        } else {            $this->success("", null, ['command' => "php think {$commandtype} " . implode(' ', $argv)]);        }                //将上面的代码改为下面的                 if ($action == 'execute') {            $result = $this->doexecute($commandtype, $argv);            $this->success("", null, ['result' => $result]);        } elseif($action = 'execute-onlyview'){            $result = $this->doexecute($commandtype, array_merge([                '--onlyview=true'            ], $argv));            $this->success("", null, ['result' => $result]);        } else {            $this->success("", null, ['command' => "php think {$commandtype} " . implode(' ', $argv)]);        }

并添加下面这个方法

        public function getRuntimeView($fileName = null){        $filePath = RUNTIME_PATH . 'crud' . DS;        if(!empty($fileName)){            $realFile = $filePath . implode('_', explode(DS, $fileName));            if(!file_exists($realFile)){                $this->error('文件不存在');            }else{                $filehandle = fopen($realFile,"r");                $file   = fread($filehandle, filesize($realFile));                $encoding = mb_detect_encoding($file, array('GB2312','GBK','UTF-16','UCS-2','UTF-8','BIG5','ASCII'));                $content = iconv($encoding, 'UTF-8', $file);                fclose($filehandle);                $content = htmlentities($content);                return "<textarea style='border: none;width: 100%;height: 100%'>$content</textarea>";            }        }        $files = [];        $handler = opendir($filePath);        while (($filename = readdir($handler)) !== false) {//务必使用!==,防止目录下出现类似文件名“0”等情况            if ($filename != "." && $filename != "..") {                $files[] = $filename;            }        }        closedir($handler);        foreach ($files as &$file){            $file = implode(DS, explode('_', $file));        }        return $this->success('', '', $files);    }

2.打开public/assets/js/backend/command.js 文件 第204行 添加下面这个函数

                 $(document).on('click', ".btn-execute-onlyview", function () {                var form = $(this).closest("form");                var textarea = $("textarea[rel=result]", form);                textarea.val('');                Fast.api.ajax({                    url: "command/command/action/execute-onlyview",                    data: form.serialize(),                }, function (data, ret) {                    textarea.val(data.result);                    window.parent.$(".toolbar .btn-refresh").trigger('click');                    top.window.Fast.api.refreshmenu();                    if(data.result == 'Build Successed'){                        Fast.api.ajax({                            url: "command/getRuntimeView",                        }, function (data, ret) {                            var  html = '';                            for ( var i = 0; i <data.length; i++){                                html += `<a href="/admin/command/getRuntimeView?fileName=${data[i]}" class="btn-dialog">${data[i]}</a> <br/>`                            }                            $('#show-view-file').html(html)                        })                    }                    return false;                }, function () {                    window.parent.$(".toolbar .btn-refresh").trigger('click');                });            });        

3.打开application/admin/view/command/add.html文件,第163行 添加

    //添加这个div展示生成的文件    <div class="form-group">        <legend>预览文件</legend>        <div id="show-view-file" ></div>    </div>        //在下面的按钮组中添加     <button type="button" class="btn btn-warning btn-embossed btn-execute-onlyview">{:__('生成预览文件')}</button>

完成之后打开在线命令插件,就能看到效果了~

这个功能需要修改的代码比较多,很多代码没有封装,希望大家多多见谅~

PS:因为没有修改文件是否存在的判断,所以如果执行生成预览文件时报错提示 模型或控制器文件已存在的话,请勾选强制覆盖模式


感谢 @18199116224 反馈的流程上的bug


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

相关推荐

扫码关注

qrcode

QQ交谈

回顶部