HasFiles.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace Dcat\Admin\Form\Concerns;
  3. use Dcat\Admin\Contracts\UploadField as UploadFieldInterface;
  4. use Dcat\Admin\Form\Builder;
  5. use Dcat\Admin\Form\Field;
  6. use Symfony\Component\HttpFoundation\File\UploadedFile;
  7. use Symfony\Component\HttpFoundation\Response;
  8. /**
  9. * @property Builder $builder
  10. */
  11. trait HasFiles
  12. {
  13. /**
  14. * @param array $data
  15. *
  16. * @return Response|void
  17. */
  18. protected function handleUploadFile($data)
  19. {
  20. $column = $data['upload_column'] ?? null;
  21. $file = app('admin.web-uploader')->getCompleteUploadedFile() ?: ($data['file'] ?? null);
  22. if (! $column || ! $file instanceof UploadedFile) {
  23. return;
  24. }
  25. $field = $this->findFieldByName($column);
  26. if ($field && $field instanceof UploadFieldInterface) {
  27. if (($results = $this->callUploading($field, $file)) && $results instanceof Response) {
  28. return $results;
  29. }
  30. $response = $field->upload($file);
  31. if (($results = $this->callUploaded($field, $file, $response)) && $results instanceof Response) {
  32. return $results;
  33. }
  34. return $response;
  35. }
  36. }
  37. /**
  38. * 根据字段名称查找字段.
  39. *
  40. * @param string|null $column
  41. *
  42. * @return Field|null
  43. */
  44. public function findFieldByName(?string $column)
  45. {
  46. if ($field = $this->builder->field($column)) {
  47. return $field;
  48. }
  49. if (mb_strpos($column, '.')) {
  50. [$relation, $column] = explode('.', $column);
  51. $relation = $this->findFieldByName($relation);
  52. if ($relation instanceof Field\HasMany) {
  53. return $relation->buildNestedForm()->fields()->first(function ($field) use ($column) {
  54. return $field->column() === $column;
  55. });
  56. }
  57. return null;
  58. }
  59. return $this->builder->field($column) ?: $this->builder->stepField($column);
  60. }
  61. /**
  62. * @param array $data
  63. *
  64. * @return \Illuminate\Http\JsonResponse|void
  65. */
  66. protected function handleFileDeleteBeforeCreate(array $data)
  67. {
  68. if (! array_key_exists(Field::FILE_DELETE_FLAG, $data)) {
  69. return;
  70. }
  71. $column = $data['_column'] ?? null;
  72. $file = $data['key'] ?? null;
  73. if (! $column && ! $file) {
  74. return;
  75. }
  76. $field = $this->builder->field($column) ?: $this->builder->stepField($column);
  77. if ($field && $field instanceof UploadFieldInterface) {
  78. $field->deleteFile($file);
  79. return response()->json(['status' => true]);
  80. }
  81. }
  82. /**
  83. * @param array $input
  84. *
  85. * @return void
  86. */
  87. public function deleteFilesWhenCreating(array $input)
  88. {
  89. $this->builder
  90. ->fields()
  91. ->filter(function ($field) {
  92. return $field instanceof UploadFieldInterface;
  93. })
  94. ->each(function (UploadFieldInterface $file) use ($input) {
  95. $file->setOriginal($input);
  96. $file->destroy();
  97. });
  98. }
  99. /**
  100. * Remove files in record.
  101. *
  102. * @param array $data
  103. * @param bool $forceDelete
  104. */
  105. public function deleteFiles($data, $forceDelete = false)
  106. {
  107. // If it's a soft delete, the files in the data will not be deleted.
  108. if (! $forceDelete && $this->isSoftDeletes) {
  109. return;
  110. }
  111. $this->builder->fields()->filter(function ($field) {
  112. return $field instanceof Field\BootstrapFile
  113. || $field instanceof UploadFieldInterface;
  114. })->each(function (UploadFieldInterface $file) use ($data) {
  115. $file->setOriginal($data);
  116. $file->destroy();
  117. });
  118. }
  119. /**
  120. * @param array $input
  121. *
  122. * @return array
  123. */
  124. protected function handleFileDelete(array $input = [])
  125. {
  126. if (! array_key_exists(Field::FILE_DELETE_FLAG, $input)) {
  127. return $input;
  128. }
  129. $input[Field::FILE_DELETE_FLAG] = $input['key'];
  130. unset($input['key']);
  131. if (! empty($input['_column'])) {
  132. $input[$input['_column']] = '';
  133. unset($input['_column']);
  134. }
  135. $this->request->replace($input);
  136. return $input;
  137. }
  138. /**
  139. * @param array $input
  140. *
  141. * @return \Illuminate\Http\JsonResponse
  142. */
  143. protected function handleFileDeleteWhenCreating(array $input)
  144. {
  145. $input = $this->handleFileDelete($input);
  146. $column = $input['_column'] ?? null;
  147. if (isset($input[Field::FILE_DELETE_FLAG]) && $column) {
  148. $this->builder->fields()->filter(function ($field) use ($column) {
  149. /* @var Field $field */
  150. return $column === $field->column() && $field instanceof UploadFieldInterface;
  151. })->each(function (UploadFieldInterface $file) use ($input) {
  152. $file->deleteFile($input[Field::FILE_DELETE_FLAG]);
  153. });
  154. return \response()->json(['status' => true]);
  155. }
  156. }
  157. }