iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
0

https://ithelp.ithome.com.tw/upload/images/20200929/201136029PCalzRu3X.jpg

首先先新增一個輸入留言的組件,裡面會使用之前做的 Markdown 輸入框組件,enabled prop 為 true 時可正常輸入留言,為 false 時禁止輸入,同時按鈕會改成「登入即可留言」:

resources/js/Lightning/CommentForm.vue

<template>
  <form @submit.prevent="submit">
    <markdown-input
      v-model="form.content"
      :placeholder="enabled ? '請輸入留言...' : '登入後即可留言...'"
      :editable="enabled"
      short
      :toolbars-flag="enabled"
      :error="$page.errors.content"
    />
    <div class="text-right mt-4">
      <loading-button v-if="enabled" :loading="loading" class="btn btn-purple">留言</loading-button>
      <inertia-link v-else href="/login" class="btn btn-purple-light">
        登入即可留言
        <icon class="ml-1" icon="heroicons-outline:arrow-right" />
      </inertia-link>
    </div>
  </form>
</template>

<script>
import MarkdownInput from '@/Components/MarkdownInput'
import LoadingButton from '@/Components/LoadingButton'

export default {
  components: {
    MarkdownInput,
    LoadingButton
  },
  props: {
    post: Object,
    enabled: {
      type: Boolean,
      default: true
    }
  },
  data() {
    return {
      form: {
        content: ''
      },
      loading: false
    }
  },
  methods: {
    submit() {
      this.$inertia.post(`/posts/${this.post.id}/comments`, this.form, {
        preserveScroll: true,
        onStart: () => this.loading = true,
        onFinish: () => this.loading = false,
        onSuccess: () => {
          if (! Object.keys(this.$page.errors).length) {
            this.form.content = ''
          }
        }
      })
    }
  }
}
</script>

Inertia.js v0.3 已棄用 Promise 調用方式

現在全系列已更新為 Inertia.js v0.3,增加了 Event system (事件系統),Promise 調用的方式已棄用,若尚未更新至 v0.3 請更新版本:

yarn add @inertiajs/inertia@^0.3 @inertiajs/inertia-vue@^0.2.4

並參考 Day 09 Lightning 用戶登入 的「載入進度條」篇安裝進度條套件。

但如果你還是想要使用舊方法或者不想升級,請參考以下用法:

submit() {
  this.loading = true
  this.$inertia.post(`/posts/${this.post.id}/comments`, this.form, {
    preserveScroll: true
  }).then(() => {
    this.loading = false
    if (! Object.keys(this.$page.errors).length) {
      this.form.content = ''
    }
  })
}

然後在文章頁面引入輸入留言組件,而且設定成用戶要登入 enabled prop 才會是 true

resources/js/Pages/Post/Show.vue

<template>
  <div class="grid gap-6 xl:grid-cols-4">
    ...

    <div class="min-w-0 xl:col-span-3">
      <div class="card p-6 md:p-8">
        <h3 class="text-2xl font-semibold">留言</h3>
        <comment-form :post="post" :enabled="Boolean($page.auth.user)" class="mt-6" />
      </div>
    </div>
  </div>
</template>


<script>
import CommentForm from '@/Lightning/CommentForm'

export default {
  components: {
    CommentForm
  }
}
</script>

新增 CommentRequest:

php artisan make:request CommentRequest

這邊還是差不多,先刪掉 authorize(),然後增加驗證規則,還要寫 content 欄位的翻譯:

app/Http/Requests/CommentRequest.php

public function rules()
{
    return [
        'content' => 'required|max:1000',
    ];
}

public function attributes()
{
    return [
        'content' => '留言',
    ];
}

最後儲存留言:

app/Http/Controllers/Post/CommentController.php

use App\Http\Requests\CommentRequest;
use App\Post;

public function store(CommentRequest $request, Post $post)
{
    $comment = Comment::make($request->validated());
    $comment->post()->associate($post);
    $comment->commenter()->associate($this->user());
    $comment->save();

    return back();
}

一樣還是開 Tinker 檢查:

php artisan tinker
>>> App\Comment::find(1)

https://ithelp.ithome.com.tw/upload/images/20200926/20113602fe9rNo2GxP.jpg

總結

留言功能需要的 Markdown 需要的組件之前也都有了,現在都可以直接拿來用。下篇來做留言功能的最後部分,顯示文章留言 & 刪除留言。

Lightning 範例程式碼:https://github.com/ycs77/lightning


上一篇
Day 24 Lightning 留言功能
下一篇
Day 26 Lightning 顯示文章留言 & 刪除留言
系列文
關於我用 Laravel 寫 SPA 卻不寫 API 的那檔事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言