Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Laksanakan berbilang templat secara bersyarat

Laksanakan berbilang templat secara bersyarat

王林
王林ke hadapan
2024-02-09 11:48:09305semak imbas

Laksanakan berbilang templat secara bersyarat

editor php Yuzai memperkenalkan anda kepada teknologi berkuasa: melaksanakan berbilang templat secara bersyarat. Apabila membangunkan tapak web, kami selalunya perlu memuatkan fail templat yang berbeza secara dinamik berdasarkan keadaan yang berbeza Ini ialah senario aplikasi melaksanakan berbilang templat secara bersyarat. Dengan menggunakan teknologi ini, kami boleh memuatkan fail templat yang sepadan secara dinamik berdasarkan status log masuk pengguna, kebenaran dan syarat lain, dengan itu mencapai antara muka tapak web yang lebih fleksibel dan diperibadikan. Teknologi ini bukan sahaja meningkatkan kebolehskalaan dan kebolehselenggaraan tapak web, tetapi juga memberikan pengguna pengalaman pengguna yang lebih baik. Dalam artikel ini, kami akan memperkenalkan secara terperinci cara menggunakan PHP untuk melaksanakan berbilang templat secara bersyarat untuk membantu anda menerapkannya dengan lebih baik dalam projek sebenar.

Kandungan soalan

Saya mempunyai halaman web dengan dua paparan, satu untuk pengguna tanpa nama dan satu untuk pengguna pentadbir. Saya mahu menunjukkan bar navigasi hanya untuk pengguna pentadbir. Semua yang lain tetap sama untuk kedua-dua jenis pengguna.

Ini yang saya cuba setakat ini

main.go

package main

import (
    "log"
    "net/http"
    "text/template"

    "github.com/julienschmidt/httprouter"
)

func basicauth(h httprouter.handle, requireduser, requiredpassword string) httprouter.handle {
    return func(w http.responsewriter, r *http.request, ps httprouter.params) {
        // get the basic authentication credentials
        user, password, hasauth := r.basicauth()

        if hasauth && user == requireduser && password == requiredpassword {
            // delegate request to the given handle
            h(w, r, ps)
        } else {
            // request basic authentication otherwise
            w.header().set("www-authenticate", "basic realm=restricted")
            http.error(w, http.statustext(http.statusunauthorized), http.statusunauthorized)
        }
    }
}

func anonymous(w http.responsewriter, r *http.request, _ httprouter.params) {
    t, err := template.parsefiles("index.html")
    if err != nil {
        log.fatalln(err)
    }
    err = t.execute(w, map[string]string{"name": "anonymous"})
    if err != nil {
        log.fatalln(err)
    }
}

func admin(w http.responsewriter, r *http.request, _ httprouter.params) {
    t, err := template.parsefiles("index.html", "admin.html")
    if err != nil {
        log.fatalln(err)
    }
    err = t.execute(w, map[string]string{"name": "admin"})
    if err != nil {
        log.fatalln(err)
    }
}

func main() {
    user := "admin"
    pass := "1234"

    router := httprouter.new()
    router.get("/", anonymous)
    router.get("/admin/", basicauth(admin, user, pass))

    log.fatal(http.listenandserve(":8080", router))
}

index.html

<!doctype html>
<html lang="en">
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>{{ .name }}</title>
        <link href="https://cdn.jsdelivr.net/npm/[email&#160;protected]/dist/css/bootstrap.min.css" rel="stylesheet">
        <script src="https://cdn.jsdelivr.net/npm/[email&#160;protected]/dist/js/bootstrap.bundle.min.js"></script>
        <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
        <script>
            function counter() {
                document.getelementbyid("x").innerhtml = "x: " + document.queryselectorall('.x').length;
                document.getelementbyid("y").innerhtml = "y: " + document.queryselectorall('.y').length;
                document.getelementbyid("z").innerhtml = "z: " + document.queryselectorall('.z').length;
            }
        </script>
    </head>
    <body onload="counter()">
        {{ template "dashboard" }}
        <nav class="navbar fixed-bottom">
            <div class="container-fluid nav-justified">
                <span id="x" class="navbar-brand nav-item"></span>
                <span id="y" class="navbar-brand nav-item"></span>
                <span id="z" class="navbar-brand nav-item"></span>
            </div>
        </nav>
    </body>
</html>

admin.html

{{ define "dashboard" }}
<nav class="navbar">
    <div class="container-fluid nav-justified">
        <span class="nav-item">
            <a class="navbar-brand" href="/a">a</a>
        </span>
        <span class="nav-item">
            <a class="navbar-brand" href="/b">b</a>
        </span>
        <span class="nav-item">
            <a class="navbar-brand" href="/c">c</a>
        </span>
    </div>
</nav>
{{ end }}

Andaian saya ialah kerana saya tidak memasukkan templat admin.html semasa melaksanakan templat untuk pengguna tanpa nama, templat papan pemuka tidak akan dihuraikan. Walau bagaimanapun, saya mengalami ralat ini:

template: index.html:18:14: executing "index.html" at <{{template "dashboard"}}>: template "dashboard" not defined

Bagaimana untuk menyelesaikan masalah ini, atau adakah cara yang lebih baik?

Penyelesaian

Gunakan if 操作有条件地渲染 dashboard Templat:

{{ if eq .name "admin" }} {{ template "dashboard" }} {{ end }}

Amalan adalah untuk menghuraikan templat sekali sahaja dan bukannya menghuraikannya pada setiap permintaan:

package main

import (
    "log"
    "net/http"
    "sync"
    "text/template"

    "github.com/julienschmidt/httprouter"
)

func BasicAuth(h httprouter.Handle, requiredUser, requiredPassword string) httprouter.Handle {
    return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
        user, password, hasAuth := r.BasicAuth()

        if hasAuth && user == requiredUser && password == requiredPassword {
            h(w, r, ps)
        } else {
            w.Header().Set("WWW-Authenticate", "Basic realm=Restricted")
            http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
        }
    }
}

func Anonymous(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    err := tmpl.Execute(w, map[string]string{"Name": "Anonymous"})
    if err != nil {
        log.Fatalln(err)
    }
}

func Admin(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    err := tmpl.Execute(w, map[string]string{"Name": "Admin"})
    if err != nil {
        log.Fatalln(err)
    }
}

var (
    tmpl     *template.Template
    tmplOnce sync.Once
)

func main() {
    user := "admin"
    pass := "1234"

    tmplOnce.Do(func() {
        tmpl = template.Must(template.ParseFiles("index.html", "admin.html"))
    })

    router := httprouter.New()
    router.GET("/", Anonymous)
    router.GET("/admin/", BasicAuth(Admin, user, pass))

    log.Fatal(http.ListenAndServe(":8080", router))
}

Atas ialah kandungan terperinci Laksanakan berbilang templat secara bersyarat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam