---
title: ระบบเทมเพลต - เนื้อหาการแจ้งเตือนแบบไดนามิก
sidebarTitle: เทมเพลต
description: สร้างเทมเพลตการแจ้งเตือนแบบไดนามิกด้วยตัวแปร นิพจน์ และค่าของระบบ พร้อมแนวปฏิบัติที่ดีสำหรับข้อความแจ้งเตือนที่ชัดเจน
---

# เทมเพลตใน Echobell

เทมเพลตใน Echobell ช่วยให้คุณสร้างการแจ้งเตือนที่เป็นไดนามิกและเต็มไปด้วยบริบท โดยแทรกตัวแปรลงในหัวข้อและเนื้อหาของการแจ้งเตือน ฟีเจอร์อันทรงพลังนี้ทำให้ได้การแจ้งเตือนที่เจาะจงและให้ข้อมูลครบถ้วน ปรับเปลี่ยนตามข้อมูลของทริกเกอร์ เปลี่ยนการแจ้งเตือนกว้าง ๆ ให้กลายเป็นข้อมูลที่ลงมือทำต่อได้ทันที

แทนที่จะได้รับข้อความกว้าง ๆ ว่า "Alert triggered" เทมเพลตช่วยให้คุณสร้างการแจ้งเตือนที่เจาะจงได้ เช่น "Production server CPU at 95%" หรือ "Build #142 failed in deploy stage" ซึ่งให้บริบทได้ทันทีโดยไม่ต้องไปสืบค้นเพิ่ม

## ไวยากรณ์เทมเพลตพื้นฐาน

ในเทมเพลตของ Echobell คุณใช้ตัวแปรได้โดยครอบด้วยวงเล็บปีกกาคู่:

```
{{variableName}}
```

เมื่อช่องถูกทริกเกอร์ ตัวแปรเหล่านี้จะถูกแทนที่ด้วยค่าจริงที่ส่งมาพร้อมทริกเกอร์ ตัวอย่างเช่น หากเทมเพลตหัวข้อของคุณคือ `You have received ${{amount}}` และคุณทริกเกอร์ช่องด้วยค่า `amount` เท่ากับ 100 การแจ้งเตือนที่ได้จะแสดงเป็น `You have received $100`

## นิพจน์เทมเพลตขั้นสูง

เทมเพลตของ Echobell รองรับนิพจน์หลายรูปแบบสำหรับสถานการณ์ที่ซับซ้อนขึ้น:

- การเข้าถึงพร็อพเพอร์ตีของอ็อบเจกต์

```
{{user.name}}
{{data["value"]}}
```

- การเข้าถึงสมาชิกของอาร์เรย์

```
{{items[0]}}
```

- การใช้ตัวดำเนินการเปรียบเทียบ

```
{{status == "active"}}
{{age > 18}}
```

- ตัวดำเนินการทางตรรกะ

```
{{isSubscribed && !isPaused}}
{{isUrgent || isHighPriority}}
```

ระบบรองรับตัวดำเนินการมาตรฐานทั้งหมด ได้แก่ `==`, `!=`, `<`, `>`, `<=`, `>=`, `&&`, `||` และ `!`

## ตัวแปรในเทมเพลตจากทริกเกอร์แต่ละแบบ

### ทริกเกอร์แบบ Webhook

เมื่อทริกเกอร์ผ่าน webhook คุณส่งตัวแปรได้ผ่าน:

1. **พารามิเตอร์ใน query string**:

   ```http
   GET https://hook.echobell.one/t/<channel-token>?amount=100&status=complete
   ```

2. **JSON body** (สำหรับคำขอแบบ POST):

   ```http
   POST https://hook.echobell.one/t/<channel-token>
   Content-Type: application/json

   {
     "amount": 100,
     "status": "complete",
     "user": {
       "name": "John",
       "id": 12345
     }
   }
   ```

3. **ตัวแปรพิเศษ**:
   - `externalLink`: สร้างลิงก์ที่คลิกได้ในบันทึกการแจ้งเตือน
   - `bodyAsText`: เนื้อหาแบบข้อความล้วนของ body ในคำขอ หาก `Content-Type` เป็น `text/plain`
   - `header`: ให้เข้าถึงเฮดเดอร์ของคำขอ HTTP (เช่น `{{header["content-type"]}}`)

