|
@@ -13,6 +13,7 @@ use Dcat\Admin\Traits\HasBuilderEvents;
|
|
|
use Dcat\Admin\Widgets\ModalForm;
|
|
|
use Illuminate\Contracts\Support\MessageProvider;
|
|
|
use Illuminate\Contracts\Support\Renderable;
|
|
|
+use Illuminate\Http\Request;
|
|
|
use Illuminate\Support\Arr;
|
|
|
use Illuminate\Support\Fluent;
|
|
|
use Illuminate\Support\MessageBag;
|
|
@@ -183,6 +184,11 @@ class Form implements Renderable
|
|
|
*/
|
|
|
protected $callback;
|
|
|
|
|
|
+ /**
|
|
|
+ * @var Request
|
|
|
+ */
|
|
|
+ protected $request;
|
|
|
+
|
|
|
/**
|
|
|
* @var bool
|
|
|
*/
|
|
@@ -266,14 +272,12 @@ class Form implements Renderable
|
|
|
* @param Repository $model
|
|
|
* @param \Closure $callback
|
|
|
*/
|
|
|
- public function __construct(Repository $repository, ?Closure $callback = null)
|
|
|
+ public function __construct(Repository $repository, ?Closure $callback = null, Request $request = null)
|
|
|
{
|
|
|
$this->repository = Admin::repository($repository);
|
|
|
-
|
|
|
$this->callback = $callback;
|
|
|
-
|
|
|
+ $this->request = $request ?: request();
|
|
|
$this->builder = new Builder($this);
|
|
|
-
|
|
|
$this->isSoftDeletes = $this->repository->isSoftDeletes();
|
|
|
|
|
|
$this->setModel(new Fluent());
|
|
@@ -560,11 +564,11 @@ class Form implements Renderable
|
|
|
*
|
|
|
* @param array|null $data
|
|
|
* @param string|string $redirectTo
|
|
|
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\Http\JsonResponse
|
|
|
+ * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\Http\JsonResponse|Response
|
|
|
*/
|
|
|
public function store(?array $data = null, $redirectTo = null)
|
|
|
{
|
|
|
- $data = $data ?: request()->all();
|
|
|
+ $data = $data ?: $this->request->all();
|
|
|
|
|
|
$this->build();
|
|
|
|
|
@@ -585,11 +589,7 @@ class Form implements Renderable
|
|
|
|
|
|
// Handle validation errors.
|
|
|
if ($validationMessages = $this->validationMessages($data)) {
|
|
|
- if (!$this->isAjaxRequest()) {
|
|
|
- return back()->withInput()->withErrors($validationMessages);
|
|
|
- } else {
|
|
|
- return response()->json(['errors' => $validationMessages->getMessages()], 422);
|
|
|
- }
|
|
|
+ return $this->makeValidationErrorsResponse($validationMessages);
|
|
|
}
|
|
|
|
|
|
if (($response = $this->prepare($data))) {
|
|
@@ -642,9 +642,7 @@ class Form implements Renderable
|
|
|
*/
|
|
|
public function isAjaxRequest()
|
|
|
{
|
|
|
- $request = request();
|
|
|
-
|
|
|
- return $request->ajax() && !$request->pjax();
|
|
|
+ return $this->request->ajax() && ! $this->request->pjax();
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -708,7 +706,7 @@ class Form implements Renderable
|
|
|
* @param int $id
|
|
|
* @param array $input
|
|
|
*
|
|
|
- * @return bool
|
|
|
+ * @return bool||Response
|
|
|
*/
|
|
|
protected function handleOrderable(array $input = [])
|
|
|
{
|
|
@@ -726,7 +724,7 @@ class Form implements Renderable
|
|
|
* @param $id
|
|
|
* @param array|null $data
|
|
|
* @param string|null $redirectTo
|
|
|
- * @return $this|bool|\Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse|mixed|null
|
|
|
+ * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse||Response
|
|
|
*/
|
|
|
public function update(
|
|
|
$id,
|
|
@@ -734,7 +732,7 @@ class Form implements Renderable
|
|
|
$redirectTo = null
|
|
|
)
|
|
|
{
|
|
|
- $data = $data ?: request()->all();
|
|
|
+ $data = $data ?: $this->request->all();
|
|
|
|
|
|
$this->builder->setResourceId($id);
|
|
|
$this->builder->setMode(Builder::MODE_EDIT);
|
|
@@ -764,13 +762,9 @@ class Form implements Renderable
|
|
|
|
|
|
// Handle validation errors.
|
|
|
if ($validationMessages = $this->validationMessages($data)) {
|
|
|
- if (!$isEditable && !$this->isAjaxRequest()) {
|
|
|
- return back()->withInput()->withErrors($validationMessages);
|
|
|
- } else {
|
|
|
- return response()->json([
|
|
|
- 'errors' => $isEditable ? Arr::dot($validationMessages->getMessages()) : $validationMessages->getMessages()
|
|
|
- ], 422);
|
|
|
- }
|
|
|
+ return $this->makeValidationErrorsResponse(
|
|
|
+ $isEditable ? Arr::dot($validationMessages->toArray()) : $validationMessages
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
if (($response = $this->prepare($data))) {
|
|
@@ -791,6 +785,21 @@ class Form implements Renderable
|
|
|
);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * @param array|MessageBag $validationMessages
|
|
|
+ * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
|
|
+ */
|
|
|
+ protected function makeValidationErrorsResponse($validationMessages)
|
|
|
+ {
|
|
|
+ if (! $this->isAjaxRequest()) {
|
|
|
+ return back()->withInput()->withErrors($validationMessages);
|
|
|
+ }
|
|
|
+
|
|
|
+ return response()->json([
|
|
|
+ 'errors' => is_array($validationMessages) ? $validationMessages : $validationMessages->getMessages()
|
|
|
+ ], 422);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Get redirect response.
|
|
|
*
|
|
@@ -809,14 +818,12 @@ class Form implements Renderable
|
|
|
|
|
|
$status = (bool) ($options['status'] ?? true);
|
|
|
|
|
|
- // 判断是否是ajax请求
|
|
|
if ($this->isAjaxRequest()) {
|
|
|
$message = $message ?: trans('admin.save_succeeded');
|
|
|
|
|
|
return $this->ajaxResponse($message, $url, $status);
|
|
|
}
|
|
|
|
|
|
- // 非ajax请求
|
|
|
$status = (int) ($options['status_code'] ?? 302);
|
|
|
|
|
|
if ($message) {
|
|
@@ -839,23 +846,23 @@ class Form implements Renderable
|
|
|
$resourcesPath = $this->builder->isCreating() ?
|
|
|
$this->getResource(0) : $this->getResource(-1);
|
|
|
|
|
|
- if (request('after-save') == 1) {
|
|
|
+ if ($this->request->get('after-save') == 1) {
|
|
|
// continue editing
|
|
|
if ($this->builder->isEditing() && $this->isAjaxRequest()) {
|
|
|
return false;
|
|
|
}
|
|
|
return rtrim($resourcesPath, '/')."/{$key}/edit";
|
|
|
}
|
|
|
- if (request('after-save') == 2) {
|
|
|
+ if ($this->request->get('after-save') == 2) {
|
|
|
// continue creating
|
|
|
return rtrim($resourcesPath, '/').'/create';
|
|
|
}
|
|
|
- if (request('after-save') == 3) {
|
|
|
+ if ($this->request->get('after-save') == 3) {
|
|
|
// view resource
|
|
|
return rtrim($resourcesPath, '/')."/{$key}";
|
|
|
}
|
|
|
|
|
|
- return request(Builder::PREVIOUS_URL_KEY) ?: $resourcesPath;
|
|
|
+ return $this->request->get(Builder::PREVIOUS_URL_KEY) ?: $resourcesPath;
|
|
|
}
|
|
|
|
|
|
/**
|