Prechádzať zdrojové kódy

优化表单事件,新增、修改和删除允许返回失败类型

jqh 5 rokov pred
rodič
commit
4f61924646

+ 1 - 0
resources/lang/en/admin.php

@@ -98,6 +98,7 @@ return [
     'delete_succeeded'      => 'Delete succeeded !',
     'delete_failed'         => 'Delete failed !',
     'update_succeeded'      => 'Update succeeded !',
+    'update_failed'         => 'Update failed !',
     'save_succeeded'        => 'Save succeeded !',
     'refresh_succeeded'     => 'Refresh succeeded !',
     'login_successful'      => 'Login successful',

+ 1 - 0
resources/lang/zh-CN/admin.php

@@ -93,6 +93,7 @@ return [
     'delete_succeeded'      => '删除成功 !',
     'delete_failed'         => '删除失败 !',
     'update_succeeded'      => '更新成功 !',
+    'update_failed'         => '更新失败 !',
     'save_succeeded'        => '保存成功 !',
     'save_failed'           => '保存失败 !',
     'refresh_succeeded'     => '刷新成功 !',

+ 16 - 8
src/Form.php

@@ -535,15 +535,15 @@ class Form implements Renderable
                 return $response;
             }
 
-            $this->repository->destroy($this, $data);
+            $result = $this->repository->destroy($this, $data);
 
-            if (($response = $this->callDeleted()) instanceof Response) {
+            if (($response = $this->callDeleted($result)) instanceof Response) {
                 return $response;
             }
 
             $response = [
-                'status'  => true,
-                'message' => trans('admin.delete_succeeded'),
+                'status'  => $result ? true : false,
+                'message' => $result ? trans('admin.delete_succeeded') : trans('admin.delete_failed'),
             ];
         } catch (\Throwable $exception) {
             $response = Admin::makeExceptionHandler()->handleDestroyException($exception);
@@ -583,7 +583,7 @@ class Form implements Renderable
 
         $this->builder->setResourceId($id);
 
-        if (($response = $this->callSaved())) {
+        if (($response = $this->callSaved($id))) {
             return $response;
         }
 
@@ -591,6 +591,10 @@ class Form implements Renderable
             return $response;
         }
 
+        if (! $id) {
+            return $this->error(trans('admin.save_failed'));
+        }
+
         return $this->redirect(
             $this->redirectUrl($id, $redirectTo),
             trans('admin.save_succeeded')
@@ -746,10 +750,14 @@ class Form implements Renderable
 
         $this->updates = $this->prepareUpdate($this->updates);
 
-        $this->repository->update($this);
+        $updated = $this->repository->update($this);
+
+        if (($response = $this->callSaved($updated))) {
+            return $response;
+        }
 
-        if (($result = $this->callSaved())) {
-            return $result;
+        if (! $updated) {
+            return $this->error(trans('admin.update_succeeded'));
         }
 
         return $this->redirect(

+ 8 - 4
src/Form/Concerns/HasEvents.php

@@ -186,11 +186,13 @@ trait HasEvents
     /**
      * Callback after saving a Model.
      *
+     * @param mixed $result
+     *
      * @return mixed|null
      */
-    protected function callSaved()
+    protected function callSaved($result)
     {
-        return $this->callListeners('saved');
+        return $this->callListeners('saved', [$result]);
     }
 
     /**
@@ -202,11 +204,13 @@ trait HasEvents
     }
 
     /**
+     * @param mixed $result
+     *
      * @return mixed|null
      */
-    protected function callDeleted()
+    protected function callDeleted($result)
     {
-        return $this->callListeners('deleted');
+        return $this->callListeners('deleted', [$result]);
     }
 
     /**

+ 9 - 1
src/Traits/HasFormResponse.php

@@ -90,7 +90,15 @@ trait HasFormResponse
      */
     public function error($message = null, $redirectTo = null, int $statusCode = 200)
     {
-        $redirectTo = $redirectTo ?: $this->getCurrentUrl();
+        if (! $redirectTo) {
+            if (! $this->isAjaxRequest()) {
+                admin_toastr($message, 'error');
+
+                return back()->withInput();
+            }
+
+            return $this->ajaxResponse($message, null, false);
+        }
 
         return $this->redirect($redirectTo, [
             'message'     => $message,