### ทริกเกอร์อีเมล

เมื่อช่องถูกทริกเกอร์ผ่านอีเมล จะมีตัวแปรต่อไปนี้ให้ใช้โดยอัตโนมัติ:

- `from`: ที่อยู่อีเมลของผู้ส่ง
- `to`: ที่อยู่อีเมลของผู้รับ
- `subject`: บรรทัดหัวข้อของอีเมล
- `text`: เนื้อหาแบบข้อความล้วนของอีเมล
- `html`: เนื้อหาแบบ HTML ของอีเมล

## กรณีใช้งานเทมเพลต

### การเปรียบเทียบและค่าบูลีน

นิพจน์ที่ใช้ตัวดำเนินการเปรียบเทียบหรือตรรกะจะแสดงผลลัพธ์บูลีนออกมาเป็นข้อความ `true` หรือ `false`:

```
Payment over $1000: {{amount > 1000}}
High priority: {{isUrgent || isImportant}}
```

เทมเพลตของ Echobell **ไม่** รองรับตรรกะ if/else แบบเขียนในบรรทัดเดียว (ternary) หากต้องการส่งเนื้อหาที่ต่างกันในแต่ละสถานการณ์ ให้ใช้ [เงื่อนไข](/docs/conditions) ของช่องเพื่อกำหนดเส้นทางของทริกเกอร์ หรือแทรกค่าดิบเข้าไปโดยตรง

### เงื่อนไขของช่อง

นอกจากการใช้เทมเพลตในเนื้อหาการแจ้งเตือนแล้ว คุณยังตั้ง **เงื่อนไข** ในการตั้งค่าขั้นสูงของช่องได้ เพื่อกำหนดว่าควรส่งการแจ้งเตือนหรือไม่ตั้งแต่แรก เงื่อนไขเหล่านี้ใช้ไวยากรณ์นิพจน์เดียวกัน (แต่ไม่ต้องใส่วงเล็บปีกกา)

ตัวอย่างเช่น หากต้องการส่งการแจ้งเตือนเฉพาะเมื่อจำนวนเงินมากกว่าค่าเกณฑ์:

```
amount > 100
```

## เทมเพลตของลิงก์

ตั้งค่าเทมเพลตลิงก์แบบกำหนดเองในการตั้งค่าขั้นสูงของช่อง เพื่อสร้างลิงก์ที่คลิกได้ในบันทึกการแจ้งเตือน:

```
https://dashboard.example.com/orders/{{orderId}}
```

หากไม่ได้ตั้งเทมเพลตลิงก์ไว้ ระบบจะใช้ค่าของตัวแปร `externalLink` เป็นค่าเริ่มต้น

## ตัวแปรเวลาของระบบ (UTC)

ตัวแปรเหล่านี้ใช้ได้เสมอทั้งในเทมเพลต (และเงื่อนไข) และคำนวณตามเวลา UTC

ค่าต่อไปนี้ถูกใส่เข้ามาโดยตรง (ระดับบนสุด) และเรียกใช้ด้วยชื่อได้เลย:

- `year`, `month` (1–12)
- `dayOfMonth`, `dayOfWeek` (0–6 โดยวันอาทิตย์ = 0)
- `hour` (0–23), `minute`, `second`
- `date` (`YYYY-MM-DD`), `time` (`HH:mm:ss`)
- `iso`: เวลาในรูปแบบ ISO‑8601 (เช่น `2025-05-06T12:34:56.789Z`)

ส่วนค่าอื่น ๆ ใช้ได้ **เฉพาะ** ภายใต้เนมสเปซ `sys.` เท่านั้น (ไม่ได้ถูกใส่เข้ามาเป็นชื่อระดับบนสุด):

- `sys.timezone`: เป็น `"UTC"` เสมอ
- `sys.now`: เวลาในรูปแบบ ISO‑8601 (ค่าเดียวกับ `iso`)
- `sys.epochMs`, `sys.epochSeconds`: เวลาปัจจุบันนับจาก Unix epoch (เป็นตัวเลข)
- `sys.monthName`: ชื่อเดือน (`January`–`December`)
- `sys.dayOfWeekName`: ชื่อวัน (`Sunday`–`Saturday`)

