Browse Source

Level 1.4: save() with non-default format.

Frederic G. MARAND 6 năm trước cách đây
mục cha
commit
fd4ae7d922
4 tập tin đã thay đổi với 21 bổ sung5 xóa
  1. 7 1
      src/Controllers/TodosController.php
  2. 1 1
      src/routing.php
  3. 12 2
      web/client/src/todoModel.js
  4. 1 1
      web/data/items.json

+ 7 - 1
src/Controllers/TodosController.php

@@ -38,7 +38,12 @@ class TodosController {
     return $app->json($todo);
   }
 
-  public function put(Application $app, Request $request, int $id) {
+  public function putLevel1(Application $app, Request $request, int $id) {
+    $sub = Request::create('/todos', 'POST', [], [], [], [], $request->getContent());
+    return $app->handle($sub, HttpKernelInterface::SUB_REQUEST);
+  }
+
+  public function putLevel2(Application $app, Request $request, int $id) {
     $sub = Request::create('/todos', 'POST', [], [], [], [], $request->getContent());
     return $app->handle($sub, HttpKernelInterface::SUB_REQUEST);
   }
@@ -47,6 +52,7 @@ class TodosController {
     /** @var \Model $model */
     $model = $app['model'];
     $data = json_decode($request->getContent(), true);
+    $data = $data['todo'];
     $created = $model->save($data);
     return new Response('Saved', $created ? Response::HTTP_CREATED : Response::HTTP_OK);
   }

+ 1 - 1
src/routing.php

@@ -5,7 +5,7 @@ use Controllers\TodosController;
 
 $app->get('/todos',         TodosController::class . '::index');
 $app->get('/todos/{id}',    TodosController::class . '::getLevel2');
-$app->put('/todos/{id}',    TodosController::class . '::put');
+$app->put('/todos/{id}',    TodosController::class . '::putLevel2');
 $app->post('/todos',        TodosController::class . '::post')
   ->value('id', NULL);
 $app->delete('/todos/{id}', TodosController::class . '::delete');

+ 12 - 2
web/client/src/todoModel.js

@@ -13,11 +13,21 @@ const TodoItem = Backbone.Model.extend({
     // Long format for arrow function to allow breakpoint setting in Chrome.
     parse: (response) => {
       const todo = response.todo;
-      todo.desc = todo.description;
-      delete todo.description;
+      todo.description = todo.desc;
+      delete todo.desc;
       return todo;
     },
 
+    toJSON: function () {
+      // Default version
+      // return _.clone(this.attributes);
+
+      let attrs = _.clone(this.attributes);
+      attrs.desc = attrs.description;
+      attrs = _.pick(attrs, 'desc', 'id', 'status');
+      return { todo: attrs };
+    },
+
     toggleStatus(view) {
       this.set('status', (this.get('status') === 'incomplete')
         ? 'complete'

+ 1 - 1
web/data/items.json

@@ -1,7 +1,7 @@
 {
     "1": {
         "id": 1,
-        "description": "some other description",
+        "description": "first",
         "status": "incomplete"
     },
     "2": {