前言:这功能有啥用?这个功能主要是的使用场景是:开发的途中修改了数据库表的字段,原来的控制器和模型文件不能覆盖,使用预览功能可以非常方便的复制代码
实现效果:1.命令行模式 crud命令添加 --onlyview=true
参数,设置此参数后生成的文件会保存在 /runtime/crud/
文件夹下,避免覆盖原有文件
2.在线命令界面添加 生成预览文件按钮, 生成的crud文件可以在线预览, 效果如下
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修复,程序杀毒,插件定制都可以提供最佳解决方案。