เนมสเปซ `sys.` ยังสะท้อนค่าระดับบนสุดทุกตัวไว้ด้วย (เช่น `sys.year`, `sys.hour`)

ตัวอย่าง:

```
Sent at {{date}} {{time}} {{sys.timezone}}
Today is {{sys.dayOfWeekName}}, {{sys.monthName}} {{dayOfMonth}}, {{year}}
Epoch: {{sys.epochSeconds}}
```

## แนวปฏิบัติที่ดี

### รับมือกับตัวแปรที่ขาดหายไป
Echobell **ไม่มีตัวดำเนินการสำหรับกำหนดค่าเริ่มต้น** ตัวดำเนินการ `||` เป็นตรรกะล้วน ๆ โดยจะประเมินทั้งสองฝั่งเป็นบูลีนแล้วแสดงผลเป็น `true` หรือ `false` ดังนั้น `{{username || "Anonymous User"}}` จะแสดงเป็นข้อความ `true` หรือ `false` ตรง ๆ ไม่ใช่ชื่อผู้ใช้หรือข้อความสำรองแต่อย่างใด

เมื่อตัวแปรขาดหายไป `{{variable}}` จะแสดงผลเป็นสตริงว่างเฉย ๆ จึงควรออกแบบป้ายกำกับของคุณให้ยังอ่านเข้าใจได้แม้ค่าจะว่างเปล่า:

```
User: {{username}}
Server: {{serverName}}
Errors detected: {{errorCount}}
```

หากคุณต้องการค่าที่รับประกันว่ามีแน่นอน ให้ส่งค่านั้นมาใน payload ของทริกเกอร์อย่างชัดเจน แทนที่จะพึ่งค่าสำรองในเทมเพลต

### เทมเพลตที่ให้ข้อมูลครบถ้วน
ใส่ข้อมูลสำคัญลงในเทมเพลตของคุณ เพื่อให้การแจ้งเตือนนำไปลงมือทำต่อได้โดยไม่ต้องหาบริบทเพิ่ม:

**ตัวอย่างที่ดี:**
```
Title: {{service}} {{status}} on {{environment}}
Body: {{errorMessage}} at {{timestamp}}
Action required: {{recommendedAction}}
```

**ควรเลี่ยง:**
```
Title: Alert
Body: Check logs
```

### เขียนเทมเพลตให้กระชับ
การแจ้งเตือนจะแสดงผลได้ดีที่สุดเมื่อหัวข้อและเนื้อหาชัดเจนและตรงประเด็น:

- **หัวข้อ**: 3-8 คำกำลังดี ไม่เกิน 20 คำ
- **เนื้อหา**: 1-3 ประโยคกำลังดี เลี่ยงข้อความยาวเป็นพืด
- **ลำดับความสำคัญ**: วางข้อมูลที่สำคัญที่สุดไว้ก่อน

ข้อจำกัดของการแจ้งเตือนบน iOS:
- หัวข้อ: มองเห็นได้ประมาณ 40 อักขระในมุมมองแบบย่อ
- เนื้อหา: ประมาณ 60 อักขระในมุมมองแบบย่อ และมากขึ้นเมื่อขยาย

### ตั้งชื่อให้สอดคล้องกัน
รักษาการตั้งชื่อตัวแปรให้สอดคล้องกันในทุกช่องของคุณ:

- ใช้ชื่อที่ชัดเจนและสื่อความหมาย: `server_name` ไม่ใช่ `sn`
- ยึดแบบแผนเดียว: snake_case, camelCase หรือ kebab-case
- ใช้ให้สอดคล้องกันในช่องที่เกี่ยวข้องกัน
- บันทึกไว้ว่าคาดหวังตัวแปรใดบ้าง เพื่อให้เพื่อนร่วมทีมเข้าใจตรงกัน

### ทดสอบให้ครบถ้วน
ทดสอบเทมเพลตของคุณด้วยชุดตัวแปรที่หลากหลาย เพื่อให้แน่ใจว่าแสดงผลตามที่คาดไว้:

1. ทดสอบเมื่อมีตัวแปรครบทุกตัว
2. ทดสอบเมื่อตัวแปรที่ไม่บังคับขาดหายไป
3. ทดสอบด้วยอักขระพิเศษและ Unicode
4. ทดสอบด้วยค่าที่ยาวมาก
5. ทดสอบด้วยสตริงว่าง
6. ทดสอบด้วยตัวเลข บูลีน อาร์เรย์ และอ็อบเจกต์

### จัดโครงสร้างให้อ่านง่าย
ใช้การจัดรูปแบบเพื่อให้กวาดสายตาอ่านเนื้อหาการแจ้งเตือนได้ง่าย:

```
🚨 Alert: {{alertName}}
━━━━━━━━━━━━━━━
Server: {{server}}
Metric: {{metric}}  
Value: {{value}}
Time: {{time}}
━━━━━━━━━━━━━━━
Details: {{message}}
```

หรือใช้ป้ายกำกับง่าย ๆ:

```
Server: {{server}}
CPU Usage: {{cpu}}%
Memory: {{memory}}%
Status: {{status}}
```

### ใช้ประโยชน์จากนิพจน์
ใช้นิพจน์เพื่อแสดงค่าที่คำนวณได้และผลของการเปรียบเทียบ:

```
Title: {{service}} alert — critical: {{severity == "critical"}}
Body: {{metric}} is {{value}} (over threshold: {{value > threshold}})
```

นิพจน์เปรียบเทียบและตรรกะจะแสดงผลเป็น `true` หรือ `false` จึงควรใช้คู่กับข้อความป้ายกำกับแบบคงที่เพื่อสื่อความหมาย

### คำนึงถึงเขตเวลา
โปรดจำไว้ว่าตัวแปรเวลาของระบบอิงเวลา UTC ควรระบุเรื่องนี้ไว้ในข้อความ หรือแปลงค่าในเทมเพลตของคุณ:

```
Alert triggered at {{time}} UTC
Triggered: {{date}} {{time}} (UTC)
```

## รูปแบบที่พบบ่อยและตัวอย่าง

### การมอนิเตอร์เซิร์ฟเวอร์
```
Title: {{hostname}} - {{metric}} Alert
Body: {{metric}} on {{hostname}} is at {{value}}{{unit}}
Threshold: {{threshold}}{{unit}}
Time: {{date}} {{time}}
```

### ไปป์ไลน์ CI/CD
```
Title: {{repository}} - Build {{status}}
Body: Build #{{buildNumber}} {{status}} in {{duration}}s
Branch: {{branch}}
Commit: {{commit_message}}
Author: {{author}}
```

### อีคอมเมิร์ซ
```
Title: New Order #{{orderNumber}}
Body: Customer: {{customerName}}
Items: {{itemCount}} items
Total: ${{totalAmount}}
Shipping: {{shippingAddress}}
```

### การติดตามข้อผิดพลาด
```
Title: {{errorType}} in {{service}}
Body: {{errorMessage}}
File: {{filename}}:{{lineNumber}}
User: {{userId}}
Environment: {{environment}}
```

## ฟีเจอร์ขั้นสูง

### เทมเพลตของลิงก์
ตั้งค่า **เทมเพลตลิงก์** แบบกำหนดเองในการตั้งค่าขั้นสูงของช่อง เพื่อสร้างลิงก์ที่คลิกได้ในบันทึกการแจ้งเตือน:

```
https://dashboard.example.com/orders/{{orderId}}
https://grafana.example.com/d/{{dashboardId}}
https://github.com/{{repo}}/actions/runs/{{runId}}
```

หากไม่ได้ตั้งเทมเพลตลิงก์ไว้ ระบบจะใช้ค่าของตัวแปร `externalLink` เป็นค่าเริ่มต้น วิธีนี้มีประโยชน์สำหรับการเข้าถึงแดชบอร์ด ล็อก หรือเอกสารที่เกี่ยวข้องได้อย่างรวดเร็วจากตัวการแจ้งเตือนโดยตรง

### การแสดงค่าที่คำนวณได้
เทมเพลตไม่สามารถแตกเงื่อนไขด้วยตรรกะ ternary (`? :`) ได้ และไม่มีตัวดำเนินการเชื่อมสตริง (`+`) ให้ใช้การแทรกค่าและผลของการเปรียบเทียบเข้าไปตรง ๆ แทน โดยใช้ข้อความคงที่เป็นป้ายกำกับ:

```
Online: {{isOnline}}
High severity: {{severity > 5}}
Errors detected: {{count}}
```

