WxExtensionController.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace App\Admin\Controllers;
  3. use App\Admin\Displayers\WxName;
  4. use App\Admin\Repositories\WxExtension;
  5. use Dcat\Admin\Form;
  6. use Dcat\Admin\Grid;
  7. use Dcat\Admin\Http\Actions\Extensions\InstallFromLocal;
  8. use Dcat\Admin\Http\Controllers\HasResourceActions;
  9. use Dcat\Admin\Http\Displayers\Extensions;
  10. use Dcat\Admin\Layout\Content;
  11. use Dcat\Admin\Support\Helper;
  12. use Dcat\Admin\Support\StringOutput;
  13. use Illuminate\Routing\Controller;
  14. use Illuminate\Support\Facades\Artisan;
  15. class WxExtensionController extends Controller
  16. {
  17. use HasResourceActions;
  18. public function index(Content $content)
  19. {
  20. return $content
  21. ->title('MINI扩展')
  22. ->description('官方推荐的扩展,不开放第三方(安装或卸载时,若出现红色的错误,重新刷新一下浏览器就行)')
  23. ->body($this->grid());
  24. }
  25. /**
  26. * Make a grid builder.
  27. *
  28. * @return Grid
  29. */
  30. protected function grid()
  31. {
  32. return new Grid(new WxExtension(), function (Grid $grid) {
  33. $grid->number();
  34. $grid->column('name')->displayUsing(WxName::class);
  35. $grid->column('description')->displayUsing(Extensions\Description::class)->width('50%');
  36. $grid->column('authors')->display(function ($v) {
  37. if (! $v) {
  38. return;
  39. }
  40. foreach ($v as &$item) {
  41. $item = "<span class='text-80'>{$item['name']}</span> <<code>{$item['email']}</code>>";
  42. }
  43. return implode('<div style="margin-top: 5px"></div>', $v);
  44. });
  45. $grid->disablePagination();
  46. $grid->disableCreateButton();
  47. $grid->disableDeleteButton();
  48. $grid->disableBatchDelete();
  49. $grid->disableFilterButton();
  50. $grid->disableFilter();
  51. $grid->disableQuickEditButton();
  52. $grid->disableEditButton();
  53. $grid->disableDeleteButton();
  54. $grid->disableViewButton();
  55. $grid->disableActions();
  56. $grid->tools([
  57. '<a style="cursor: pointer;" class="btn btn-primary btn-outline" href="https://minisns.cn/social/appstore/minisns" target="_blank"><i class="feather icon-shopping-cart"></i> &nbsp;应用市场</a>',
  58. new InstallFromLocal(),
  59. ]);
  60. if(env('APP_ENV') == 'local'){
  61. $grid->quickCreate(function (Grid\Tools\QuickCreate $create) {
  62. $create->text('name')
  63. ->attribute('style', 'width:240px')
  64. ->placeholder('Input Name. Eg: dcat-admin/demo')
  65. ->required();
  66. $create->text('namespace')
  67. ->attribute('style', 'width:240px')
  68. ->placeholder('Input Namespace. Eg: DcatAdmin\\Demo');
  69. $create->select('type')
  70. ->options([1 => trans('admin.application'), 2 => trans('admin.theme')])
  71. ->attribute('style', 'width:140px!important')
  72. ->default(1)
  73. ->required();
  74. });
  75. }
  76. });
  77. }
  78. public function form()
  79. {
  80. $form = new Form(new WxExtension());
  81. $form->hidden('name')->rules(function () {
  82. return [
  83. 'required',
  84. function ($attribute, $value, $fail) {
  85. if (! Helper::validateExtensionName($value)) {
  86. return $fail(
  87. "[$value] is not a valid package name, please type a name like \"vendor/name\""
  88. );
  89. }
  90. },
  91. ];
  92. });
  93. $form->hidden('namespace');
  94. $form->hidden('type');
  95. $self = $this;
  96. $form->saving(function (Form $form) use ($self) {
  97. $package = $form->name;
  98. $namespace = $form->namespace;
  99. $type = $form->type;
  100. if ($package) {
  101. $results = $self->createExtension($package, $namespace, $type);
  102. return $form
  103. ->response()
  104. ->refresh()
  105. ->timeout(10)
  106. ->success($results);
  107. }
  108. });
  109. return $form;
  110. }
  111. public function createExtension($package, $namespace, $type)
  112. {
  113. $namespace = trim($namespace, '\\');
  114. $output = new StringOutput();
  115. Artisan::call('admin:ext-make', [
  116. 'name' => $package,
  117. '--namespace' => $namespace ?: 'default',
  118. '--theme' => $type == 2,
  119. ], $output);
  120. return sprintf('<pre class="bg-transparent text-white">%s</pre>', (string) $output->getContent());
  121. }
  122. }