Let's Go قالب‌های HTML پویا › داده‌های پویای مشترک
قبلی · فهرست · بعدی
فصل ۵.۵

داده‌های پویای مشترک (Common Dynamic Data)

در برخی از برنامه‌های وب، ممکن است داده‌های پویای مشترک (Common Dynamic Data) وجود داشته باشد که می‌خواهید در بیش از یک صفحه وب - یا حتی در تمام صفحات - گنجانده شوند. به عنوان مثال، ممکن است بخواهید نام و تصویر پروفایل کاربر فعلی (Current User Profile) یا توکن CSRF (CSRF Token) را در تمام صفحات دارای فرم قرار دهید.

در مورد ما، بیایید با چیزی ساده شروع کنیم و بگوییم که می‌خواهیم سال جاری (Current Year) را در فوتر هر صفحه قرار دهیم.

برای این کار، ابتدا یک فیلد جدید CurrentYear به ساختار templateData اضافه می‌کنیم، مانند این:

File: cmd/web/templates.go
package main

...

// Add a CurrentYear field to the templateData struct.
type templateData struct {
    CurrentYear int
    Snippet     models.Snippet
    Snippets    []models.Snippet
}

...

گام بعدی اضافه کردن یک متد کمکی newTemplateData() به برنامه ما است که یک ساختار templateData مقداردهی شده با سال جاری را برمی‌گرداند.

من نشان می‌دهم:

File: cmd/web/helpers.go
package main

import (
    "bytes"
    "fmt"
    "net/http"
    "time" // New import
)

...

// Create an newTemplateData() helper, which returns a templateData struct 
// initialized with the current year. Note that we're not using the *http.Request 
// parameter here at the moment, but we will do later in the book.
func (app *application) newTemplateData(r *http.Request) templateData {
    return templateData{
        CurrentYear: time.Now().Year(),
    }
}

...

حالا بیایید هندلرهای home و snippetView را به‌روزرسانی کنیم تا از کمکی newTemplateData() استفاده کنند، مانند این:

File: cmd/web/handlers.go
package main

...

func (app *application) home(w http.ResponseWriter, r *http.Request) {
    w.Header().Add("Server", "Go")
    
    snippets, err := app.snippets.Latest()
    if err != nil {
        app.serverError(w, r, err)
        return
    }

    // Call the newTemplateData() helper to get a templateData struct containing
    // the 'default' data (which for now is just the current year), and add the
    // snippets slice to it.
    data := app.newTemplateData(r)
    data.Snippets = snippets

    // Pass the data to the render() helper as normal.
    app.render(w, r, http.StatusOK, "home.tmpl", data)
}

func (app *application) snippetView(w http.ResponseWriter, r *http.Request) {
    id, err := strconv.Atoi(r.PathValue("id"))
    if err != nil || id < 1 {
        http.NotFound(w, r)
        return
    }

    snippet, err := app.snippets.Get(id)
    if err != nil {
        if errors.Is(err, models.ErrNoRecord) {
            http.NotFound(w, r)
        } else {
            app.serverError(w, r, err)
        }
        return
    }

    // And do the same thing again here...
    data := app.newTemplateData(r)
    data.Snippet = snippet

    app.render(w, r, http.StatusOK, "view.tmpl", data)
}

...

و در نهایت، باید فایل ui/html/base.tmpl را به‌روزرسانی کنیم تا سال را در فوتر نمایش دهد، مانند این:

File: ui/html/base.tmpl
{{define "base"}}
<!doctype html>
<html lang='en'>
    <head>
        <meta charset='utf-8'>
        <title>{{template "title" .}} - Snippetbox</title>
        <link rel='stylesheet' href='/static/css/main.css'>
        <link rel='shortcut icon' href='/static/img/favicon.ico' type='image/x-icon'>
        <link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700'>
    </head>
    <body>
        <header>
            <h1><a href='/'>Snippetbox</a></h1>
        </header>
        {{template "nav" .}}
        <main>
            {{template "main" .}}
        </main>
        <footer>
            <!-- Update the footer to include the current year -->
            Powered by <a href='https://golang.org/'>Go</a> در {{.CurrentYear}}
        </footer>
        <script src='/static/js/main.js' type='text/javascript'></script>
    </body>
</html>
{{end}}

اگر برنامه را مجدداً راه‌اندازی کنید و به صفحه اصلی در http://localhost:4000 بروید، اکنون باید سال جاری را در فوتر مشاهده کنید. مانند این:

05.05-01.png

واژه‌نامه اصطلاحات فنی

اصطلاح فارسی معادل انگلیسی توضیح
داده‌های پویای مشترک Common Dynamic Data اطلاعاتی که در چندین صفحه استفاده می‌شوند
نام و تصویر پروفایل کاربر فعلی Current User Profile اطلاعات شناسایی کاربر در حال استفاده از سیستم
توکن CSRF CSRF Token کد امنیتی برای جلوگیری از حملات جعل درخواست
سال جاری Current Year سال فعلی که به صورت خودکار به‌روز می‌شود
ساختار داده قالب Template Data Structure ساختاری برای نگهداری داده‌های مورد نیاز قالب
میان‌افزار Middleware کدی که بین درخواست و پاسخ اجرا می‌شود
متغیر محیطی Environment Variable متغیری که در محیط اجرای برنامه تعریف می‌شود
فرمت‌بندی زمان Time Formatting نحوه نمایش تاریخ و زمان
مدیریت وضعیت State Management کنترل و نگهداری وضعیت برنامه
داده‌های سراسری Global Data اطلاعاتی که در کل برنامه قابل دسترس هستند