นิพจน์เปรียบเทียบจะแสดงผลเป็น `true` หรือ `false` หากต้องการส่งข้อความที่ต่างกันจริง ๆ ในแต่ละสถานการณ์ ให้กำหนดเส้นทางของทริกเกอร์ด้วย [เงื่อนไข](/docs/conditions) ของช่องแทนการแตกเงื่อนไขภายในเทมเพลตเดียว

### เงื่อนไขของช่อง
นอกจากการใช้เทมเพลตในเนื้อหาการแจ้งเตือนแล้ว คุณยังตั้ง **[เงื่อนไข](/docs/conditions)** ในการตั้งค่าขั้นสูงของช่องได้ เพื่อกำหนดว่าควรส่งการแจ้งเตือนหรือไม่ตั้งแต่แรก เงื่อนไขเหล่านี้ใช้ไวยากรณ์นิพจน์เดียวกัน (แต่ไม่ต้องใส่วงเล็บปีกกา)

ตัวอย่างเช่น หากต้องการส่งการแจ้งเตือนเฉพาะเมื่อจำนวนเงินมากกว่าค่าเกณฑ์:

```
amount > 100
status == "critical"
temperature > 30 && location == "datacenter"
```

วิธีนี้ช่วยป้องกันความล้าจากการแจ้งเตือน โดยกรองอีเวนต์ที่ไม่สำคัญออกไปก่อนที่จะส่งการแจ้งเตือน เรียนรู้เพิ่มเติมได้ใน [คู่มือเงื่อนไข](/docs/conditions) ของเรา

## เอกสารที่เกี่ยวข้อง

- **[การเชื่อมต่อ Webhook](/docs/webhook)** — เรียนรู้วิธีส่งตัวแปรผ่าน webhook
- **[ทริกเกอร์อีเมล](/docs/email-trigger)** — ตัวแปรที่ใช้ได้จากทริกเกอร์อีเมล
- **[เงื่อนไข](/docs/conditions)** — กรองการแจ้งเตือนด้วยนิพจน์แบบมีเงื่อนไข
- **[เริ่มต้นใช้งาน](/docs)** — ตั้งค่าช่องแรกของคุณพร้อมเทมเพลต

## การแก้ปัญหา

**เทมเพลตไม่แสดงค่าของตัวแปร:**
- ตรวจสอบว่าชื่อตัวแปรตรงกันทุกตัวอักษร (แยกตัวพิมพ์ใหญ่เล็ก)
- ตรวจสอบว่ามีการส่งตัวแปรมาในทริกเกอร์แบบ webhook/อีเมลจริง
- ลองทดสอบด้วยตัวแปรง่าย ๆ ก่อน แล้วค่อยเพิ่มความซับซ้อน

**ตัวแปรแสดงเป็นค่าว่าง:**
- ยืนยันว่าตัวแปรนั้นมีอยู่จริงในข้อมูลของทริกเกอร์
- ตรวจหาการพิมพ์ชื่อตัวแปรผิด
- ตรวจสอบโครงสร้าง JSON สำหรับพร็อพเพอร์ตีที่ซ้อนชั้น

**ข้อผิดพลาดของนิพจน์:**
- ตรวจสอบไวยากรณ์ด้วยนิพจน์ง่าย ๆ ก่อน
- ตรวจสอบว่ามีการเว้นวรรครอบตัวดำเนินการอย่างถูกต้อง
- ตรวจสอบว่าการเข้าถึงพร็อพเพอร์ตีใช้ไวยากรณ์ที่ถูกต้อง

ต้องการความช่วยเหลือ? เยี่ยมชม [ศูนย์ช่วยเหลือ](/docs/support) ของเรา หรือติดต่อ echobell@weelone.com

---

เทมเพลตเป็นวิธีอันทรงพลังในการสร้างการแจ้งเตือนที่เป็นไดนามิกและให้ข้อมูลครบถ้วน มอบข้อมูลที่ผู้ใช้ต้องการอย่างตรงจุดในเวลาที่ต้องการ เริ่มจากการแทนค่าตัวแปรง่าย ๆ แล้วค่อย ๆ เพิ่มนิพจน์และตรรกะแบบมีเงื่อนไขเข้าไป เพื่อสร้างระบบแจ้งเตือนที่ซับซ้อนขึ้น
